Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 36 additions & 29 deletions src/main/java/webserver/HttpRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,44 +14,51 @@ public class HttpRequest {
private static final Logger log = LoggerFactory.getLogger(HttpRequest.class);

private String requestLine;
private Map<String, String> headers;
private BufferedReader br;
private String RequestBody;
private final Map<String, String> headers = new HashMap<>();
private Map<String, String> parameters;

public HttpRequest(InputStream in) {
try {
br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
requestLine = br.readLine();
String line = requestLine;
processHeaders(br);
processParameters(br);
} catch (IOException e) {
e.printStackTrace();
}
}

private void processHeaders(BufferedReader br) throws IOException {
String line = br.readLine();
while (!line.isEmpty()) {
log.debug("headers : {}", line);
line = br.readLine();
if (line == null) {
return;
}
headers = new HashMap<>();
while (!line.isEmpty()) {
log.info("headers : {}", line);
line = br.readLine();
if (line == null) {
break;
}
String[] headerTokens = line.split(": ");
if (headerTokens.length == 2) {
headers.put(headerTokens[0], headerTokens[1]);
}
}
if (headers.get("Content-Length") == null) {
String tokens = requestLine.split(" ")[1];
String queryString = tokens.substring(tokens.indexOf("?") + 1);
parameters = HttpRequestUtils.parseQueryString(queryString);
}
if (headers.get("Content-Length") != null) {
RequestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length")));
parameters = HttpRequestUtils.parseQueryString(RequestBody);
}
log.info("parameters : {}", parameters.toString());
} catch (IOException e) {
e.printStackTrace();
parseHeader(line);
}
}

private void parseHeader(String line) {
String[] headerTokens = line.split(": ");
if (headerTokens.length == 2) {
headers.put(headerTokens[0], headerTokens[1]);
}
}

private void processParameters(BufferedReader br) throws IOException {
String[] tokens = requestLine.split(" ");
String queryString = "";
String requestBody = "";
if (tokens[1].contains("?")) {
queryString = tokens[1].substring(tokens[1].indexOf("?") + 1);
}
if (headers.get("Content-Length") != null) {
requestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length")));
}
queryString = queryString + "&" + requestBody;
parameters = HttpRequestUtils.parseQueryString(queryString);
}

public HttpMethod getMethod() {
Expand Down
25 changes: 12 additions & 13 deletions src/main/java/webserver/HttpResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,16 @@

public class HttpResponse {
private static final Logger log = LoggerFactory.getLogger(HttpResponse.class);
private Map<String, String> headers = new HashMap<>();
private DataOutputStream dos;

private static final Map<String, String> EXTENSIONS = new HashMap<>();
private final Map<String, String> headers = new HashMap<>();
private final DataOutputStream dos;

static {
EXTENSIONS.put(".css", "text/css");
EXTENSIONS.put(".js", "application/javascript");
EXTENSIONS.put(".html", "text/html");
}

public HttpResponse(OutputStream out) {
this.dos = new DataOutputStream(out);
Expand All @@ -24,20 +32,11 @@ public void addHeader(String fieldName, String fieldValue) {

public void forward(String url) throws IOException {
byte[] body = Files.readAllBytes(new File("./webapp" + url).toPath());
if (url.endsWith(".css")) {
response200Header(body.length, "text/css");
} else if (url.endsWith(".js")) {
response200Header(body.length, "application/javascript");
} else {
response200Header(body.length, "text/html");
}
String extension = url.substring(url.lastIndexOf("."));
response200Header(body.length, EXTENSIONS.get(extension));
responseBody(body);
}

public void forwardBody(String string) {

}

public void response200Header(int lengthOfBodyContent, String contentType) {
try {
dos.writeBytes("HTTP/1.1 200 OK \r\n");
Expand Down
27 changes: 19 additions & 8 deletions src/test/java/webserver/HttpRequestTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,32 @@ public void request_GET() throws Exception {
InputStream in = new FileInputStream(testDirectory + "Http_GET.txt");
HttpRequest request = new HttpRequest(in);

assertThat("GET").isEqualTo(request.getMethod().name());
assertThat("/user/create").isEqualTo(request.getPath());
assertThat("keep-alive").isEqualTo(request.getHeader("Connection"));
assertThat("javajigi").isEqualTo(request.getParameter("userId"));
assertThat(request.getMethod().name()).isEqualTo("GET");
assertThat(request.getPath()).isEqualTo("/user/create");
assertThat(request.getHeader("Connection")).isEqualTo("keep-alive");
assertThat(request.getParameter("userId")).isEqualTo("javajigi");
}

@Test
public void request_POST() throws Exception {
InputStream in = new FileInputStream(testDirectory + "Http_POST.txt");
HttpRequest request = new HttpRequest(in);

assertThat("POST").isEqualTo(request.getMethod().name());
assertThat("/user/create").isEqualTo(request.getPath());
assertThat("keep-alive").isEqualTo(request.getHeader("Connection"));
assertThat("javajigi").isEqualTo(request.getParameter("userId"));
assertThat(request.getMethod().name()).isEqualTo("POST");
assertThat(request.getPath()).isEqualTo("/user/create");
assertThat(request.getHeader("Connection")).isEqualTo("keep-alive");
assertThat(request.getParameter("userId")).isEqualTo("javajigi");
}

@Test
public void request_POST2() throws Exception {
InputStream in = new FileInputStream(testDirectory + "Http_POST2.txt");
HttpRequest request = new HttpRequest(in);

assertThat(request.getMethod().name()).isEqualTo("POST");
assertThat(request.getPath()).isEqualTo("/user/create");
assertThat(request.getHeader("Connection")).isEqualTo("keep-alive");
assertThat(request.getParameter("id")).isEqualTo("1");
assertThat(request.getParameter("userId")).isEqualTo("javajigi");
}
}
8 changes: 4 additions & 4 deletions src/test/resources/Http_Forward.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: 7049
Content-Type:text/html;charset=utf-8
Content-Length: 6892

<!DOCTYPE html>
<html lang="kr">
Expand Down Expand Up @@ -44,7 +44,7 @@ Content-Length: 7049
<li><a href="https://facebook.com" target="_blank">Facebook</a></li>
</ul>
</li>
<li><a href="./user/list.html"><i class="glyphicon glyphicon-user"></i></a></li>
<li><a href="/list"><i class="glyphicon glyphicon-user"></i></a></li>
</ul>
</div>
</div>
Expand Down Expand Up @@ -149,4 +149,4 @@ Content-Length: 7049
<script src="js/bootstrap.min.js"></script>
<script src="js/scripts.js"></script>
</body>
</html>
</html>
8 changes: 8 additions & 0 deletions src/test/resources/Http_POST2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
POST /user/create?id=1 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 46
Content-Type: application/x-www-form-urlencoded
Accept: */*

userId=javajigi&password=password&name=JaeSung