Skip to content

Commit 5f95338

Browse files
authored
Merge pull request #8 from nathan29849/feature/#4/302_status_code
Feature/#4/302 status code
2 parents 38dec61 + cc26ea8 commit 5f95338

14 files changed

Lines changed: 369 additions & 208 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,3 +204,5 @@ Network Trash Folder
204204
Temporary Items
205205
.apdisk
206206

207+
src/main/java/controller/
208+
Lines changed: 15 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,24 @@
11
package handler;
22

3+
import controller.FrontController;
34
import http.request.HttpMethod;
4-
import http.request.RequestHeaders;
5+
import http.request.HttpRequest;
56
import http.request.RequestLine;
7+
import http.request.RequestMessageBody;
68
import http.request.RequestURI;
7-
import java.io.BufferedReader;
9+
import http.response.HttpResponse;
810
import java.io.DataOutputStream;
911
import java.io.File;
1012
import java.io.IOException;
1113
import java.io.InputStream;
12-
import java.io.InputStreamReader;
1314
import java.io.OutputStream;
1415
import java.net.Socket;
15-
import java.net.URLDecoder;
16-
import java.nio.charset.StandardCharsets;
1716
import java.nio.file.Files;
1817
import java.util.Map;
1918
import model.User;
2019
import org.slf4j.Logger;
2120
import org.slf4j.LoggerFactory;
2221
import util.HttpRequestUtils;
23-
import util.HttpRequestUtils.Pair;
24-
import util.IOUtils;
2522

2623
public class RequestHandler extends Thread {
2724
private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
@@ -37,68 +34,26 @@ public void run() {
3734
connection.getPort());
3835

3936
try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) {
40-
41-
InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); // 왜 안먹힐까?
42-
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
43-
StringBuilder sb = new StringBuilder();
44-
45-
String line = URLDecoder.decode(bufferedReader.readLine(), StandardCharsets.UTF_8); // 왜 한 번 더 해줘야 먹힐까? - 위에서 안먹히는 걸까?
46-
log.info("RequestLine = {}", line);
47-
if (line == null) {
48-
return;
49-
}
50-
RequestLine requestLine = HttpRequestUtils.parseRequestLine(line);
37+
HttpRequest httpRequest = HttpRequest.from(in);
38+
HttpResponse httpResponse = HttpResponse.ok();
39+
RequestLine requestLine = httpRequest.getRequestLine();
40+
log.info("RequestLine= {}", requestLine);
5141
RequestURI requestUri = requestLine.getRequestUri();
5242
String url = requestUri.getPath();
5343

54-
byte[] body = null;
55-
DataOutputStream dos = new DataOutputStream(out);
5644
if (requestLine.getHttpMethod().equals(HttpMethod.GET)) {
5745
if (url.equals("/index.html")) {
58-
body = Files.readAllBytes(new File("./webapp" + url).toPath());
46+
httpResponse = HttpResponse.ok("/index.html");
5947
}
6048
if (url.equals("/user/form.html")) {
61-
body = Files.readAllBytes(new File("./webapp" + url).toPath());
49+
httpResponse = HttpResponse.ok("/user/form.html");
6250
}
63-
if (url.equals("/user/create")) {
64-
String queryString = requestUri.getQueryString();
65-
log.debug("Decoded querystring = {}", queryString);
66-
Map<String, String> parsedQueryString = HttpRequestUtils.parseQueryString(queryString);
67-
User user = new User(
68-
parsedQueryString.get("userId"),
69-
parsedQueryString.get("password"),
70-
parsedQueryString.get("name"),
71-
parsedQueryString.get("email")
72-
);
73-
log.debug("Create User ! = {}", user);
74-
}
75-
}
76-
77-
if (body == null){
78-
body = "Hello World".getBytes();
79-
}
80-
response200Header(dos, body.length);
81-
responseBody(dos, body);
82-
83-
// HTTP Headers
84-
RequestHeaders requestHeaders = new RequestHeaders();
85-
while (!line.equals((""))) {
86-
line = URLDecoder.decode(bufferedReader.readLine(), StandardCharsets.UTF_8);
87-
Pair pair = HttpRequestUtils.parseHeader(line);
88-
requestHeaders.addHeader(pair);
89-
sb.append(line);
90-
sb.append("\r\n");
91-
log.debug("Header = {}", line);
9251
}
9352

94-
// HTTP Message Body (Content-Length 만큼 받아야 함)
9553
if (requestLine.getHttpMethod().equals(HttpMethod.POST)) {
96-
int contentLength = Integer.parseInt(requestHeaders.getHeader("Content-Length"));
97-
String messageBody = URLDecoder.decode(
98-
IOUtils.readData(bufferedReader, contentLength),
99-
StandardCharsets.UTF_8
100-
);
101-
log.debug("HTTP Message Body = {}", messageBody);
54+
RequestMessageBody requestMessageBody = httpRequest.getRequestMessageBody();
55+
String messageBody = requestMessageBody.getMessageBody();
56+
log.debug("HTTP Message Body = {}", messageBody );
10257

10358
Map<String, String> parsedMessageBody = HttpRequestUtils.parseQueryString(messageBody);
10459
if (url.equals("/user/create")) {
@@ -110,30 +65,12 @@ public void run() {
11065
);
11166
log.debug("Create User ! = {}", user);
11267
}
68+
httpResponse = HttpResponse.found("/index.html");
11369
}
70+
httpResponse.flush(out);
11471

11572
} catch (IOException e) {
11673
log.error(e.getMessage());
11774
}
11875
}
119-
120-
private void response200Header(DataOutputStream dos, int lengthOfBodyContent) {
121-
try {
122-
dos.writeBytes("HTTP/1.1 200 OK \r\n");
123-
dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n");
124-
dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n");
125-
dos.writeBytes("\r\n");
126-
} catch (IOException e) {
127-
log.error(e.getMessage());
128-
}
129-
}
130-
131-
private void responseBody(DataOutputStream dos, byte[] body) {
132-
try {
133-
dos.write(body, 0, body.length);
134-
dos.flush();
135-
} catch (IOException e) {
136-
log.error(e.getMessage());
137-
}
138-
}
13976
}

src/main/java/http/request/HttpVersion.java renamed to src/main/java/http/HttpVersion.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package http.request;
1+
package http;
22

33
public class HttpVersion {
44

src/main/java/http/request/HttpRequest.java

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,55 @@
11
package http.request;
22

3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
import java.io.InputStreamReader;
7+
import java.net.URLDecoder;
8+
import java.nio.charset.StandardCharsets;
9+
import util.HttpRequestUtils;
10+
import util.HttpRequestUtils.Pair;
11+
import util.IOUtils;
12+
313
public class HttpRequest {
414

515
private final RequestLine requestLine;
616
private final RequestHeaders requestHeaders;
717
private RequestMessageBody requestMessageBody;
818

9-
public HttpRequest(RequestLine requestLine, RequestHeaders requestHeaders) {
19+
private HttpRequest(RequestLine requestLine, RequestHeaders requestHeaders) {
1020
this.requestLine = requestLine;
1121
this.requestHeaders = requestHeaders;
1222
}
1323

14-
public HttpRequest(RequestLine requestLine, RequestHeaders requestHeaders, RequestMessageBody requestMessageBody) {
24+
private HttpRequest(RequestLine requestLine, RequestHeaders requestHeaders, RequestMessageBody requestMessageBody) {
1525
this(requestLine, requestHeaders);
1626
this.requestMessageBody = requestMessageBody;
1727
}
1828

29+
public static HttpRequest from(InputStream in) throws IOException {
30+
InputStreamReader inputStreamReader = new InputStreamReader(in, StandardCharsets.UTF_8); // 왜 안먹힐까?
31+
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
32+
String line = URLDecoder.decode(bufferedReader.readLine(), StandardCharsets.UTF_8); // 왜 한 번 더 해줘야 먹힐까? - 위에서 안먹히는 걸까?
33+
34+
RequestLine requestLine = HttpRequestUtils.parseRequestLine(line);
35+
RequestHeaders requestHeaders = new RequestHeaders();
36+
while (!line.equals((""))) {
37+
line = URLDecoder.decode(bufferedReader.readLine(), StandardCharsets.UTF_8);
38+
Pair pair = HttpRequestUtils.parseHeader(line);
39+
requestHeaders.addHeader(pair);
40+
}
41+
if (requestHeaders.containsKey("Content-Length")) {
42+
int contentLength = Integer.parseInt(requestHeaders.getHeader("Content-Length"));
43+
String messageBody = URLDecoder.decode(
44+
IOUtils.readData(bufferedReader, contentLength),
45+
StandardCharsets.UTF_8
46+
);
47+
RequestMessageBody requestMessageBody = new RequestMessageBody(messageBody);
48+
return new HttpRequest(requestLine, requestHeaders, requestMessageBody);
49+
}
50+
return new HttpRequest(requestLine, requestHeaders);
51+
}
52+
1953
public RequestLine getRequestLine() {
2054
return requestLine;
2155
}

src/main/java/http/request/RequestHeaders.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,8 @@ public void addHeader(Pair pair) {
1818
public String getHeader(String key) {
1919
return headers.get(key);
2020
}
21+
22+
public boolean containsKey(String key) {
23+
return headers.containsKey(key);
24+
}
2125
}

src/main/java/http/request/RequestLine.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package http.request;
22

3+
import http.HttpVersion;
4+
35
public class RequestLine {
46

57
private final HttpMethod httpMethod;
@@ -30,4 +32,11 @@ public RequestURI getRequestUri() {
3032
public HttpVersion getHttpVersion() {
3133
return httpVersion;
3234
}
35+
36+
@Override
37+
public String toString() {
38+
return httpMethod.toString() + " "
39+
+ requestUri.toString() + " "
40+
+ httpVersion.getVersion();
41+
}
3342
}

src/main/java/http/request/RequestURI.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,12 @@ public String getPath() {
2929
public String getQueryString() {
3030
return queryString;
3131
}
32+
33+
@Override
34+
public String toString() {
35+
if (queryString != null) {
36+
return path + queryString;
37+
}
38+
return path;
39+
}
3240
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package http.response;
2+
3+
import http.HttpVersion;
4+
import java.io.DataOutputStream;
5+
import java.io.File;
6+
import java.io.IOException;
7+
import java.io.OutputStream;
8+
import java.nio.charset.StandardCharsets;
9+
import java.nio.file.Files;
10+
11+
public class HttpResponse {
12+
13+
private final StatusLine statusLine;
14+
private final ResponseHeaders responseHeaders;
15+
private ResponseMessageBody responseMessageBody;
16+
17+
public HttpResponse(StatusLine statusLine, ResponseHeaders responseHeaders) {
18+
this.statusLine = statusLine;
19+
this.responseHeaders = responseHeaders;
20+
}
21+
22+
public HttpResponse(StatusLine statusLine, ResponseHeaders responseHeaders, ResponseMessageBody responseMessageBody) {
23+
this(statusLine, responseHeaders);
24+
this.responseMessageBody = responseMessageBody;
25+
}
26+
27+
public static HttpResponse ok() {
28+
StatusLine statusLine = new StatusLine(new HttpVersion("HTTP/1.1"), HttpResponseStatus.OK);
29+
byte[] messageBody = "Hello World".getBytes(StandardCharsets.UTF_8);
30+
ResponseHeaders responseHeaders = new ResponseHeaders();
31+
responseHeaders.setContentType("text/plain;charset=utf-8");
32+
responseHeaders.setContentLength(messageBody.length);
33+
ResponseMessageBody responseMessageBody = new ResponseMessageBody(messageBody);
34+
return new HttpResponse(statusLine, responseHeaders, responseMessageBody);
35+
}
36+
37+
public static HttpResponse ok(String viewName) throws IOException {
38+
byte[] messageBody = Files.readAllBytes(new File("./webapp" + viewName).toPath());
39+
StatusLine statusLine = new StatusLine(new HttpVersion("HTTP/1.1"), HttpResponseStatus.OK);
40+
ResponseHeaders responseHeaders = new ResponseHeaders();
41+
responseHeaders.setContentType("text/html;charset=utf-8");
42+
responseHeaders.setContentLength(messageBody.length);
43+
ResponseMessageBody responseMessageBody = new ResponseMessageBody(messageBody);
44+
return new HttpResponse(statusLine, responseHeaders, responseMessageBody);
45+
}
46+
47+
public static HttpResponse found(String redirectURI) {
48+
StatusLine statusLine = new StatusLine(new HttpVersion("HTTP/1.1"), HttpResponseStatus.FOUND);
49+
ResponseHeaders responseHeaders = new ResponseHeaders();
50+
responseHeaders.setContentType("text/html;charset=utf-8");
51+
responseHeaders.setLocation(redirectURI);
52+
return new HttpResponse(statusLine, responseHeaders);
53+
}
54+
55+
public void flush(OutputStream out) throws IOException {
56+
DataOutputStream dos = new DataOutputStream(out);
57+
dos.writeBytes(statusLine.toString() + " \r\n");
58+
dos.writeBytes(responseHeaders.toString());
59+
dos.writeBytes("\r\n");
60+
if (responseMessageBody != null) {
61+
byte[] messageBody = responseMessageBody.getMessageBody();
62+
dos.write(messageBody, 0, messageBody.length);
63+
}
64+
dos.flush();
65+
}
66+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package http.response;
2+
3+
public enum HttpResponseStatus {
4+
OK(200, "OK"),
5+
CREATED(201, "Created"),
6+
FOUND(302, "Found"),
7+
NOT_FOUND(404, "Not Found");
8+
9+
final int code;
10+
final String message;
11+
12+
HttpResponseStatus(int code, String message) {
13+
this.code = code;
14+
this.message = message;
15+
}
16+
17+
@Override
18+
public String toString() {
19+
return this.code + " " + this.message;
20+
}
21+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package http.response;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class ResponseHeaders {
7+
8+
private final Map<String, String> headers = new HashMap<>();
9+
10+
public void addHeader(String key, String value) {
11+
headers.put(key, value);
12+
}
13+
14+
public String getHeader(String key) {
15+
return headers.get(key);
16+
}
17+
18+
public void setContentType(String contentType) {
19+
headers.put("Content-Type", contentType);
20+
}
21+
22+
public void setContentLength(int lengthOfBodyContent) {
23+
headers.put("Content-Length", String.valueOf(lengthOfBodyContent));
24+
}
25+
26+
public void setLocation(String redirectURI) {
27+
headers.put("Location", redirectURI);
28+
}
29+
30+
@Override
31+
public String toString() {
32+
StringBuilder sb = new StringBuilder();
33+
headers.forEach((k, v)-> sb.append(k).append(": ").append(v).append("\r\n"));
34+
return sb.toString();
35+
}
36+
37+
}

0 commit comments

Comments
 (0)