From f6acd4dd1fb35c4d1a3dda5a3efd455961f77666 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Wed, 6 Sep 2023 21:09:22 +0900 Subject: [PATCH 01/29] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=A7=A4=EC=A7=81=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/request/QueryString.java | 16 ++++++++-------- .../apache/coyote/http11/request/RequestURI.java | 13 +++++-------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/QueryString.java b/tomcat/src/main/java/org/apache/coyote/http11/request/QueryString.java index b2cbdb3785..a2e1b2a81c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/QueryString.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/QueryString.java @@ -6,7 +6,7 @@ public class QueryString { private static final String INIT_SIGN = "?"; private static final String NEXT_SIGN = "&"; - private static final String KEY_VALUE_SIGN = "="; + private static final String KEY_VALUE_DELIMITER = "="; private static final int KEY_INDEX = 0; private static final int VALUE_INDEX = 1; @@ -17,24 +17,24 @@ private QueryString(Map values) { } public static QueryString from(String uri) { - Map queryStrings = new HashMap<>(); + Map value = new HashMap<>(); int index = uri.indexOf(INIT_SIGN); if (index != -1) { String[] queryString = uri.substring(index + 1).split(NEXT_SIGN); - readQueryString(queryString, queryStrings); + readQueryString(queryString, value); } - return new QueryString(queryStrings); + return new QueryString(value); } - private static void readQueryString(String[] queryString, Map queryStrings) { + private static void readQueryString(String[] queryString, Map value) { for (String element : queryString) { - String[] keyAndValue = element.split(KEY_VALUE_SIGN); - queryStrings.put(keyAndValue[KEY_INDEX], keyAndValue[VALUE_INDEX]); + String[] keyAndValue = element.split(KEY_VALUE_DELIMITER); + value.put(keyAndValue[KEY_INDEX], keyAndValue[VALUE_INDEX]); } } public String getValueOf(String key) { - return values.get(key); + return values.getOrDefault(key, ""); } public Map getValues() { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java index 993fc4fc1d..4587dcc697 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java @@ -1,7 +1,8 @@ package org.apache.coyote.http11.request; public class RequestURI { - + private static final String QUERY_STRING_INIT_SIGN = "?"; + private static final String EXTENSION_INIT_SIGN = "."; private static final String STATIC_PATH = "static"; private static final String HTML_EXTENSION = ".html"; @@ -9,11 +10,7 @@ public class RequestURI { private final String resourcePath; private final QueryString queryString; - private RequestURI( - String uri, - String resourcePath, - QueryString queryString - ) { + private RequestURI(String uri, String resourcePath, QueryString queryString) { this.uri = uri; this.resourcePath = resourcePath; this.queryString = queryString; @@ -24,11 +21,11 @@ public static RequestURI from(String uri) { } private static String parseResourcePath(String uri) { - int index = uri.indexOf("?"); + int index = uri.indexOf(QUERY_STRING_INIT_SIGN); if (index != -1) { return STATIC_PATH + uri.substring(0, index) + HTML_EXTENSION; } - if (!uri.contains(".")) { + if (!uri.contains(EXTENSION_INIT_SIGN)) { return STATIC_PATH + uri + HTML_EXTENSION; } return STATIC_PATH + uri; From 1fa94951cf2bb053558a4c4c05cc0d469588fc19 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Wed, 6 Sep 2023 21:29:04 +0900 Subject: [PATCH 02/29] =?UTF-8?q?refactor:=20RequestLine=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/request/HttpRequest.java | 39 ++++++++---------- .../coyote/http11/request/RequestBody.java | 10 +++-- .../coyote/http11/request/RequestLine.java | 40 +++++++++++++++++++ 3 files changed, 63 insertions(+), 26 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index 848d562187..50629083af 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -5,39 +5,32 @@ import java.util.Map; public class HttpRequest { - + private static final int REQUEST_LINE_INDEX = 0; private static final int KEY_INDEX = 0; private static final int VALUE_INDEX = 1; + private static final String HEADER_DELIMITER = ": "; private static final String CONTENT_TYPE_KEY = "Accept"; - private final RequestURI requestURI; - private final HttpMethod httpMethod; + private final RequestLine requestLine; private final Map headers; private final RequestBody requestBody; - private HttpRequest( - RequestURI requestURI, - HttpMethod httpMethod, - Map headers, - RequestBody requestBody - ) { - this.requestURI = requestURI; - this.httpMethod = httpMethod; + private HttpRequest(RequestLine requestLine, Map headers, RequestBody requestBody) { + this.requestLine = requestLine; this.headers = headers; this.requestBody = requestBody; } public static HttpRequest of(List requestHeader, RequestBody requestBody) { - String uri = requestHeader.get(0).split(" ")[1]; - String method = requestHeader.get(0).split(" ")[0]; Map headers = parseHeaders(requestHeader); - return new HttpRequest(RequestURI.from(uri), HttpMethod.from(method), headers, requestBody); + RequestLine requestLine = RequestLine.from(requestHeader.get(REQUEST_LINE_INDEX)); + return new HttpRequest(requestLine, headers, requestBody); } private static Map parseHeaders(List request) { Map headers = new HashMap<>(); for (String header : request.subList(1, request.size())) { - String[] keyAndValue = header.split(": ", 2); + String[] keyAndValue = header.split(HEADER_DELIMITER, 2); headers.put(keyAndValue[KEY_INDEX], keyAndValue[VALUE_INDEX]); } return headers; @@ -54,20 +47,20 @@ public boolean isRequestBodyEmpty() { return requestBody.isEmpty(); } - public RequestURI getRequestUrl() { - return requestURI; + public String getHeaderValue(String key) { + return headers.getOrDefault(key, ""); } - public RequestBody getRequestBody() { - return requestBody; + public RequestLine getRequestLine() { + return requestLine; } - public String getHeaderValue(String key) { - return headers.getOrDefault(key, ""); + public Map getHeaders() { + return headers; } - public HttpMethod getHttpMethod() { - return httpMethod; + public RequestBody getRequestBody() { + return requestBody; } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java index dfcd40af67..e5efb0af85 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java @@ -4,6 +4,10 @@ import java.util.Map; public class RequestBody { + private static final int KEY_INDEX = 0; + private static final int VALUE_INDEX = 1; + private static final String NEXT_SIGN = "&"; + private static final String KEY_VALUE_DELIMITER = "="; private final Map values; @@ -20,10 +24,10 @@ public static RequestBody from(String body) { return new RequestBody(); } HashMap values = new HashMap<>(); - String[] keyAndValue = body.split("&"); + String[] keyAndValue = body.split(NEXT_SIGN); for (String element : keyAndValue) { - String[] split = element.split("="); - values.put(split[0], split[1]); + String[] split = element.split(KEY_VALUE_DELIMITER); + values.put(split[KEY_INDEX], split[VALUE_INDEX]); } return new RequestBody(values); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java new file mode 100644 index 0000000000..4ca1eebc18 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java @@ -0,0 +1,40 @@ +package org.apache.coyote.http11.request; + +public class RequestLine { + private static final int METHOD_INDEX = 0; + private static final int URI_INDEX = 1; + private static final int HTTP_VERSION_INDEX = 2; + private static final String DELIMITER = " "; + + private final HttpMethod httpMethod; + private final RequestURI requestURI; + private final String version; + + private RequestLine(HttpMethod httpMethod, RequestURI requestURI, String version) { + this.httpMethod = httpMethod; + this.requestURI = requestURI; + this.version = version; + } + + public static RequestLine from(String request) { + String[] elements = request.split(DELIMITER); + return new RequestLine( + HttpMethod.from(elements[METHOD_INDEX]), + RequestURI.from(elements[URI_INDEX]), + elements[HTTP_VERSION_INDEX] + ); + } + + public HttpMethod getHttpMethod() { + return httpMethod; + } + + public RequestURI getRequestURI() { + return requestURI; + } + + public String getVersion() { + return version; + } + +} From 1f7285a9b7eaf8afb13736604ac15b2d251296ef Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Wed, 6 Sep 2023 21:31:52 +0900 Subject: [PATCH 03/29] =?UTF-8?q?refactor:=20RequestLine=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tomcat/src/main/java/nextstep/jwp/Handler.java | 10 ++++++---- .../org/apache/coyote/http11/request/HttpRequest.java | 4 ++++ .../org/apache/coyote/http11/request/RequestLine.java | 4 ++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tomcat/src/main/java/nextstep/jwp/Handler.java b/tomcat/src/main/java/nextstep/jwp/Handler.java index 1b9d9c475f..6bdf67ffb0 100644 --- a/tomcat/src/main/java/nextstep/jwp/Handler.java +++ b/tomcat/src/main/java/nextstep/jwp/Handler.java @@ -11,7 +11,6 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.cookie.HttpCookie; -import org.apache.coyote.http11.request.HttpMethod; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.RequestURI; @@ -22,6 +21,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.coyote.http11.request.HttpMethod.GET; +import static org.apache.coyote.http11.request.HttpMethod.POST; + public class Handler { private static final Logger log = LoggerFactory.getLogger(Handler.class); @@ -31,15 +33,15 @@ private Handler() { } public static HttpResponse run(HttpRequest httpRequest) throws IOException { - RequestURI requestURI = httpRequest.getRequestUrl(); - if (requestURI.isLoginPage() && httpRequest.getHttpMethod().isEqualTo(HttpMethod.GET)) { + RequestURI requestURI = httpRequest.getRequestLine().getRequestURI(); + if (requestURI.isLoginPage() && httpRequest.isMethod(GET)) { return HttpResponse.builder() .httpStatus(HttpStatus.OK) .responseBody(parseResponseBody(requestURI.getResourcePath())) .contentType(httpRequest.contentType()) .build(); } - if (requestURI.isLoginPage() && httpRequest.getHttpMethod().isEqualTo(HttpMethod.POST)) { + if (requestURI.isLoginPage() && httpRequest.isMethod(POST)) { return doLogin(httpRequest); } if (requestURI.isHome()) { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index 50629083af..1c81160717 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -51,6 +51,10 @@ public String getHeaderValue(String key) { return headers.getOrDefault(key, ""); } + public boolean isMethod(HttpMethod httpMethod) { + return requestLine.isMethod(httpMethod); + } + public RequestLine getRequestLine() { return requestLine; } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java index 4ca1eebc18..ab1352fbe6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java @@ -25,6 +25,10 @@ public static RequestLine from(String request) { ); } + public boolean isMethod(HttpMethod httpMethod) { + return httpMethod.isEqualTo(httpMethod); + } + public HttpMethod getHttpMethod() { return httpMethod; } From 33308d65caf411824cabf32ea828ef1ff8ab5e81 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Thu, 7 Sep 2023 15:13:00 +0900 Subject: [PATCH 04/29] =?UTF-8?q?refactor:=20Headers=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/coyote/http11/Headers.java | 31 +++++++++ .../coyote/http11/cookie/HttpCookie.java | 4 +- .../coyote/http11/request/HttpMethod.java | 2 +- .../coyote/http11/request/HttpRequest.java | 36 +++-------- .../coyote/http11/request/RequestLine.java | 2 +- .../apache/coyote/http11/HttpRequestTest.java | 63 ++++++++++--------- 6 files changed, 76 insertions(+), 62 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/Headers.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java new file mode 100644 index 0000000000..0b8cdb75e2 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java @@ -0,0 +1,31 @@ +package org.apache.coyote.http11; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Headers { + private static final int KEY_INDEX = 0; + private static final int VALUE_INDEX = 1; + private static final String HEADER_DELIMITER = ": "; + + private final Map values = new HashMap<>(); + + private Headers(Map headers) { + this.values.putAll(headers); + } + + public static Headers from(List headers) { + Map values = new HashMap<>(); + for (String header : headers) { + String[] keyAndValue = header.split(HEADER_DELIMITER); + values.put(keyAndValue[KEY_INDEX], keyAndValue[VALUE_INDEX]); + } + return new Headers(values); + } + + public String getValue(String key) { + return values.getOrDefault(key, ""); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java b/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java index a69455020e..dbf006bcfe 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java @@ -4,9 +4,9 @@ import java.util.Map; public class HttpCookie { - private static final String COOKIE_SEPARATOR = "; "; private static final String KEY_VALUE_SEPARATOR = "="; + public static final String JSESSIONID_KEY = "JSESSIONID"; private static final int KEY_INDEX = 0; private static final int VALUE_INDEX = 1; private static final HttpCookie EMPTY = new HttpCookie(); @@ -34,7 +34,7 @@ public static HttpCookie from(String cookies) { public static HttpCookie jSessionId(String id) { Map values = new HashMap<>(); - values.put("JSESSIONID", id); + values.put(JSESSIONID_KEY, id); return new HttpCookie(values); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java index f3622d2733..a28aab877e 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java @@ -15,7 +15,7 @@ public static HttpMethod from(String methodName) { .orElse(GET); } - public boolean isEqualTo(HttpMethod other) { + public boolean is(HttpMethod other) { return this == other; } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index 1c81160717..e2f6e33eb8 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -1,54 +1,36 @@ package org.apache.coyote.http11.request; -import java.util.HashMap; import java.util.List; -import java.util.Map; + +import org.apache.coyote.http11.Headers; public class HttpRequest { private static final int REQUEST_LINE_INDEX = 0; - private static final int KEY_INDEX = 0; - private static final int VALUE_INDEX = 1; - private static final String HEADER_DELIMITER = ": "; - private static final String CONTENT_TYPE_KEY = "Accept"; + private static final int HEADER_INDEX = 1; private final RequestLine requestLine; - private final Map headers; + private final Headers headers; private final RequestBody requestBody; - private HttpRequest(RequestLine requestLine, Map headers, RequestBody requestBody) { + private HttpRequest(RequestLine requestLine, Headers headers, RequestBody requestBody) { this.requestLine = requestLine; this.headers = headers; this.requestBody = requestBody; } public static HttpRequest of(List requestHeader, RequestBody requestBody) { - Map headers = parseHeaders(requestHeader); RequestLine requestLine = RequestLine.from(requestHeader.get(REQUEST_LINE_INDEX)); + List requests = requestHeader.subList(HEADER_INDEX, requestHeader.size()); + Headers headers = Headers.from(requests); return new HttpRequest(requestLine, headers, requestBody); } - private static Map parseHeaders(List request) { - Map headers = new HashMap<>(); - for (String header : request.subList(1, request.size())) { - String[] keyAndValue = header.split(HEADER_DELIMITER, 2); - headers.put(keyAndValue[KEY_INDEX], keyAndValue[VALUE_INDEX]); - } - return headers; - } - - public ContentType contentType() { - if (!headers.containsKey(CONTENT_TYPE_KEY)) { - return ContentType.HTML; - } - return ContentType.from(headers.get(CONTENT_TYPE_KEY)); - } - public boolean isRequestBodyEmpty() { return requestBody.isEmpty(); } public String getHeaderValue(String key) { - return headers.getOrDefault(key, ""); + return headers.getValue(key); } public boolean isMethod(HttpMethod httpMethod) { @@ -59,7 +41,7 @@ public RequestLine getRequestLine() { return requestLine; } - public Map getHeaders() { + public Headers getHeaders() { return headers; } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java index ab1352fbe6..c7b09c16b2 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java @@ -26,7 +26,7 @@ public static RequestLine from(String request) { } public boolean isMethod(HttpMethod httpMethod) { - return httpMethod.isEqualTo(httpMethod); + return httpMethod.is(httpMethod); } public HttpMethod getHttpMethod() { diff --git a/tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java b/tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java index ad311fd6c7..d57b968ead 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java @@ -6,6 +6,7 @@ import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; @@ -14,36 +15,36 @@ @SuppressWarnings("NonAsciiCharacters") class HttpRequestTest { - @Test - void Accept_key가_없으면_ConentType은_html이다() { - // given - List request = List.of( - "GET /login.html HTTP/1.1", - "Host: localhost:8080/login?username=gugu&password=password", - "Connection: keep-alive"); - RequestBody requestBody = new RequestBody(); - - // when - HttpRequest httpRequest = HttpRequest.of(request, requestBody); - - // then - Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.HTML); - } - - @Test - void ContentType을_찾을_수_있다() { - // given - List request = List.of( - "GET /zipgo.js HTTP/1.1", - "Host: zipgo.pet/", - "Accept: text/javascript,*/*;q=0.1", - "Connection: keep-alive"); - - // when - HttpRequest httpRequest = HttpRequest.of(request, new RequestBody()); - - // then - Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.JAVASCRIPT); - } +// @Test +// void Accept_key가_없으면_ConentType은_html이다() { +// // given +// List request = List.of( +// "GET /login.html HTTP/1.1", +// "Host: localhost:8080/login?username=gugu&password=password", +// "Connection: keep-alive"); +// RequestBody requestBody = new RequestBody(); +// +// // when +// HttpRequest httpRequest = HttpRequest.of(request, requestBody); +// +// // then +// Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.HTML); +// } + +// @Test +// void ContentType을_찾을_수_있다() { +// // given +// List request = List.of( +// "GET /zipgo.js HTTP/1.1", +// "Host: zipgo.pet/", +// "Accept: text/javascript,*/*;q=0.1", +// "Connection: keep-alive"); +// +// // when +// HttpRequest httpRequest = HttpRequest.of(request, new RequestBody()); +// +// // then +// Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.JAVASCRIPT); +// } } \ No newline at end of file From d21d069f03f16d349b0d662c0866acde41b76d56 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Thu, 7 Sep 2023 17:18:17 +0900 Subject: [PATCH 05/29] =?UTF-8?q?refactor:=20=EC=9E=90=EB=A3=8C=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=EC=A0=90=EC=9D=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/apache/coyote/http11/Headers.java | 4 ++-- .../java/org/apache/coyote/http11/cookie/HttpCookie.java | 8 ++++---- .../org/apache/coyote/http11/request/RequestBody.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java index 0b8cdb75e2..425099d587 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java @@ -9,10 +9,10 @@ public class Headers { private static final int VALUE_INDEX = 1; private static final String HEADER_DELIMITER = ": "; - private final Map values = new HashMap<>(); + private final Map values; private Headers(Map headers) { - this.values.putAll(headers); + this.values = headers; } public static Headers from(List headers) { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java b/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java index dbf006bcfe..3222574fc7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java @@ -9,20 +9,20 @@ public class HttpCookie { public static final String JSESSIONID_KEY = "JSESSIONID"; private static final int KEY_INDEX = 0; private static final int VALUE_INDEX = 1; - private static final HttpCookie EMPTY = new HttpCookie(); - private final Map values = new HashMap<>(); + private final Map values; private HttpCookie() { + this(new HashMap<>()); } private HttpCookie(Map values) { - this.values.putAll(values); + this.values = values; } public static HttpCookie from(String cookies) { if (cookies.isBlank()) { - return EMPTY; + return new HttpCookie(); } Map values = new HashMap<>(); for (String cookie : cookies.split(COOKIE_SEPARATOR)) { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java index e5efb0af85..707e561dc8 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java @@ -11,7 +11,7 @@ public class RequestBody { private final Map values; - public RequestBody() { + private RequestBody() { this(new HashMap<>()); } From 907c901eb373bd6b897fcdb24ae6305ca4f1a5a1 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Fri, 8 Sep 2023 10:04:13 +0900 Subject: [PATCH 06/29] =?UTF-8?q?refactor:=20Response=EC=9D=98=20=EC=B2=AB?= =?UTF-8?q?=EB=B2=88=EC=A7=B8=20=EB=9D=BC=EC=9D=B8=EC=9D=B8=20StatusLine?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/response/HttpResponse.java | 21 +++++++------ .../coyote/http11/response/HttpStatus.java | 13 +++++++- .../coyote/http11/response/StatusLine.java | 31 +++++++++++++++++++ 3 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java index a2ee717f31..999da3abc0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java @@ -4,24 +4,23 @@ import org.apache.coyote.http11.request.ContentType; public class HttpResponse { - private static final String ENTER = "\r\n"; private static final String KEY_VALUE_DELIMITER = "="; - private final HttpStatus httpStatus; + private final StatusLine statusLine; private final String responseBody; private final ContentType contentType; private final String redirectPage; private final HttpCookie httpCookie; private HttpResponse( - HttpStatus httpStatus, + StatusLine statusLine, String responseBody, ContentType contentType, String redirectPage, HttpCookie httpCookie ) { - this.httpStatus = httpStatus; + this.statusLine = statusLine; this.responseBody = responseBody; this.contentType = contentType; this.redirectPage = redirectPage; @@ -29,12 +28,14 @@ private HttpResponse( } public String getResponse() { - String statusLine = "HTTP/1.1 " + httpStatus.getStatusCode() + " " + httpStatus.name() + " "; + HttpStatus httpStatus = statusLine.getHttpStatus(); + String statusLineResponse = String.format("&s &d &s", statusLine, httpStatus.getStatusCode(), httpStatus.getMessage()); + String contentTypeHeader = "Content-Type: " + contentType.getValue() + ";charset=utf-8 "; String contentLengthHeader = "Content-Length: " + responseBody.getBytes().length + " "; StringBuilder response = new StringBuilder(); - response.append(statusLine).append(ENTER) + response.append(statusLineResponse).append(ENTER) .append(contentTypeHeader).append(ENTER) .append(contentLengthHeader).append(ENTER); @@ -53,14 +54,14 @@ public String getResponse() { public static class Builder { - private HttpStatus httpStatus; + private StatusLine statusLine; private String responseBody; private ContentType contentType; private String redirectPage; private HttpCookie httpCookie; - public Builder httpStatus(HttpStatus httpStatus) { - this.httpStatus = httpStatus; + public Builder statusLine(StatusLine statusLine) { + this.statusLine = statusLine; return this; } @@ -85,7 +86,7 @@ public Builder httpCookie(HttpCookie httpCookie) { } public HttpResponse build() { - return new HttpResponse(httpStatus, responseBody, contentType, redirectPage, httpCookie); + return new HttpResponse(statusLine, responseBody, contentType, redirectPage, httpCookie); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpStatus.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpStatus.java index 4bbfa59c01..113317c4c9 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpStatus.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpStatus.java @@ -1,13 +1,15 @@ package org.apache.coyote.http11.response; +import java.util.Arrays; + public enum HttpStatus { OK(200, "OK"), + CREATED(201, "Created"), FOUND(302, "Found"), UNAUTHORIZED(401, "Unauthorized"), NOT_FOUND(404, "Not Found"), INTERNAL_SERVER_ERROR(500, "Internal Server Error"), - CREATED(201, "Created"), ; private final int statusCode; @@ -18,6 +20,14 @@ public enum HttpStatus { this.message = message; } + public static HttpStatus from(String code) { + int statusCode = Integer.parseInt(code); + return Arrays.stream(values()) + .filter(it -> it.statusCode == statusCode) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } + public int getStatusCode() { return statusCode; } @@ -25,4 +35,5 @@ public int getStatusCode() { public String getMessage() { return message; } + } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java new file mode 100644 index 0000000000..8126c9d468 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java @@ -0,0 +1,31 @@ +package org.apache.coyote.http11.response; + +public class StatusLine { + private static final String DELIMITER = " "; + private static final int PROTOCOL_VERSION_INDEX = 0; + private static final int STATUS_CODE_INDEX = 1; + + private final String protocolVersion; + private final HttpStatus httpStatus; + + private StatusLine(String protocolVersion, HttpStatus httpStatus) { + this.protocolVersion = protocolVersion; + this.httpStatus = httpStatus; + } + + public static StatusLine from(String responseLine) { + String[] elements = responseLine.split(DELIMITER); + String protocol = elements[PROTOCOL_VERSION_INDEX]; + String statusCode = elements[STATUS_CODE_INDEX]; + return new StatusLine(protocol, HttpStatus.from(statusCode)); + } + + public String getProtocolVersion() { + return protocolVersion; + } + + public HttpStatus getHttpStatus() { + return httpStatus; + } + +} From 4733ff1bea7044c09ca0c8fe14485f96a987d0cf Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 02:45:36 +0900 Subject: [PATCH 07/29] =?UTF-8?q?refactor:=20HttpResponse=20=EB=82=B4=20He?= =?UTF-8?q?aders=20=EA=B0=9D=EC=B2=B4=20=EC=82=BD=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/nextstep/jwp/Handler.java | 76 ++++++++++------ .../org/apache/coyote/http11/Headers.java | 30 ++++++- .../coyote/http11/cookie/HttpCookie.java | 6 ++ .../coyote/http11/request/HttpRequest.java | 8 ++ .../coyote/http11/request/RequestURI.java | 2 +- .../coyote/http11/response/HttpResponse.java | 86 ++++++++----------- .../coyote/http11/response/ResponseBody.java | 15 ++++ .../coyote/http11/response/StatusLine.java | 9 +- 8 files changed, 144 insertions(+), 88 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/response/ResponseBody.java diff --git a/tomcat/src/main/java/nextstep/jwp/Handler.java b/tomcat/src/main/java/nextstep/jwp/Handler.java index 6bdf67ffb0..4183f42023 100644 --- a/tomcat/src/main/java/nextstep/jwp/Handler.java +++ b/tomcat/src/main/java/nextstep/jwp/Handler.java @@ -16,6 +16,8 @@ import org.apache.coyote.http11.request.RequestURI; import org.apache.coyote.http11.response.HttpResponse; import org.apache.coyote.http11.response.HttpStatus; +import org.apache.coyote.http11.response.ResponseBody; +import org.apache.coyote.http11.response.StatusLine; import org.apache.coyote.http11.session.Session; import org.apache.coyote.http11.session.SessionManager; import org.slf4j.Logger; @@ -35,10 +37,12 @@ private Handler() { public static HttpResponse run(HttpRequest httpRequest) throws IOException { RequestURI requestURI = httpRequest.getRequestLine().getRequestURI(); if (requestURI.isLoginPage() && httpRequest.isMethod(GET)) { + ResponseBody responseBody = new ResponseBody(parseResponseBody(requestURI.getResourcePath())); return HttpResponse.builder() - .httpStatus(HttpStatus.OK) - .responseBody(parseResponseBody(requestURI.getResourcePath())) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.OK)) .contentType(httpRequest.contentType()) + .contentLength(responseBody.getValue().length()) + .responseBody(responseBody) .build(); } if (requestURI.isLoginPage() && httpRequest.isMethod(POST)) { @@ -46,28 +50,34 @@ public static HttpResponse run(HttpRequest httpRequest) throws IOException { } if (requestURI.isHome()) { return HttpResponse.builder() - .httpStatus(HttpStatus.OK) - .responseBody("Hello world!") + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.OK)) .contentType(httpRequest.contentType()) + .contentLength("Hello world!".getBytes().length) + .responseBody(new ResponseBody("Hello world!")) .build(); } if (requestURI.isRegister()) { return doRegister(httpRequest); } + ResponseBody responseBody = new ResponseBody(parseResponseBody(requestURI.getResourcePath())); return HttpResponse.builder() - .httpStatus(HttpStatus.OK) - .responseBody(parseResponseBody(requestURI.getResourcePath())) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.OK)) .contentType(httpRequest.contentType()) + .contentLength(responseBody.getValue().length()) + .responseBody(responseBody) .build(); } private static HttpResponse doRegister(HttpRequest httpRequest) throws IOException { if (httpRequest.isRequestBodyEmpty()) { + String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); + ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); return HttpResponse.builder() - .httpStatus(HttpStatus.OK) - .responseBody(parseResponseBody("static/register.html")) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(httpRequest.contentType()) - .redirectPage("register.html") + .contentLength(responseBody.getValue().length()) + .redirect("http://localhost:8080/register.html") + .responseBody(responseBody) .build(); } @@ -76,21 +86,27 @@ private static HttpResponse doRegister(HttpRequest httpRequest) throws IOExcepti Optional user = InMemoryUserRepository.findByAccount(account); if (user.isPresent()) { + String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); + ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); return HttpResponse.builder() - .httpStatus(HttpStatus.FOUND) - .responseBody(parseResponseBody("static/register.html")) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(httpRequest.contentType()) - .redirectPage("register.html") + .contentLength(responseBody.getValue().length()) + .redirect("http://localhost:8080/register.html") + .responseBody(responseBody) .build(); } String password = requestBody.getValueOf("password"); String email = requestBody.getValueOf("email"); InMemoryUserRepository.save(new User(account, password, email)); + String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); + ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); return HttpResponse.builder() - .httpStatus(HttpStatus.CREATED) - .responseBody(parseResponseBody("static/login.html")) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.CREATED)) .contentType(httpRequest.contentType()) - .redirectPage("login.html") + .contentLength(responseBody.getValue().length()) + .redirect("http://localhost:8080/login.html") + .responseBody(responseBody) .build(); } @@ -102,34 +118,42 @@ private static HttpResponse doLogin(HttpRequest httpRequest) throws IOException log.info(user.toString()); String password = requestBody.getValueOf("password"); if (!user.checkPassword(password)) { + String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); + ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); return HttpResponse.builder() - .httpStatus(HttpStatus.UNAUTHORIZED) - .responseBody(parseResponseBody("static/401.html")) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.UNAUTHORIZED)) .contentType(httpRequest.contentType()) - .redirectPage("401.html") + .contentLength(responseBody.getValue().length()) + .redirect("http://localhost:8080/401") + .responseBody(responseBody) .build(); } HttpCookie cookie = HttpCookie.from(httpRequest.getHeaderValue("Cookie")); Session foundSession = sessionManager.findSession(cookie.getValue("JSESSIONID")); if (foundSession != null) { + String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); + ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); return HttpResponse.builder() - .httpStatus(HttpStatus.FOUND) - .responseBody(parseResponseBody("static/index.html")) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(httpRequest.contentType()) - .redirectPage("index.html") - .httpCookie(HttpCookie.jSessionId(foundSession.getId())) + .contentLength(responseBody.getValue().length()) + .redirect("http://localhost:8080/index") + .setCookie(cookie) + .responseBody(responseBody) .build(); } String uuid = UUID.randomUUID().toString(); Session session = new Session(uuid); session.setAttribute("user", user); sessionManager.add(session); + String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); + ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); return HttpResponse.builder() - .httpStatus(HttpStatus.FOUND) - .responseBody(parseResponseBody("static/index.html")) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(httpRequest.contentType()) - .redirectPage("index.html") - .httpCookie(HttpCookie.jSessionId(uuid)) + .contentLength(responseBody.getValue().length()) + .redirect("http://localhost:8080/index") + .responseBody(responseBody) .build(); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java index 425099d587..de818031bd 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java @@ -3,6 +3,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; + +import org.apache.coyote.http11.cookie.HttpCookie; public class Headers { private static final int KEY_INDEX = 0; @@ -11,6 +14,10 @@ public class Headers { private final Map values; + public static Headers empty(){ + return new Headers(new HashMap<>()); + } + private Headers(Map headers) { this.values = headers; } @@ -24,8 +31,29 @@ public static Headers from(List headers) { return new Headers(values); } + public void add(String key, String value) { + this.values.put(key, value); + } + + public void setCookie(HttpCookie httpCookie) { + String setCookieValue = httpCookie.names() + .stream() + .map(name -> name + "=" + httpCookie.getValue(name)) + .collect(Collectors.joining(";")); + + values.put("Set-Cookie", setCookieValue); + } + + public boolean containsKey(String key) { + return values.containsKey(key); + } + + public Map getValues() { + return values; + } + public String getValue(String key) { - return values.getOrDefault(key, ""); + return values.get(key); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java b/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java index 3222574fc7..9a45552bfb 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java @@ -1,6 +1,8 @@ package org.apache.coyote.http11.cookie; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class HttpCookie { @@ -38,6 +40,10 @@ public static HttpCookie jSessionId(String id) { return new HttpCookie(values); } + public List names() { + return new ArrayList<>(values.keySet()); + } + public String getValue(String key) { return values.getOrDefault(key, ""); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index e2f6e33eb8..afab699980 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -7,6 +7,7 @@ public class HttpRequest { private static final int REQUEST_LINE_INDEX = 0; private static final int HEADER_INDEX = 1; + private static final String CONTENT_TYPE_KEY = "Accept"; private final RequestLine requestLine; private final Headers headers; @@ -33,6 +34,13 @@ public String getHeaderValue(String key) { return headers.getValue(key); } + public String contentType() { + if (!headers.containsKey(CONTENT_TYPE_KEY)) { + return ContentType.HTML.getValue(); + } + return ContentType.from(headers.getValue(CONTENT_TYPE_KEY)).getValue(); + } + public boolean isMethod(HttpMethod httpMethod) { return requestLine.isMethod(httpMethod); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java index 4587dcc697..29d33e4a8f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java @@ -44,7 +44,7 @@ public boolean isHome() { } public boolean isRegister() { - return uri.contains("/register"); + return uri.equals("/register"); } public String getResourcePath() { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java index 999da3abc0..b94141ac5c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java @@ -1,92 +1,74 @@ package org.apache.coyote.http11.response; +import java.util.stream.Collectors; + +import org.apache.coyote.http11.Headers; import org.apache.coyote.http11.cookie.HttpCookie; -import org.apache.coyote.http11.request.ContentType; public class HttpResponse { + private static final String ENTER = "\r\n"; - private static final String KEY_VALUE_DELIMITER = "="; private final StatusLine statusLine; - private final String responseBody; - private final ContentType contentType; - private final String redirectPage; - private final HttpCookie httpCookie; - - private HttpResponse( - StatusLine statusLine, - String responseBody, - ContentType contentType, - String redirectPage, - HttpCookie httpCookie - ) { + private final Headers headers; + private final ResponseBody responseBody; + + private HttpResponse(StatusLine statusLine, Headers headers, ResponseBody responseBody) { this.statusLine = statusLine; + this.headers = headers; this.responseBody = responseBody; - this.contentType = contentType; - this.redirectPage = redirectPage; - this.httpCookie = httpCookie; } public String getResponse() { - HttpStatus httpStatus = statusLine.getHttpStatus(); - String statusLineResponse = String.format("&s &d &s", statusLine, httpStatus.getStatusCode(), httpStatus.getMessage()); - - String contentTypeHeader = "Content-Type: " + contentType.getValue() + ";charset=utf-8 "; - String contentLengthHeader = "Content-Length: " + responseBody.getBytes().length + " "; - - StringBuilder response = new StringBuilder(); - response.append(statusLineResponse).append(ENTER) - .append(contentTypeHeader).append(ENTER) - .append(contentLengthHeader).append(ENTER); - - if (redirectPage != null) { - response.append("Location: http://localhost:8080/").append(redirectPage + " ").append(ENTER); - } - if (httpCookie != null) { - response.append("Set-Cookie: ").append( - "JSESSIONID" + KEY_VALUE_DELIMITER + httpCookie.getValue("JSESSIONID") + " " - ).append(ENTER); - } - - response.append(ENTER).append(responseBody); - return response.toString(); + String statusLineResponse = + statusLine.getProtocolVersion() + " " + + statusLine.getHttpStatus().getStatusCode() + " " + + statusLine.getHttpStatus().getMessage() + " " + ENTER; + String headerResponse = headers.getValues().entrySet() + .stream() + .map(header -> header.getKey() + ": " + header.getValue() + " ") + .collect(Collectors.joining(ENTER)); + return statusLineResponse + headerResponse + ENTER + ENTER + responseBody.getValue(); } public static class Builder { private StatusLine statusLine; - private String responseBody; - private ContentType contentType; - private String redirectPage; - private HttpCookie httpCookie; + private Headers headers = Headers.empty(); + private ResponseBody responseBody; public Builder statusLine(StatusLine statusLine) { this.statusLine = statusLine; return this; } - public Builder responseBody(String responseBody) { - this.responseBody = responseBody; + public Builder redirect(String uri) { + this.headers.add("Location", uri); return this; } - public Builder contentType(ContentType contentType) { - this.contentType = contentType; + public Builder contentType(String contentType) { + this.headers.add("Content-Type", contentType + ";charset=utf-8"); return this; } - public Builder redirectPage(String redirectPage) { - this.redirectPage = redirectPage; + public Builder contentLength(int contentLength) { + this.headers.add("Content-Length", String.valueOf(contentLength)); return this; } - public Builder httpCookie(HttpCookie httpCookie) { - this.httpCookie = httpCookie; + public Builder setCookie(HttpCookie httpCookie) { + this.headers.setCookie(httpCookie); + return this; + } + + public Builder responseBody(ResponseBody responseBody) { + this.responseBody = responseBody; return this; } public HttpResponse build() { - return new HttpResponse(statusLine, responseBody, contentType, redirectPage, httpCookie); + return new HttpResponse(statusLine, headers, responseBody); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseBody.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseBody.java new file mode 100644 index 0000000000..e3b1bcc871 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseBody.java @@ -0,0 +1,15 @@ +package org.apache.coyote.http11.response; + +public class ResponseBody { + + private final String value; + + public ResponseBody(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java index 8126c9d468..1d2a5416ac 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java @@ -8,18 +8,11 @@ public class StatusLine { private final String protocolVersion; private final HttpStatus httpStatus; - private StatusLine(String protocolVersion, HttpStatus httpStatus) { + public StatusLine(String protocolVersion, HttpStatus httpStatus) { this.protocolVersion = protocolVersion; this.httpStatus = httpStatus; } - public static StatusLine from(String responseLine) { - String[] elements = responseLine.split(DELIMITER); - String protocol = elements[PROTOCOL_VERSION_INDEX]; - String statusCode = elements[STATUS_CODE_INDEX]; - return new StatusLine(protocol, HttpStatus.from(statusCode)); - } - public String getProtocolVersion() { return protocolVersion; } From e134f6394086560ac063a4b22c41a80aa2144719 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 16:08:46 +0900 Subject: [PATCH 08/29] =?UTF-8?q?refactor:=20Handler=EB=A5=BC=20Controller?= =?UTF-8?q?=EB=93=A4=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/nextstep/jwp/Handler.java | 167 ------------------ .../jwp/controller/FrontController.java | 28 +++ .../jwp/controller/HomeController.java | 26 +++ .../jwp/controller/IndexController.java | 26 +++ .../jwp/controller/LoginController.java | 90 ++++++++++ .../jwp/controller/RegisterController.java | 61 +++++++ .../jwp/controller/ResourceController.java | 26 +++ .../apache/coyote/http11/Http11Processor.java | 7 +- .../coyote/http11/controller/Controller.java | 10 ++ .../coyote/http11/request/HttpRequest.java | 7 +- .../coyote/http11/request/RequestURI.java | 19 +- .../coyote/http11/response/HttpResponse.java | 9 +- .../apache/coyote/http11/util/FileReader.java | 23 +++ .../coyote/http11/Http11ProcessorTest.java | 4 +- .../apache/coyote/http11/RequestURITest.java | 2 +- 15 files changed, 310 insertions(+), 195 deletions(-) delete mode 100644 tomcat/src/main/java/nextstep/jwp/Handler.java create mode 100644 tomcat/src/main/java/nextstep/jwp/controller/FrontController.java create mode 100644 tomcat/src/main/java/nextstep/jwp/controller/HomeController.java create mode 100644 tomcat/src/main/java/nextstep/jwp/controller/IndexController.java create mode 100644 tomcat/src/main/java/nextstep/jwp/controller/LoginController.java create mode 100644 tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java create mode 100644 tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/util/FileReader.java diff --git a/tomcat/src/main/java/nextstep/jwp/Handler.java b/tomcat/src/main/java/nextstep/jwp/Handler.java deleted file mode 100644 index 4183f42023..0000000000 --- a/tomcat/src/main/java/nextstep/jwp/Handler.java +++ /dev/null @@ -1,167 +0,0 @@ -package nextstep.jwp; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - -import nextstep.jwp.db.InMemoryUserRepository; -import nextstep.jwp.model.User; -import org.apache.coyote.http11.cookie.HttpCookie; -import org.apache.coyote.http11.request.HttpRequest; -import org.apache.coyote.http11.request.RequestBody; -import org.apache.coyote.http11.request.RequestURI; -import org.apache.coyote.http11.response.HttpResponse; -import org.apache.coyote.http11.response.HttpStatus; -import org.apache.coyote.http11.response.ResponseBody; -import org.apache.coyote.http11.response.StatusLine; -import org.apache.coyote.http11.session.Session; -import org.apache.coyote.http11.session.SessionManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.apache.coyote.http11.request.HttpMethod.GET; -import static org.apache.coyote.http11.request.HttpMethod.POST; - -public class Handler { - - private static final Logger log = LoggerFactory.getLogger(Handler.class); - private static final SessionManager sessionManager = new SessionManager(); - - private Handler() { - } - - public static HttpResponse run(HttpRequest httpRequest) throws IOException { - RequestURI requestURI = httpRequest.getRequestLine().getRequestURI(); - if (requestURI.isLoginPage() && httpRequest.isMethod(GET)) { - ResponseBody responseBody = new ResponseBody(parseResponseBody(requestURI.getResourcePath())); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.OK)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .responseBody(responseBody) - .build(); - } - if (requestURI.isLoginPage() && httpRequest.isMethod(POST)) { - return doLogin(httpRequest); - } - if (requestURI.isHome()) { - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.OK)) - .contentType(httpRequest.contentType()) - .contentLength("Hello world!".getBytes().length) - .responseBody(new ResponseBody("Hello world!")) - .build(); - } - if (requestURI.isRegister()) { - return doRegister(httpRequest); - } - ResponseBody responseBody = new ResponseBody(parseResponseBody(requestURI.getResourcePath())); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.OK)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .responseBody(responseBody) - .build(); - } - - private static HttpResponse doRegister(HttpRequest httpRequest) throws IOException { - if (httpRequest.isRequestBodyEmpty()) { - String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); - ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .redirect("http://localhost:8080/register.html") - .responseBody(responseBody) - .build(); - } - - RequestBody requestBody = httpRequest.getRequestBody(); - String account = requestBody.getValueOf("account"); - - Optional user = InMemoryUserRepository.findByAccount(account); - if (user.isPresent()) { - String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); - ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .redirect("http://localhost:8080/register.html") - .responseBody(responseBody) - .build(); - } - String password = requestBody.getValueOf("password"); - String email = requestBody.getValueOf("email"); - InMemoryUserRepository.save(new User(account, password, email)); - String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); - ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.CREATED)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .redirect("http://localhost:8080/login.html") - .responseBody(responseBody) - .build(); - } - - private static HttpResponse doLogin(HttpRequest httpRequest) throws IOException { - RequestBody requestBody = httpRequest.getRequestBody(); - String account = requestBody.getValueOf("account"); - User user = InMemoryUserRepository.findByAccount(account) - .orElseThrow(IllegalArgumentException::new); - log.info(user.toString()); - String password = requestBody.getValueOf("password"); - if (!user.checkPassword(password)) { - String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); - ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.UNAUTHORIZED)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .redirect("http://localhost:8080/401") - .responseBody(responseBody) - .build(); - } - HttpCookie cookie = HttpCookie.from(httpRequest.getHeaderValue("Cookie")); - Session foundSession = sessionManager.findSession(cookie.getValue("JSESSIONID")); - if (foundSession != null) { - String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); - ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .redirect("http://localhost:8080/index") - .setCookie(cookie) - .responseBody(responseBody) - .build(); - } - String uuid = UUID.randomUUID().toString(); - Session session = new Session(uuid); - session.setAttribute("user", user); - sessionManager.add(session); - String resourcePath = httpRequest.getRequestLine().getRequestURI().getResourcePath(); - ResponseBody responseBody = new ResponseBody(parseResponseBody(resourcePath)); - return HttpResponse.builder() - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) - .contentType(httpRequest.contentType()) - .contentLength(responseBody.getValue().length()) - .redirect("http://localhost:8080/index") - .responseBody(responseBody) - .build(); - } - - private static String parseResponseBody(String resourcePath) throws IOException { - Path path = new File(Objects.requireNonNull( - Handler.class.getClassLoader().getResource(resourcePath)).getFile() - ).toPath(); - return new String(Files.readAllBytes(path)); - } - -} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java new file mode 100644 index 0000000000..a652023053 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java @@ -0,0 +1,28 @@ +package nextstep.jwp.controller; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.response.HttpResponse; + +public class FrontController implements Controller { + + private static final Map URIS = new HashMap<>(); + + static { + URIS.put("/", new HomeController()); + URIS.put("/login", new LoginController()); + URIS.put("/register", new RegisterController()); + URIS.put("/index", new IndexController()); + } + + @Override + public HttpResponse service(HttpRequest request) { + String uri = request.getRequestLine().getRequestURI().getUri(); + Controller controller = URIS.getOrDefault(uri, new ResourceController()); + return controller.service(request); + } + +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java new file mode 100644 index 0000000000..458ed8ab49 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -0,0 +1,26 @@ +package nextstep.jwp.controller; + +import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.request.ContentType; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.HttpStatus; +import org.apache.coyote.http11.response.ResponseBody; +import org.apache.coyote.http11.response.StatusLine; + +public class HomeController implements Controller { + private static final String DEFAULT_MESSAGE = "Hello world!"; + + @Override + public HttpResponse service(HttpRequest request) { + StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(ContentType.HTML.getValue()) + .contentLength(DEFAULT_MESSAGE.getBytes().length) + .responseBody(new ResponseBody(DEFAULT_MESSAGE)) + .build(); + } + + +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java new file mode 100644 index 0000000000..31be0c6d81 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java @@ -0,0 +1,26 @@ +package nextstep.jwp.controller; + +import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.request.ContentType; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.HttpStatus; +import org.apache.coyote.http11.response.ResponseBody; +import org.apache.coyote.http11.response.StatusLine; +import org.apache.coyote.http11.util.FileReader; + +public class IndexController implements Controller { + + @Override + public HttpResponse service(HttpRequest request) { + ResponseBody responseBody = new ResponseBody(FileReader.read("/index.html")); + StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .responseBody(responseBody) + .build(); + } + +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java new file mode 100644 index 0000000000..3a897e1f07 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -0,0 +1,90 @@ +package nextstep.jwp.controller; + +import java.util.UUID; + +import nextstep.jwp.db.InMemoryUserRepository; +import nextstep.jwp.model.User; +import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.cookie.HttpCookie; +import org.apache.coyote.http11.request.ContentType; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.HttpStatus; +import org.apache.coyote.http11.response.ResponseBody; +import org.apache.coyote.http11.response.StatusLine; +import org.apache.coyote.http11.session.Session; +import org.apache.coyote.http11.session.SessionManager; +import org.apache.coyote.http11.util.FileReader; + +import static org.apache.coyote.http11.request.HttpMethod.GET; + +public class LoginController implements Controller { + + private static final String URI = "/login.html"; + + private static final SessionManager sessionManager = new SessionManager(); + + + @Override + public HttpResponse service(HttpRequest request) { + if (request.isMethod(GET)) { + ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); + StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + return HttpResponse.builder() + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().length()) + .statusLine(statusLine) + .responseBody(responseBody) + .build(); + } else { + return doLogin(request); + } + } + + private static HttpResponse doLogin(HttpRequest httpRequest) { + RequestBody requestBody = httpRequest.getRequestBody(); + String account = requestBody.getValueOf("account"); + User user = InMemoryUserRepository.findByAccount(account) + .orElseThrow(IllegalArgumentException::new); + String password = requestBody.getValueOf("password"); + if (!user.checkPassword(password)) { + ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); + StatusLine statusLine = new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.UNAUTHORIZED); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect("http://localhost:8080/401") + .responseBody(responseBody) + .build(); + } + HttpCookie cookie = HttpCookie.from(httpRequest.getHeaderValue("Cookie")); + Session foundSession = sessionManager.findSession(cookie.getValue("JSESSIONID")); + StatusLine statusLine = new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND); + if (foundSession != null) { + ResponseBody responseBody = new ResponseBody(FileReader.read("/index.html")); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect("http://localhost:8080/index") + .setCookie(cookie) + .responseBody(responseBody) + .build(); + } + String uuid = UUID.randomUUID().toString(); + Session session = new Session(uuid); + session.setAttribute("user", user); + sessionManager.add(session); + ResponseBody responseBody = new ResponseBody(FileReader.read("/index.html")); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect("http://localhost:8080/index") + .responseBody(responseBody) + .build(); + } + +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java new file mode 100644 index 0000000000..86d63c5339 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -0,0 +1,61 @@ +package nextstep.jwp.controller; + +import java.util.Optional; + +import nextstep.jwp.db.InMemoryUserRepository; +import nextstep.jwp.model.User; +import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.request.ContentType; +import org.apache.coyote.http11.request.HttpMethod; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.HttpStatus; +import org.apache.coyote.http11.response.ResponseBody; +import org.apache.coyote.http11.response.StatusLine; +import org.apache.coyote.http11.util.FileReader; + +public class RegisterController implements Controller { + + private static final String URI = "/register.html"; + + @Override + public HttpResponse service(HttpRequest request) { + if (request.isMethod(HttpMethod.GET)) { + ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); + String version = request.getRequestLine().getVersion(); + return HttpResponse.builder() + .statusLine(new StatusLine(version, HttpStatus.FOUND)) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .responseBody(responseBody) + .build(); + } + RequestBody requestBody = request.getRequestBody(); + String account = requestBody.getValueOf("account"); + + Optional user = InMemoryUserRepository.findByAccount(account); + if (user.isPresent()) { + ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); + return HttpResponse.builder() + .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect("http://localhost:8080/register.html") + .responseBody(responseBody) + .build(); + } + String password = requestBody.getValueOf("password"); + String email = requestBody.getValueOf("email"); + InMemoryUserRepository.save(new User(account, password, email)); + ResponseBody responseBody = new ResponseBody(FileReader.read("/login.html")); + return HttpResponse.builder() + .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.CREATED)) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect("http://localhost:8080/login.html") + .responseBody(responseBody) + .build(); + } + +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java new file mode 100644 index 0000000000..184cff0be1 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java @@ -0,0 +1,26 @@ +package nextstep.jwp.controller; + +import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.HttpStatus; +import org.apache.coyote.http11.response.ResponseBody; +import org.apache.coyote.http11.response.StatusLine; +import org.apache.coyote.http11.util.FileReader; + +public class ResourceController implements Controller { + + @Override + public HttpResponse service(HttpRequest request) { + String resource = request.getRequestLine().getRequestURI().getResourcePath(); + ResponseBody responseBody = new ResponseBody(FileReader.read(resource)); + StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(request.contentType().getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .responseBody(responseBody) + .build(); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java index 81dba15c5e..7216d5e454 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -7,9 +7,10 @@ import java.util.ArrayList; import java.util.List; -import nextstep.jwp.Handler; +import nextstep.jwp.controller.FrontController; import nextstep.jwp.exception.UncheckedServletException; import org.apache.coyote.Processor; +import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; @@ -42,7 +43,9 @@ public void process(final Socket connection) { RequestBody requestBody = readRequestBody(requestHeader, bufferedReader); HttpRequest httpRequest = HttpRequest.of(requestHeader, requestBody); - HttpResponse httpResponse = Handler.run(httpRequest); + + Controller frontController = new FrontController(); + HttpResponse httpResponse = frontController.service(httpRequest); outputStream.write(httpResponse.getResponse().getBytes()); outputStream.flush(); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java new file mode 100644 index 0000000000..33cd2f6600 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java @@ -0,0 +1,10 @@ +package org.apache.coyote.http11.controller; + +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.response.HttpResponse; + +public interface Controller { + + HttpResponse service(HttpRequest request); + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index afab699980..878c8e919a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -34,13 +34,12 @@ public String getHeaderValue(String key) { return headers.getValue(key); } - public String contentType() { + public ContentType contentType() { if (!headers.containsKey(CONTENT_TYPE_KEY)) { - return ContentType.HTML.getValue(); + return ContentType.HTML; } - return ContentType.from(headers.getValue(CONTENT_TYPE_KEY)).getValue(); + return ContentType.from(headers.getValue(CONTENT_TYPE_KEY)); } - public boolean isMethod(HttpMethod httpMethod) { return requestLine.isMethod(httpMethod); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java index 29d33e4a8f..50f4f125d0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java @@ -3,7 +3,6 @@ public class RequestURI { private static final String QUERY_STRING_INIT_SIGN = "?"; private static final String EXTENSION_INIT_SIGN = "."; - private static final String STATIC_PATH = "static"; private static final String HTML_EXTENSION = ".html"; private final String uri; @@ -23,30 +22,18 @@ public static RequestURI from(String uri) { private static String parseResourcePath(String uri) { int index = uri.indexOf(QUERY_STRING_INIT_SIGN); if (index != -1) { - return STATIC_PATH + uri.substring(0, index) + HTML_EXTENSION; + return uri.substring(0, index) + HTML_EXTENSION; } if (!uri.contains(EXTENSION_INIT_SIGN)) { - return STATIC_PATH + uri + HTML_EXTENSION; + return uri + HTML_EXTENSION; } - return STATIC_PATH + uri; + return uri; } public boolean hasQueryString() { return !queryString.getValues().isEmpty(); } - public boolean isLoginPage() { - return uri.equals("/login"); - } - - public boolean isHome() { - return uri.equals("/"); - } - - public boolean isRegister() { - return uri.equals("/register"); - } - public String getResourcePath() { return resourcePath; } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java index b94141ac5c..fde6aa51d6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java @@ -20,10 +20,13 @@ private HttpResponse(StatusLine statusLine, Headers headers, ResponseBody respon } public String getResponse() { + String protocolVersion = statusLine.getProtocolVersion(); + int statusCode = statusLine.getHttpStatus().getStatusCode(); + String message = statusLine.getHttpStatus().getMessage(); String statusLineResponse = - statusLine.getProtocolVersion() + " " + - statusLine.getHttpStatus().getStatusCode() + " " + - statusLine.getHttpStatus().getMessage() + " " + ENTER; + protocolVersion + " " + + statusCode + " " + + message + " " + ENTER; String headerResponse = headers.getValues().entrySet() .stream() .map(header -> header.getKey() + ": " + header.getValue() + " ") diff --git a/tomcat/src/main/java/org/apache/coyote/http11/util/FileReader.java b/tomcat/src/main/java/org/apache/coyote/http11/util/FileReader.java new file mode 100644 index 0000000000..dc346cc608 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/util/FileReader.java @@ -0,0 +1,23 @@ +package org.apache.coyote.http11.util; + +import java.io.File; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; + +public class FileReader { + + private FileReader() { + } + + public static String read(String resourcePath) { + try { + URL url = FileReader.class.getClassLoader().getResource("static" + resourcePath); + Path path = new File(url.getFile()).toPath(); + return new String(Files.readAllBytes(path)); + } catch (Exception e) { + throw new IllegalArgumentException("파일을 읽는 중 예외가 발생했습니다."); + } + } + +} diff --git a/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java index 7fb6e48680..ff5e485ea4 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java @@ -25,8 +25,8 @@ void process() { // then var expected = String.join("\r\n", "HTTP/1.1 200 OK ", - "Content-Type: text/html;charset=utf-8 ", "Content-Length: 12 ", + "Content-Type: text/html;charset=utf-8 ", "", "Hello world!"); @@ -52,8 +52,8 @@ void index() throws IOException { // then final URL resource = getClass().getClassLoader().getResource("static/index.html"); var expected = "HTTP/1.1 200 OK \r\n" + - "Content-Type: text/html;charset=utf-8 \r\n" + "Content-Length: 5564 \r\n" + + "Content-Type: text/html;charset=utf-8 \r\n" + "\r\n" + new String(Files.readAllBytes(new File(resource.getFile()).toPath())); diff --git a/tomcat/src/test/java/org/apache/coyote/http11/RequestURITest.java b/tomcat/src/test/java/org/apache/coyote/http11/RequestURITest.java index 88789de22d..bd8dd74ef3 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/RequestURITest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/RequestURITest.java @@ -45,7 +45,7 @@ class RequestURITest { RequestURI requestURI = RequestURI.from(uri); // then - assertThat(requestURI.getResourcePath()).isEqualTo("static/login.html"); + assertThat(requestURI.getResourcePath()).isEqualTo("/login.html"); } } From b737ed406bbfbd9d239e300f05dfb7b84489a1a9 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 19:42:15 +0900 Subject: [PATCH 09/29] =?UTF-8?q?refactor:=20LoginController=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwp/controller/IndexController.java | 3 +- .../jwp/controller/LoginController.java | 127 +++++++++++------- .../jwp/controller/RegisterController.java | 2 +- .../org/apache/coyote/http11/Headers.java | 2 +- .../coyote/http11/request/HttpRequest.java | 11 -- .../coyote/http11/request/RequestLine.java | 4 - .../coyote/http11/request/HttpMethodTest.java | 46 +++++++ 7 files changed, 128 insertions(+), 67 deletions(-) create mode 100644 tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java diff --git a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java index 31be0c6d81..823cdf0a1e 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java @@ -10,10 +10,11 @@ import org.apache.coyote.http11.util.FileReader; public class IndexController implements Controller { + private static final String RESOURCE = "/index.html"; @Override public HttpResponse service(HttpRequest request) { - ResponseBody responseBody = new ResponseBody(FileReader.read("/index.html")); + ResponseBody responseBody = new ResponseBody(FileReader.read(RESOURCE)); StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); return HttpResponse.builder() .statusLine(statusLine) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index 3a897e1f07..00b513dfd4 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -1,12 +1,12 @@ package nextstep.jwp.controller; +import java.util.Optional; import java.util.UUID; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.cookie.HttpCookie; -import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; @@ -17,72 +17,101 @@ import org.apache.coyote.http11.session.SessionManager; import org.apache.coyote.http11.util.FileReader; +import static org.apache.coyote.http11.request.ContentType.HTML; import static org.apache.coyote.http11.request.HttpMethod.GET; public class LoginController implements Controller { private static final String URI = "/login.html"; + private static final String UNAUTHORIZED = "/401.html"; + private static final String REDIRECT_HOME_URI = "/index.html"; - private static final SessionManager sessionManager = new SessionManager(); - + public static final SessionManager SESSION_MANAGER = new SessionManager(); @Override public HttpResponse service(HttpRequest request) { - if (request.isMethod(GET)) { - ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); - StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); - return HttpResponse.builder() - .contentType(ContentType.HTML.getValue()) - .contentLength(responseBody.getValue().length()) - .statusLine(statusLine) - .responseBody(responseBody) - .build(); - } else { - return doLogin(request); + if (request.getRequestLine().getHttpMethod().is(GET)) { + return doGet(request); } + return doPost(request); } - private static HttpResponse doLogin(HttpRequest httpRequest) { - RequestBody requestBody = httpRequest.getRequestBody(); - String account = requestBody.getValueOf("account"); - User user = InMemoryUserRepository.findByAccount(account) - .orElseThrow(IllegalArgumentException::new); - String password = requestBody.getValueOf("password"); - if (!user.checkPassword(password)) { - ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); - StatusLine statusLine = new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.UNAUTHORIZED); - return HttpResponse.builder() - .statusLine(statusLine) - .contentType(ContentType.HTML.getValue()) - .contentLength(responseBody.getValue().getBytes().length) - .redirect("http://localhost:8080/401") - .responseBody(responseBody) - .build(); + private HttpResponse doGet(HttpRequest request) { + if (hasCookie(request)) { + return redirectHome(request); } + return showLoginPage(request); + } + + private boolean hasCookie(HttpRequest httpRequest) { HttpCookie cookie = HttpCookie.from(httpRequest.getHeaderValue("Cookie")); - Session foundSession = sessionManager.findSession(cookie.getValue("JSESSIONID")); - StatusLine statusLine = new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND); - if (foundSession != null) { - ResponseBody responseBody = new ResponseBody(FileReader.read("/index.html")); - return HttpResponse.builder() - .statusLine(statusLine) - .contentType(ContentType.HTML.getValue()) - .contentLength(responseBody.getValue().getBytes().length) - .redirect("http://localhost:8080/index") - .setCookie(cookie) - .responseBody(responseBody) - .build(); + return SESSION_MANAGER.findSession(cookie.getValue("JSESSIONID")) != null; + } + + private HttpResponse redirectHome(HttpRequest request) { + StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND); + ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect(REDIRECT_HOME_URI) + .responseBody(responseBody) + .build(); + } + + private HttpResponse showLoginPage(HttpRequest request) { + ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); + StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + return HttpResponse.builder() + .statusLine(statusLine) + .contentType(HTML.getValue()) + .contentLength(responseBody.getValue().length()) + .responseBody(responseBody) + .build(); + } + + private HttpResponse doPost(HttpRequest httpRequest) { + Optional optionalUser = findUser(httpRequest); + if (optionalUser.isEmpty()) { + return redirectUnauthorized(httpRequest); } + + return successLogin(httpRequest); + } + + private Optional findUser(HttpRequest request) { + RequestBody requestBody = request.getRequestBody(); + String account = requestBody.getValueOf("account"); + String password = requestBody.getValueOf("password"); + return InMemoryUserRepository.findByAccount(account) + .stream() + .filter(it -> it.checkPassword(password)) + .findFirst(); + } + + private HttpResponse redirectUnauthorized(HttpRequest httpRequest) { + ResponseBody responseBody = new ResponseBody(FileReader.read(UNAUTHORIZED)); + return HttpResponse.builder() + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.UNAUTHORIZED)) + .contentType(HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect(UNAUTHORIZED) + .responseBody(responseBody) + .build(); + } + + private HttpResponse successLogin(HttpRequest httpRequest) { String uuid = UUID.randomUUID().toString(); - Session session = new Session(uuid); - session.setAttribute("user", user); - sessionManager.add(session); - ResponseBody responseBody = new ResponseBody(FileReader.read("/index.html")); + SESSION_MANAGER.add(new Session(uuid)); + + ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); return HttpResponse.builder() - .statusLine(statusLine) - .contentType(ContentType.HTML.getValue()) + .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) + .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) - .redirect("http://localhost:8080/index") + .setCookie(HttpCookie.jSessionId(uuid)) + .redirect(REDIRECT_HOME_URI) .responseBody(responseBody) .build(); } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index 86d63c5339..e0a7d9cb91 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -21,7 +21,7 @@ public class RegisterController implements Controller { @Override public HttpResponse service(HttpRequest request) { - if (request.isMethod(HttpMethod.GET)) { + if (request.getRequestLine().getHttpMethod().is(HttpMethod.GET)) { ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); String version = request.getRequestLine().getVersion(); return HttpResponse.builder() diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java index de818031bd..f4e27b94fc 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Headers.java @@ -53,7 +53,7 @@ public Map getValues() { } public String getValue(String key) { - return values.get(key); + return values.getOrDefault(key, ""); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index 878c8e919a..f66a59fbf6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -26,10 +26,6 @@ public static HttpRequest of(List requestHeader, RequestBody requestBody return new HttpRequest(requestLine, headers, requestBody); } - public boolean isRequestBodyEmpty() { - return requestBody.isEmpty(); - } - public String getHeaderValue(String key) { return headers.getValue(key); } @@ -40,18 +36,11 @@ public ContentType contentType() { } return ContentType.from(headers.getValue(CONTENT_TYPE_KEY)); } - public boolean isMethod(HttpMethod httpMethod) { - return requestLine.isMethod(httpMethod); - } public RequestLine getRequestLine() { return requestLine; } - public Headers getHeaders() { - return headers; - } - public RequestBody getRequestBody() { return requestBody; } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java index c7b09c16b2..4ca1eebc18 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java @@ -25,10 +25,6 @@ public static RequestLine from(String request) { ); } - public boolean isMethod(HttpMethod httpMethod) { - return httpMethod.is(httpMethod); - } - public HttpMethod getHttpMethod() { return httpMethod; } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java new file mode 100644 index 0000000000..ffb0bab93f --- /dev/null +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java @@ -0,0 +1,46 @@ +package org.apache.coyote.http11.request; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertAll; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class HttpMethodTest { + + @Test + void 이름에_맞는_요청을_찾을_수_있다_GET() { + // given + String name = "get"; + + // when + HttpMethod httpMethod = HttpMethod.from(name); + + // then + Assertions.assertThat(httpMethod).isEqualTo(HttpMethod.GET); + } + + @Test + void 이름에_맞는_요청을_찾을_수_있다_POST() { + // given + String name = "post"; + + // when + HttpMethod httpMethod = HttpMethod.from(name); + + // then + Assertions.assertThat(httpMethod).isEqualTo(HttpMethod.POST); + } + + @Test + void 같은지_검증_가능() { + assertAll( + () -> Assertions.assertThat(HttpMethod.POST.is(HttpMethod.POST)).isTrue(), + () -> Assertions.assertThat(HttpMethod.GET.is(HttpMethod.POST)).isFalse() + ); + } + +} From de3b002d380cd4f8028f90e4e6ecb3c109295b9f Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 19:57:10 +0900 Subject: [PATCH 10/29] =?UTF-8?q?refactor:=20RegisterController=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwp/controller/RegisterController.java | 61 ++++++++++++------- .../coyote/http11/request/HttpRequest.java | 4 ++ 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index e0a7d9cb91..582930ec70 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -1,7 +1,5 @@ package nextstep.jwp.controller; -import java.util.Optional; - import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.controller.Controller; @@ -17,43 +15,60 @@ public class RegisterController implements Controller { - private static final String URI = "/register.html"; + private static final String REGISTER_URI = "/register.html"; + private static final String LOGIN_URI = "/login.html"; @Override public HttpResponse service(HttpRequest request) { if (request.getRequestLine().getHttpMethod().is(HttpMethod.GET)) { - ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); - String version = request.getRequestLine().getVersion(); - return HttpResponse.builder() - .statusLine(new StatusLine(version, HttpStatus.FOUND)) - .contentType(ContentType.HTML.getValue()) - .contentLength(responseBody.getValue().getBytes().length) - .responseBody(responseBody) - .build(); + return doGet(request); } + return doPost(request); + } + + private HttpResponse doGet(HttpRequest request) { + ResponseBody responseBody = new ResponseBody(FileReader.read(REGISTER_URI)); + return HttpResponse.builder() + .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .responseBody(responseBody) + .build(); + } + + private HttpResponse doPost(HttpRequest request) { RequestBody requestBody = request.getRequestBody(); String account = requestBody.getValueOf("account"); - Optional user = InMemoryUserRepository.findByAccount(account); - if (user.isPresent()) { - ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); - return HttpResponse.builder() - .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) - .contentType(ContentType.HTML.getValue()) - .contentLength(responseBody.getValue().getBytes().length) - .redirect("http://localhost:8080/register.html") - .responseBody(responseBody) - .build(); + if (InMemoryUserRepository.findByAccount(account).isPresent()) { + return redirectLogin(request); } + + return registerUser(request, requestBody, account); + } + + private HttpResponse redirectLogin(HttpRequest request) { + ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); + return HttpResponse.builder() + .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) + .contentType(ContentType.HTML.getValue()) + .contentLength(responseBody.getValue().getBytes().length) + .redirect(LOGIN_URI) + .responseBody(responseBody) + .build(); + } + + private HttpResponse registerUser(HttpRequest request, RequestBody requestBody, String account) { String password = requestBody.getValueOf("password"); String email = requestBody.getValueOf("email"); InMemoryUserRepository.save(new User(account, password, email)); - ResponseBody responseBody = new ResponseBody(FileReader.read("/login.html")); + + ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); return HttpResponse.builder() .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.CREATED)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) - .redirect("http://localhost:8080/login.html") + .redirect(LOGIN_URI) .responseBody(responseBody) .build(); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index f66a59fbf6..acaae96391 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -41,6 +41,10 @@ public RequestLine getRequestLine() { return requestLine; } + public String getHeaderCookie() { + return headers.getValue("Cookie"); + } + public RequestBody getRequestBody() { return requestBody; } From 3029d5d4dcde272dfb83c4e27f8e5b8260102abd Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 20:04:00 +0900 Subject: [PATCH 11/29] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/jwp/controller/HomeController.java | 1 - .../nextstep/jwp/controller/LoginController.java | 11 ++++++++--- .../jwp/controller/RegisterController.java | 15 ++++++++++----- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java index 458ed8ab49..051afe4f26 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -22,5 +22,4 @@ public HttpResponse service(HttpRequest request) { .build(); } - } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index 00b513dfd4..4b7abedcde 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -102,18 +102,23 @@ private HttpResponse redirectUnauthorized(HttpRequest httpRequest) { } private HttpResponse successLogin(HttpRequest httpRequest) { - String uuid = UUID.randomUUID().toString(); - SESSION_MANAGER.add(new Session(uuid)); + String sessionId = addSession(); ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); return HttpResponse.builder() .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) - .setCookie(HttpCookie.jSessionId(uuid)) + .setCookie(HttpCookie.jSessionId(sessionId)) .redirect(REDIRECT_HOME_URI) .responseBody(responseBody) .build(); } + private String addSession() { + String uuid = UUID.randomUUID().toString(); + SESSION_MANAGER.add(new Session(uuid)); + return uuid; + } + } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index 582930ec70..020225b1c2 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -44,7 +44,7 @@ private HttpResponse doPost(HttpRequest request) { return redirectLogin(request); } - return registerUser(request, requestBody, account); + return registerUser(request, requestBody); } private HttpResponse redirectLogin(HttpRequest request) { @@ -58,10 +58,8 @@ private HttpResponse redirectLogin(HttpRequest request) { .build(); } - private HttpResponse registerUser(HttpRequest request, RequestBody requestBody, String account) { - String password = requestBody.getValueOf("password"); - String email = requestBody.getValueOf("email"); - InMemoryUserRepository.save(new User(account, password, email)); + private HttpResponse registerUser(HttpRequest request, RequestBody requestBody) { + saveUser(requestBody); ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); return HttpResponse.builder() @@ -73,4 +71,11 @@ private HttpResponse registerUser(HttpRequest request, RequestBody requestBody, .build(); } + private void saveUser(RequestBody requestBody) { + String account = requestBody.getValueOf("account"); + String password = requestBody.getValueOf("password"); + String email = requestBody.getValueOf("email"); + InMemoryUserRepository.save(new User(account, password, email)); + } + } From e64b1362c037cf9939df413cf238deb24a58d263 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 21:14:26 +0900 Subject: [PATCH 12/29] =?UTF-8?q?refactor:=20abstractController=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwp/controller/FrontController.java | 12 ++- .../jwp/controller/HomeController.java | 10 +-- .../jwp/controller/IndexController.java | 11 ++- .../jwp/controller/LoginController.java | 54 +++++------ .../jwp/controller/RegisterController.java | 40 +++++---- .../jwp/controller/ResourceController.java | 10 +-- .../apache/coyote/http11/Http11Processor.java | 7 +- .../http11/controller/AbstractController.java | 28 ++++++ .../coyote/http11/controller/Controller.java | 2 +- .../coyote/http11/response/HttpResponse.java | 90 +++++++------------ .../http11/response/ResponseViewer.java | 44 +++++++++ .../coyote/http11/response/StatusLine.java | 7 +- 12 files changed, 186 insertions(+), 129 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java diff --git a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java index a652023053..e80402cdc9 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java @@ -3,11 +3,13 @@ import java.util.HashMap; import java.util.Map; +import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.request.HttpMethod; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; -public class FrontController implements Controller { +public class FrontController extends AbstractController { private static final Map URIS = new HashMap<>(); @@ -19,10 +21,14 @@ public class FrontController implements Controller { } @Override - public HttpResponse service(HttpRequest request) { + public void service(HttpRequest request, HttpResponse response) { String uri = request.getRequestLine().getRequestURI().getUri(); Controller controller = URIS.getOrDefault(uri, new ResourceController()); - return controller.service(request); + controller.service(request, response); } + protected void doPost(HttpRequest request, HttpResponse response) { /* NOOP */ } + + protected void doGet(HttpRequest request, HttpResponse response) { /* NOOP */ } + } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java index 051afe4f26..91e0e3509a 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -1,5 +1,6 @@ package nextstep.jwp.controller; +import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; @@ -8,18 +9,17 @@ import org.apache.coyote.http11.response.ResponseBody; import org.apache.coyote.http11.response.StatusLine; -public class HomeController implements Controller { +public class HomeController extends AbstractController { private static final String DEFAULT_MESSAGE = "Hello world!"; @Override - public HttpResponse service(HttpRequest request) { + public void service(HttpRequest request, HttpResponse httpResponse) { StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); - return HttpResponse.builder() + httpResponse .statusLine(statusLine) .contentType(ContentType.HTML.getValue()) .contentLength(DEFAULT_MESSAGE.getBytes().length) - .responseBody(new ResponseBody(DEFAULT_MESSAGE)) - .build(); + .responseBody(new ResponseBody(DEFAULT_MESSAGE)); } } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java index 823cdf0a1e..fc00541498 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java @@ -1,6 +1,6 @@ package nextstep.jwp.controller; -import org.apache.coyote.http11.controller.Controller; +import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; @@ -9,19 +9,18 @@ import org.apache.coyote.http11.response.StatusLine; import org.apache.coyote.http11.util.FileReader; -public class IndexController implements Controller { +public class IndexController extends AbstractController { private static final String RESOURCE = "/index.html"; @Override - public HttpResponse service(HttpRequest request) { + public void service(HttpRequest request, HttpResponse httpResponse) { ResponseBody responseBody = new ResponseBody(FileReader.read(RESOURCE)); StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); - return HttpResponse.builder() + httpResponse .statusLine(statusLine) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index 4b7abedcde..e710460b92 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -5,6 +5,7 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; +import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.cookie.HttpCookie; import org.apache.coyote.http11.request.HttpRequest; @@ -20,7 +21,7 @@ import static org.apache.coyote.http11.request.ContentType.HTML; import static org.apache.coyote.http11.request.HttpMethod.GET; -public class LoginController implements Controller { +public class LoginController extends AbstractController { private static final String URI = "/login.html"; private static final String UNAUTHORIZED = "/401.html"; @@ -29,18 +30,21 @@ public class LoginController implements Controller { public static final SessionManager SESSION_MANAGER = new SessionManager(); @Override - public HttpResponse service(HttpRequest request) { + public void service(HttpRequest request, HttpResponse response) { if (request.getRequestLine().getHttpMethod().is(GET)) { - return doGet(request); + doGet(request, response); + return; } - return doPost(request); + doPost(request, response); } - private HttpResponse doGet(HttpRequest request) { + @Override + protected void doGet(HttpRequest request, HttpResponse response) { if (hasCookie(request)) { - return redirectHome(request); + redirectHome(request, response); + return; } - return showLoginPage(request); + showLoginPage(request, response); } private boolean hasCookie(HttpRequest httpRequest) { @@ -48,36 +52,36 @@ private boolean hasCookie(HttpRequest httpRequest) { return SESSION_MANAGER.findSession(cookie.getValue("JSESSIONID")) != null; } - private HttpResponse redirectHome(HttpRequest request) { + private void redirectHome(HttpRequest request, HttpResponse response) { StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND); ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); - return HttpResponse.builder() + response .statusLine(statusLine) .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(REDIRECT_HOME_URI) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } - private HttpResponse showLoginPage(HttpRequest request) { + private void showLoginPage(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); - return HttpResponse.builder() + response .statusLine(statusLine) .contentType(HTML.getValue()) .contentLength(responseBody.getValue().length()) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } - private HttpResponse doPost(HttpRequest httpRequest) { + @Override + protected void doPost(HttpRequest httpRequest, HttpResponse httpResponse) { Optional optionalUser = findUser(httpRequest); if (optionalUser.isEmpty()) { - return redirectUnauthorized(httpRequest); + redirectUnauthorized(httpRequest, httpResponse); + return; } - return successLogin(httpRequest); + successLogin(httpRequest, httpResponse); } private Optional findUser(HttpRequest request) { @@ -90,29 +94,27 @@ private Optional findUser(HttpRequest request) { .findFirst(); } - private HttpResponse redirectUnauthorized(HttpRequest httpRequest) { + private void redirectUnauthorized(HttpRequest httpRequest, HttpResponse httpResponse) { ResponseBody responseBody = new ResponseBody(FileReader.read(UNAUTHORIZED)); - return HttpResponse.builder() + httpResponse .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.UNAUTHORIZED)) .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(UNAUTHORIZED) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } - private HttpResponse successLogin(HttpRequest httpRequest) { + private void successLogin(HttpRequest httpRequest, HttpResponse httpResponse) { String sessionId = addSession(); ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); - return HttpResponse.builder() + httpResponse .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .setCookie(HttpCookie.jSessionId(sessionId)) .redirect(REDIRECT_HOME_URI) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } private String addSession() { diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index 020225b1c2..fad74cc68b 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -2,6 +2,7 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; +import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpMethod; @@ -13,62 +14,63 @@ import org.apache.coyote.http11.response.StatusLine; import org.apache.coyote.http11.util.FileReader; -public class RegisterController implements Controller { +public class RegisterController extends AbstractController { private static final String REGISTER_URI = "/register.html"; private static final String LOGIN_URI = "/login.html"; @Override - public HttpResponse service(HttpRequest request) { + public void service(HttpRequest request, HttpResponse response) { if (request.getRequestLine().getHttpMethod().is(HttpMethod.GET)) { - return doGet(request); + doGet(request, response); + return; } - return doPost(request); + doPost(request, response); } - private HttpResponse doGet(HttpRequest request) { + @Override + protected void doGet(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(REGISTER_URI)); - return HttpResponse.builder() + response .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } - private HttpResponse doPost(HttpRequest request) { + @Override + protected void doPost(HttpRequest request, HttpResponse response) { RequestBody requestBody = request.getRequestBody(); String account = requestBody.getValueOf("account"); if (InMemoryUserRepository.findByAccount(account).isPresent()) { - return redirectLogin(request); + redirectLogin(request, response); + return; } - return registerUser(request, requestBody); + registerUser(request, requestBody, response); } - private HttpResponse redirectLogin(HttpRequest request) { + private void redirectLogin(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); - return HttpResponse.builder() + response .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(LOGIN_URI) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } - private HttpResponse registerUser(HttpRequest request, RequestBody requestBody) { + private void registerUser(HttpRequest request, RequestBody requestBody, HttpResponse response) { saveUser(requestBody); ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); - return HttpResponse.builder() + response .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.CREATED)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(LOGIN_URI) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } private void saveUser(RequestBody requestBody) { diff --git a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java index 184cff0be1..bd7fdf8700 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java @@ -1,5 +1,6 @@ package nextstep.jwp.controller; +import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; @@ -8,19 +9,18 @@ import org.apache.coyote.http11.response.StatusLine; import org.apache.coyote.http11.util.FileReader; -public class ResourceController implements Controller { +public class ResourceController extends AbstractController { @Override - public HttpResponse service(HttpRequest request) { + public void service(HttpRequest request, HttpResponse response) { String resource = request.getRequestLine().getRequestURI().getResourcePath(); ResponseBody responseBody = new ResponseBody(FileReader.read(resource)); StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); - return HttpResponse.builder() + response .statusLine(statusLine) .contentType(request.contentType().getValue()) .contentLength(responseBody.getValue().getBytes().length) - .responseBody(responseBody) - .build(); + .responseBody(responseBody); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java index 7216d5e454..86dd5bf695 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -14,6 +14,7 @@ import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.ResponseViewer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,9 +46,11 @@ public void process(final Socket connection) { HttpRequest httpRequest = HttpRequest.of(requestHeader, requestBody); Controller frontController = new FrontController(); - HttpResponse httpResponse = frontController.service(httpRequest); + HttpResponse httpResponse = new HttpResponse(); + frontController.service(httpRequest, httpResponse); + ResponseViewer from = ResponseViewer.from(httpResponse); - outputStream.write(httpResponse.getResponse().getBytes()); + outputStream.write(from.getView().getBytes()); outputStream.flush(); } catch (IOException | UncheckedServletException e) { log.error(e.getMessage(), e); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java new file mode 100644 index 0000000000..0c618db1aa --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java @@ -0,0 +1,28 @@ +package org.apache.coyote.http11.controller; + +import org.apache.coyote.http11.request.HttpMethod; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.HttpStatus; +import org.apache.coyote.http11.response.StatusLine; + +public abstract class AbstractController implements Controller { + + @Override + public void service(HttpRequest request, HttpResponse response) { + if (request.getRequestLine().getHttpMethod().is(HttpMethod.GET)) { + doGet(request, response); + return; + } + if (request.getRequestLine().getHttpMethod().is(HttpMethod.POST)) { + doPost(request, response); + return; + } + response.statusLine( + new StatusLine(request.getRequestLine().getVersion(), HttpStatus.NOT_FOUND) + ).redirect("/404.html"); + } + + protected void doPost(HttpRequest request, HttpResponse response) { /* NOOP */ } + protected void doGet(HttpRequest request, HttpResponse response) { /* NOOP */ } +} \ No newline at end of file diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java index 33cd2f6600..afdd497f7a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java @@ -5,6 +5,6 @@ public interface Controller { - HttpResponse service(HttpRequest request); + void service(HttpRequest request, HttpResponse response); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java index fde6aa51d6..a4cb35c2c5 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java @@ -1,83 +1,55 @@ package org.apache.coyote.http11.response; -import java.util.stream.Collectors; import org.apache.coyote.http11.Headers; import org.apache.coyote.http11.cookie.HttpCookie; public class HttpResponse { - private static final String ENTER = "\r\n"; + private StatusLine statusLine; + private Headers headers = Headers.empty(); + private ResponseBody responseBody; - private final StatusLine statusLine; - private final Headers headers; - private final ResponseBody responseBody; - - private HttpResponse(StatusLine statusLine, Headers headers, ResponseBody responseBody) { + public HttpResponse statusLine(StatusLine statusLine) { this.statusLine = statusLine; - this.headers = headers; - this.responseBody = responseBody; + return this; } - public String getResponse() { - String protocolVersion = statusLine.getProtocolVersion(); - int statusCode = statusLine.getHttpStatus().getStatusCode(); - String message = statusLine.getHttpStatus().getMessage(); - String statusLineResponse = - protocolVersion + " " + - statusCode + " " + - message + " " + ENTER; - String headerResponse = headers.getValues().entrySet() - .stream() - .map(header -> header.getKey() + ": " + header.getValue() + " ") - .collect(Collectors.joining(ENTER)); - return statusLineResponse + headerResponse + ENTER + ENTER + responseBody.getValue(); + public HttpResponse redirect(String uri) { + this.headers.add("Location", uri); + return this; } - public static class Builder { - - private StatusLine statusLine; - private Headers headers = Headers.empty(); - private ResponseBody responseBody; - - public Builder statusLine(StatusLine statusLine) { - this.statusLine = statusLine; - return this; - } - - public Builder redirect(String uri) { - this.headers.add("Location", uri); - return this; - } - - public Builder contentType(String contentType) { - this.headers.add("Content-Type", contentType + ";charset=utf-8"); - return this; - } + public HttpResponse contentType(String contentType) { + this.headers.add("Content-Type", contentType + ";charset=utf-8"); + return this; + } - public Builder contentLength(int contentLength) { - this.headers.add("Content-Length", String.valueOf(contentLength)); - return this; - } + public HttpResponse contentLength(int contentLength) { + this.headers.add("Content-Length", String.valueOf(contentLength)); + return this; + } - public Builder setCookie(HttpCookie httpCookie) { - this.headers.setCookie(httpCookie); - return this; - } + public HttpResponse setCookie(HttpCookie httpCookie) { + this.headers.setCookie(httpCookie); + return this; + } - public Builder responseBody(ResponseBody responseBody) { - this.responseBody = responseBody; - return this; - } + public HttpResponse responseBody(ResponseBody responseBody) { + this.responseBody = responseBody; + return this; + } - public HttpResponse build() { - return new HttpResponse(statusLine, headers, responseBody); - } + public StatusLine getStatusLine() { + return statusLine; + } + public Headers getHeaders() { + return headers; } - public static Builder builder() { - return new Builder(); + public ResponseBody getResponseBody() { + return responseBody; } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java new file mode 100644 index 0000000000..fb292e7793 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java @@ -0,0 +1,44 @@ +package org.apache.coyote.http11.response; + +import java.util.stream.Collectors; + +import org.apache.coyote.http11.Headers; + +public class ResponseViewer { + private static final String ENTER = "\r\n"; + private static final String BLANK = " "; + private static final String KEY_VALUE_DELIMITER = ": "; + + private final StatusLine statusLine; + private final Headers headers; + private final ResponseBody responseBody; + + private ResponseViewer(StatusLine statusLine, Headers headers, ResponseBody responseBody) { + this.statusLine = statusLine; + this.headers = headers; + this.responseBody = responseBody; + } + + public static ResponseViewer from(HttpResponse response) { + return new ResponseViewer( + response.getStatusLine(), + response.getHeaders(), + response.getResponseBody() + ); + } + + public String getView() { + String protocolVersion = statusLine.getProtocolVersion(); + int statusCode = statusLine.getHttpStatus().getStatusCode(); + String message = statusLine.getHttpStatus().getMessage(); + + String statusLineResponse = protocolVersion + BLANK + statusCode + BLANK + message + BLANK + ENTER; + + String headerResponse = headers.getValues().entrySet() + .stream() + .map(header -> header.getKey() + KEY_VALUE_DELIMITER + header.getValue() + BLANK) + .collect(Collectors.joining(ENTER)); + return statusLineResponse + headerResponse + ENTER + ENTER + responseBody.getValue(); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java index 1d2a5416ac..6181b7b5c4 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java @@ -1,13 +1,14 @@ package org.apache.coyote.http11.response; public class StatusLine { - private static final String DELIMITER = " "; - private static final int PROTOCOL_VERSION_INDEX = 0; - private static final int STATUS_CODE_INDEX = 1; private final String protocolVersion; private final HttpStatus httpStatus; + public static StatusLine empty() { + return new StatusLine(null, null); + } + public StatusLine(String protocolVersion, HttpStatus httpStatus) { this.protocolVersion = protocolVersion; this.httpStatus = httpStatus; From 4f7f9a1aef9c22dc564f465b577572f87f2af419 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 21:21:13 +0900 Subject: [PATCH 13/29] =?UTF-8?q?refactor:=20ResponseView=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EC=B6=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http11/response/ResponseViewer.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java index fb292e7793..57538964bd 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java @@ -28,17 +28,26 @@ public static ResponseViewer from(HttpResponse response) { } public String getView() { - String protocolVersion = statusLine.getProtocolVersion(); - int statusCode = statusLine.getHttpStatus().getStatusCode(); - String message = statusLine.getHttpStatus().getMessage(); + String responseHeaderView = statusLineToView() + generateHeaderView(); + String responseBodyView = responseBody.getValue(); + return responseHeaderView + ENTER + ENTER + responseBodyView; + } - String statusLineResponse = protocolVersion + BLANK + statusCode + BLANK + message + BLANK + ENTER; + private String statusLineToView() { + return String.format( + "%s %d %s %s", + statusLine.getProtocolVersion(), + statusLine.getHttpStatus().getStatusCode(), + statusLine.getHttpStatus().getMessage(), + ENTER + ); + } - String headerResponse = headers.getValues().entrySet() + private String generateHeaderView() { + return headers.getValues().entrySet() .stream() .map(header -> header.getKey() + KEY_VALUE_DELIMITER + header.getValue() + BLANK) .collect(Collectors.joining(ENTER)); - return statusLineResponse + headerResponse + ENTER + ENTER + responseBody.getValue(); } } From 5d9b50a239363c0363bdeb8d2e0241c1c1430997 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 21:22:36 +0900 Subject: [PATCH 14/29] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/nextstep/jwp/controller/HomeController.java | 1 - .../main/java/nextstep/jwp/controller/LoginController.java | 3 +-- .../java/org/apache/coyote/http11/{ => common}/Headers.java | 4 +--- .../apache/coyote/http11/{cookie => common}/HttpCookie.java | 2 +- .../java/org/apache/coyote/http11/request/HttpRequest.java | 2 +- .../java/org/apache/coyote/http11/response/HttpResponse.java | 4 ++-- .../org/apache/coyote/http11/response/ResponseViewer.java | 2 +- .../java/org/apache/coyote/http11/cookie/HttpCookieTest.java | 1 + 8 files changed, 8 insertions(+), 11 deletions(-) rename tomcat/src/main/java/org/apache/coyote/http11/{ => common}/Headers.java (94%) rename tomcat/src/main/java/org/apache/coyote/http11/{cookie => common}/HttpCookie.java (97%) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java index 91e0e3509a..b0ad03ec47 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -1,7 +1,6 @@ package nextstep.jwp.controller; import org.apache.coyote.http11.controller.AbstractController; -import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index e710460b92..e2d75adeda 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -6,8 +6,7 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.controller.AbstractController; -import org.apache.coyote.http11.controller.Controller; -import org.apache.coyote.http11.cookie.HttpCookie; +import org.apache.coyote.http11.common.HttpCookie; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java b/tomcat/src/main/java/org/apache/coyote/http11/common/Headers.java similarity index 94% rename from tomcat/src/main/java/org/apache/coyote/http11/Headers.java rename to tomcat/src/main/java/org/apache/coyote/http11/common/Headers.java index f4e27b94fc..a2a9560f85 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Headers.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/common/Headers.java @@ -1,12 +1,10 @@ -package org.apache.coyote.http11; +package org.apache.coyote.http11.common; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import org.apache.coyote.http11.cookie.HttpCookie; - public class Headers { private static final int KEY_INDEX = 0; private static final int VALUE_INDEX = 1; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java b/tomcat/src/main/java/org/apache/coyote/http11/common/HttpCookie.java similarity index 97% rename from tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java rename to tomcat/src/main/java/org/apache/coyote/http11/common/HttpCookie.java index 9a45552bfb..ba5b4a46c1 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/cookie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/common/HttpCookie.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.cookie; +package org.apache.coyote.http11.common; import java.util.ArrayList; import java.util.HashMap; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index acaae96391..3adb08cf63 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -2,7 +2,7 @@ import java.util.List; -import org.apache.coyote.http11.Headers; +import org.apache.coyote.http11.common.Headers; public class HttpRequest { private static final int REQUEST_LINE_INDEX = 0; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java index a4cb35c2c5..5b2507e1a0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java @@ -1,8 +1,8 @@ package org.apache.coyote.http11.response; -import org.apache.coyote.http11.Headers; -import org.apache.coyote.http11.cookie.HttpCookie; +import org.apache.coyote.http11.common.Headers; +import org.apache.coyote.http11.common.HttpCookie; public class HttpResponse { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java index 57538964bd..b0007dde2f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java @@ -2,7 +2,7 @@ import java.util.stream.Collectors; -import org.apache.coyote.http11.Headers; +import org.apache.coyote.http11.common.Headers; public class ResponseViewer { private static final String ENTER = "\r\n"; diff --git a/tomcat/src/test/java/org/apache/coyote/http11/cookie/HttpCookieTest.java b/tomcat/src/test/java/org/apache/coyote/http11/cookie/HttpCookieTest.java index 51a4cbfed5..2e77b790d1 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/cookie/HttpCookieTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/cookie/HttpCookieTest.java @@ -1,5 +1,6 @@ package org.apache.coyote.http11.cookie; +import org.apache.coyote.http11.common.HttpCookie; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; From 6ae8dca62907f79454ad14ba055556886b1c07ba Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 21:28:39 +0900 Subject: [PATCH 15/29] =?UTF-8?q?test:=20register=20=EC=9D=B8=EC=88=98?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/Http11ProcessorTest.java | 38 ++++++++++++++++--- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java index ff5e485ea4..cabd38921d 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java @@ -61,11 +61,10 @@ void index() throws IOException { } @Test - @Disabled // set-cookie 설정값 반환이 랜덤하게 되어 수정 필요 void login() throws IOException { // given final String httpRequest = String.join("\r\n", - "GET /login?account=gugu&password=password HTTP/1.1 ", + "GET /login HTTP/1.1 ", "Host: localhost:8080 ", "Connection: keep-alive ", "", @@ -78,11 +77,38 @@ void login() throws IOException { processor.process(socket); // then - final URL resource = getClass().getClassLoader().getResource("static/index.html"); - var expected = "HTTP/1.1 302 FOUND \r\n" + + final URL resource = getClass().getClassLoader().getResource("static/login.html"); + var expected = "HTTP/1.1 200 OK \r\n" + + "Content-Length: 3717 \r\n" + + "Content-Type: text/html;charset=utf-8 \r\n" + + "\r\n" + + new String(Files.readAllBytes(new File(resource.getFile()).toPath()) + ); + + assertThat(socket.output()).isEqualTo(expected); + } + + @Test + void register() throws IOException { + // given + final String httpRequest = String.join("\r\n", + "GET /register HTTP/1.1 ", + "Host: localhost:8080 ", + "Connection: keep-alive ", + "", + ""); + + final var socket = new StubSocket(httpRequest); + final Http11Processor processor = new Http11Processor(socket); + + // when + processor.process(socket); + + // then + final URL resource = getClass().getClassLoader().getResource("static/register.html"); + var expected = "HTTP/1.1 200 OK \r\n" + + "Content-Length: 3717 \r\n" + "Content-Type: text/html;charset=utf-8 \r\n" + - "Content-Length: 5564 \r\n" + - "Location: http://localhost:8080/index.html \r\n" + "\r\n" + new String(Files.readAllBytes(new File(resource.getFile()).toPath()) ); From 0deab4a790c4dc8a6f702ef778a63dd513e8788c Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 21:29:19 +0900 Subject: [PATCH 16/29] =?UTF-8?q?refactor:=20=EC=9E=90=EC=8B=9D=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=EC=84=9C=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=EB=90=98=EB=8A=94=20=EB=B6=84=EA=B8=B0=EC=A0=88=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/jwp/controller/HomeController.java | 4 ++-- .../nextstep/jwp/controller/IndexController.java | 4 ++-- .../nextstep/jwp/controller/LoginController.java | 12 +----------- .../nextstep/jwp/controller/RegisterController.java | 13 +------------ .../nextstep/jwp/controller/ResourceController.java | 3 +-- 5 files changed, 7 insertions(+), 29 deletions(-) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java index b0ad03ec47..726a0fed81 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -12,9 +12,9 @@ public class HomeController extends AbstractController { private static final String DEFAULT_MESSAGE = "Hello world!"; @Override - public void service(HttpRequest request, HttpResponse httpResponse) { + protected void doGet(HttpRequest request, HttpResponse response) { StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); - httpResponse + response .statusLine(statusLine) .contentType(ContentType.HTML.getValue()) .contentLength(DEFAULT_MESSAGE.getBytes().length) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java index fc00541498..6dcd96d683 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java @@ -13,10 +13,10 @@ public class IndexController extends AbstractController { private static final String RESOURCE = "/index.html"; @Override - public void service(HttpRequest request, HttpResponse httpResponse) { + protected void doGet(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(RESOURCE)); StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); - httpResponse + response .statusLine(statusLine) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index e2d75adeda..e019726ea2 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -5,8 +5,8 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.common.HttpCookie; +import org.apache.coyote.http11.controller.AbstractController; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; @@ -18,7 +18,6 @@ import org.apache.coyote.http11.util.FileReader; import static org.apache.coyote.http11.request.ContentType.HTML; -import static org.apache.coyote.http11.request.HttpMethod.GET; public class LoginController extends AbstractController { @@ -28,15 +27,6 @@ public class LoginController extends AbstractController { public static final SessionManager SESSION_MANAGER = new SessionManager(); - @Override - public void service(HttpRequest request, HttpResponse response) { - if (request.getRequestLine().getHttpMethod().is(GET)) { - doGet(request, response); - return; - } - doPost(request, response); - } - @Override protected void doGet(HttpRequest request, HttpResponse response) { if (hasCookie(request)) { diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index fad74cc68b..38569f989d 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -3,9 +3,7 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.controller.AbstractController; -import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.request.ContentType; -import org.apache.coyote.http11.request.HttpMethod; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; @@ -19,20 +17,11 @@ public class RegisterController extends AbstractController { private static final String REGISTER_URI = "/register.html"; private static final String LOGIN_URI = "/login.html"; - @Override - public void service(HttpRequest request, HttpResponse response) { - if (request.getRequestLine().getHttpMethod().is(HttpMethod.GET)) { - doGet(request, response); - return; - } - doPost(request, response); - } - @Override protected void doGet(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(REGISTER_URI)); response - .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) + .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .responseBody(responseBody); diff --git a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java index bd7fdf8700..97a342da28 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java @@ -1,7 +1,6 @@ package nextstep.jwp.controller; import org.apache.coyote.http11.controller.AbstractController; -import org.apache.coyote.http11.controller.Controller; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; import org.apache.coyote.http11.response.HttpStatus; @@ -12,7 +11,7 @@ public class ResourceController extends AbstractController { @Override - public void service(HttpRequest request, HttpResponse response) { + protected void doGet(HttpRequest request, HttpResponse response) { String resource = request.getRequestLine().getRequestURI().getResourcePath(); ResponseBody responseBody = new ResponseBody(FileReader.read(resource)); StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); From 36467c88386c8476ac60db76b271ef1e0956d81f Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 21:48:19 +0900 Subject: [PATCH 17/29] =?UTF-8?q?test:=20=ED=95=99=EC=8A=B5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/thread/stage0/SynchronizationTest.java | 2 +- study/src/test/java/thread/stage0/ThreadPoolsTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/study/src/test/java/thread/stage0/SynchronizationTest.java b/study/src/test/java/thread/stage0/SynchronizationTest.java index 0333c18e3b..b463c2b984 100644 --- a/study/src/test/java/thread/stage0/SynchronizationTest.java +++ b/study/src/test/java/thread/stage0/SynchronizationTest.java @@ -41,7 +41,7 @@ private static final class SynchronizedMethods { private int sum = 0; - public void calculate() { + public synchronized void calculate() { setSum(getSum() + 1); } diff --git a/study/src/test/java/thread/stage0/ThreadPoolsTest.java b/study/src/test/java/thread/stage0/ThreadPoolsTest.java index 238611ebfe..03efdabc8d 100644 --- a/study/src/test/java/thread/stage0/ThreadPoolsTest.java +++ b/study/src/test/java/thread/stage0/ThreadPoolsTest.java @@ -31,8 +31,8 @@ void testNewFixedThreadPool() { executor.submit(logWithSleep("hello fixed thread pools")); // 올바른 값으로 바꿔서 테스트를 통과시키자. - final int expectedPoolSize = 0; - final int expectedQueueSize = 0; + final int expectedPoolSize = 2; + final int expectedQueueSize = 1; assertThat(expectedPoolSize).isEqualTo(executor.getPoolSize()); assertThat(expectedQueueSize).isEqualTo(executor.getQueue().size()); @@ -46,7 +46,7 @@ void testNewCachedThreadPool() { executor.submit(logWithSleep("hello cached thread pools")); // 올바른 값으로 바꿔서 테스트를 통과시키자. - final int expectedPoolSize = 0; + final int expectedPoolSize = 3; final int expectedQueueSize = 0; assertThat(expectedPoolSize).isEqualTo(executor.getPoolSize()); From 554c23636eb0985c697d62c62a7cc42f52d80be1 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 22:04:20 +0900 Subject: [PATCH 18/29] =?UTF-8?q?feat=20:=20threadPool=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/connector/Connector.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java index 3b2c4dda7c..4e01f55746 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -8,6 +8,8 @@ import java.io.UncheckedIOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; public class Connector implements Runnable { @@ -15,15 +17,18 @@ public class Connector implements Runnable { private static final int DEFAULT_PORT = 8080; private static final int DEFAULT_ACCEPT_COUNT = 100; + private static final int MAX_THREAD_POOL = 200; private final ServerSocket serverSocket; + private final ThreadPoolExecutor threadPoolExecutor; private boolean stopped; public Connector() { - this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT); + this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT, MAX_THREAD_POOL); } - public Connector(final int port, final int acceptCount) { + public Connector(final int port, final int acceptCount, final int maxThreads) { + this.threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(maxThreads); this.serverSocket = createServerSocket(port, acceptCount); this.stopped = false; } @@ -67,7 +72,7 @@ private void process(final Socket connection) { return; } var processor = new Http11Processor(connection); - new Thread(processor).start(); + this.threadPoolExecutor.execute(processor); } public void stop() { From c1c4bf6c7fc3120b66ff1234d59c327bcfe91f3b Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 22:06:03 +0900 Subject: [PATCH 19/29] =?UTF-8?q?feat:=20=EB=8F=99=EC=8B=9C=EC=84=B1=20?= =?UTF-8?q?=EB=B3=B4=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=B4=20session?= =?UTF-8?q?=EC=9D=84=20ConcurrentHashMap=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/coyote/http11/session/SessionManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/session/SessionManager.java b/tomcat/src/main/java/org/apache/coyote/http11/session/SessionManager.java index 59cb41de70..1cf1e0fc27 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/session/SessionManager.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/session/SessionManager.java @@ -1,11 +1,11 @@ package org.apache.coyote.http11.session; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class SessionManager { - private static final Map SESSIONS = new HashMap<>(); + private static final Map SESSIONS = new ConcurrentHashMap<>(); public void add(Session session) { SESSIONS.put(session.getId(), session); From 30afd5a0430ba68f197fa6779c223dc71c00c547 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 22:13:27 +0900 Subject: [PATCH 20/29] =?UTF-8?q?test:=20=ED=95=99=EC=8A=B5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/main/resources/application.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/study/src/main/resources/application.yml b/study/src/main/resources/application.yml index 79e552cc2b..0975d9dc1b 100644 --- a/study/src/main/resources/application.yml +++ b/study/src/main/resources/application.yml @@ -3,10 +3,10 @@ handlebars: server: tomcat: - accept-count: 1 - max-connections: 1 + accept-count: 2 # 쓰레드가 사용중일 때, 받은 요청이 대기하는 큐의 최대값 + max-connections: 2 # 서버가 유지할 수 있는 최대 커넥션 수 threads: - max: 2 + max: 2 # 실행가능 쓰레드 수 compression: enabled: true min-response-size : 10 \ No newline at end of file From 876e87c835915146e9df7726a2aca3a770ac0977 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 22:46:14 +0900 Subject: [PATCH 21/29] =?UTF-8?q?fix:=20=EA=B9=A8=EC=A7=80=EB=8A=94=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/Http11ProcessorTest.java | 2 +- .../apache/coyote/http11/HttpRequestTest.java | 50 ------------------- .../http11/request/HttpRequestTest.java | 49 ++++++++++++++++++ .../http11/{ => request}/QueryStringTest.java | 2 +- 4 files changed, 51 insertions(+), 52 deletions(-) delete mode 100644 tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java create mode 100644 tomcat/src/test/java/org/apache/coyote/http11/request/HttpRequestTest.java rename tomcat/src/test/java/org/apache/coyote/http11/{ => request}/QueryStringTest.java (96%) diff --git a/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java index cabd38921d..85f8c6b953 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java @@ -107,7 +107,7 @@ void register() throws IOException { // then final URL resource = getClass().getClassLoader().getResource("static/register.html"); var expected = "HTTP/1.1 200 OK \r\n" + - "Content-Length: 3717 \r\n" + + "Content-Length: 4319 \r\n" + "Content-Type: text/html;charset=utf-8 \r\n" + "\r\n" + new String(Files.readAllBytes(new File(resource.getFile()).toPath()) diff --git a/tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java b/tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java deleted file mode 100644 index d57b968ead..0000000000 --- a/tomcat/src/test/java/org/apache/coyote/http11/HttpRequestTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.apache.coyote.http11; - -import java.util.List; - -import org.apache.coyote.http11.request.ContentType; -import org.apache.coyote.http11.request.HttpRequest; -import org.apache.coyote.http11.request.RequestBody; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayNameGeneration; -import org.junit.jupiter.api.DisplayNameGenerator; -import org.junit.jupiter.api.Test; - -@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -@SuppressWarnings("NonAsciiCharacters") -class HttpRequestTest { - -// @Test -// void Accept_key가_없으면_ConentType은_html이다() { -// // given -// List request = List.of( -// "GET /login.html HTTP/1.1", -// "Host: localhost:8080/login?username=gugu&password=password", -// "Connection: keep-alive"); -// RequestBody requestBody = new RequestBody(); -// -// // when -// HttpRequest httpRequest = HttpRequest.of(request, requestBody); -// -// // then -// Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.HTML); -// } - -// @Test -// void ContentType을_찾을_수_있다() { -// // given -// List request = List.of( -// "GET /zipgo.js HTTP/1.1", -// "Host: zipgo.pet/", -// "Accept: text/javascript,*/*;q=0.1", -// "Connection: keep-alive"); -// -// // when -// HttpRequest httpRequest = HttpRequest.of(request, new RequestBody()); -// -// // then -// Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.JAVASCRIPT); -// } - -} \ No newline at end of file diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/HttpRequestTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/HttpRequestTest.java new file mode 100644 index 0000000000..618886e470 --- /dev/null +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/HttpRequestTest.java @@ -0,0 +1,49 @@ +package org.apache.coyote.http11.request; + +import java.util.List; + +import org.apache.coyote.http11.request.ContentType; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.RequestBody; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayNameGeneration; +import org.junit.jupiter.api.DisplayNameGenerator; +import org.junit.jupiter.api.Test; + +@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) +@SuppressWarnings("NonAsciiCharacters") +class HttpRequestTest { + + @Test + void Accept_key가_없으면_ConentType은_html이다() { + // given + List request = List.of( + "GET /login.html HTTP/1.1", + "Host: localhost:8080/login?username=gugu&password=password", + "Connection: keep-alive"); + + // when + HttpRequest httpRequest = HttpRequest.of(request, RequestBody.from("")); + + // then + Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.HTML); + } + + @Test + void ContentType을_찾을_수_있다() { + // given + List request = List.of( + "GET /zipgo.js HTTP/1.1", + "Host: zipgo.pet/", + "Accept: text/javascript,*/*;q=0.1", + "Connection: keep-alive"); + + // when + HttpRequest httpRequest = HttpRequest.of(request, RequestBody.from("")); + + // then + Assertions.assertThat(httpRequest.contentType()).isEqualTo(ContentType.JAVASCRIPT); + } + +} \ No newline at end of file diff --git a/tomcat/src/test/java/org/apache/coyote/http11/QueryStringTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/QueryStringTest.java similarity index 96% rename from tomcat/src/test/java/org/apache/coyote/http11/QueryStringTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/request/QueryStringTest.java index e8990a20e9..ba6487f522 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/QueryStringTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/QueryStringTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11; +package org.apache.coyote.http11.request; import org.apache.coyote.http11.request.QueryString; import org.junit.jupiter.api.DisplayNameGeneration; From 8b1cb1ef19629d0f405a887098b8b8d71ab47441 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 22:53:21 +0900 Subject: [PATCH 22/29] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/nextstep/jwp/controller/FrontController.java | 5 ++--- .../main/java/nextstep/jwp/controller/HomeController.java | 2 +- .../main/java/nextstep/jwp/controller/IndexController.java | 2 +- .../main/java/nextstep/jwp/controller/LoginController.java | 6 +++--- .../java/nextstep/jwp/controller/RegisterController.java | 2 +- .../java/nextstep/jwp/controller/ResourceController.java | 2 +- .../apache/{coyote/http11/session => catalina}/Session.java | 2 +- .../{coyote/http11/session => catalina}/SessionManager.java | 2 +- .../http11 => catalina}/controller/AbstractController.java | 2 +- .../{coyote/http11 => catalina}/controller/Controller.java | 2 +- .../main/java/org/apache/coyote/http11/Http11Processor.java | 2 +- .../coyote/http11/{cookie => common}/HttpCookieTest.java | 5 ++--- .../apache/coyote/http11/{ => request}/RequestURITest.java | 3 +-- 13 files changed, 17 insertions(+), 20 deletions(-) rename tomcat/src/main/java/org/apache/{coyote/http11/session => catalina}/Session.java (92%) rename tomcat/src/main/java/org/apache/{coyote/http11/session => catalina}/SessionManager.java (91%) rename tomcat/src/main/java/org/apache/{coyote/http11 => catalina}/controller/AbstractController.java (95%) rename tomcat/src/main/java/org/apache/{coyote/http11 => catalina}/controller/Controller.java (82%) rename tomcat/src/test/java/org/apache/coyote/http11/{cookie => common}/HttpCookieTest.java (81%) rename tomcat/src/test/java/org/apache/coyote/http11/{ => request}/RequestURITest.java (93%) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java index e80402cdc9..d62016689e 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java @@ -3,9 +3,8 @@ import java.util.HashMap; import java.util.Map; -import org.apache.coyote.http11.controller.AbstractController; -import org.apache.coyote.http11.controller.Controller; -import org.apache.coyote.http11.request.HttpMethod; +import org.apache.catalina.controller.AbstractController; +import org.apache.catalina.controller.Controller; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java index 726a0fed81..aa408ab06b 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -1,6 +1,6 @@ package nextstep.jwp.controller; -import org.apache.coyote.http11.controller.AbstractController; +import org.apache.catalina.controller.AbstractController; import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java index 6dcd96d683..0d58db003d 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java @@ -1,6 +1,6 @@ package nextstep.jwp.controller; -import org.apache.coyote.http11.controller.AbstractController; +import org.apache.catalina.controller.AbstractController; import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index e019726ea2..02a86937c3 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -6,15 +6,15 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.common.HttpCookie; -import org.apache.coyote.http11.controller.AbstractController; +import org.apache.catalina.controller.AbstractController; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; import org.apache.coyote.http11.response.HttpStatus; import org.apache.coyote.http11.response.ResponseBody; import org.apache.coyote.http11.response.StatusLine; -import org.apache.coyote.http11.session.Session; -import org.apache.coyote.http11.session.SessionManager; +import org.apache.catalina.Session; +import org.apache.catalina.SessionManager; import org.apache.coyote.http11.util.FileReader; import static org.apache.coyote.http11.request.ContentType.HTML; diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index 38569f989d..4f8d289cee 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -2,7 +2,7 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.controller.AbstractController; +import org.apache.catalina.controller.AbstractController; import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; diff --git a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java index 97a342da28..4f32a121d0 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java @@ -1,6 +1,6 @@ package nextstep.jwp.controller; -import org.apache.coyote.http11.controller.AbstractController; +import org.apache.catalina.controller.AbstractController; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; import org.apache.coyote.http11.response.HttpStatus; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/session/Session.java b/tomcat/src/main/java/org/apache/catalina/Session.java similarity index 92% rename from tomcat/src/main/java/org/apache/coyote/http11/session/Session.java rename to tomcat/src/main/java/org/apache/catalina/Session.java index 0b8f8658b5..667a477968 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/session/Session.java +++ b/tomcat/src/main/java/org/apache/catalina/Session.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.session; +package org.apache.catalina; import java.util.HashMap; import java.util.Map; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/session/SessionManager.java b/tomcat/src/main/java/org/apache/catalina/SessionManager.java similarity index 91% rename from tomcat/src/main/java/org/apache/coyote/http11/session/SessionManager.java rename to tomcat/src/main/java/org/apache/catalina/SessionManager.java index 1cf1e0fc27..cef97cf874 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/session/SessionManager.java +++ b/tomcat/src/main/java/org/apache/catalina/SessionManager.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.session; +package org.apache.catalina; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java similarity index 95% rename from tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java rename to tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java index 0c618db1aa..f7dc121a3f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.controller; +package org.apache.catalina.controller; import org.apache.coyote.http11.request.HttpMethod; import org.apache.coyote.http11.request.HttpRequest; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java similarity index 82% rename from tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java rename to tomcat/src/main/java/org/apache/catalina/controller/Controller.java index afdd497f7a..db637f850d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.controller; +package org.apache.catalina.controller; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java index 86dd5bf695..fb513eda3a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -10,7 +10,7 @@ import nextstep.jwp.controller.FrontController; import nextstep.jwp.exception.UncheckedServletException; import org.apache.coyote.Processor; -import org.apache.coyote.http11.controller.Controller; +import org.apache.catalina.controller.Controller; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/test/java/org/apache/coyote/http11/cookie/HttpCookieTest.java b/tomcat/src/test/java/org/apache/coyote/http11/common/HttpCookieTest.java similarity index 81% rename from tomcat/src/test/java/org/apache/coyote/http11/cookie/HttpCookieTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/common/HttpCookieTest.java index 2e77b790d1..95be5d232f 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/cookie/HttpCookieTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/common/HttpCookieTest.java @@ -1,6 +1,5 @@ -package org.apache.coyote.http11.cookie; +package org.apache.coyote.http11.common; -import org.apache.coyote.http11.common.HttpCookie; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; @@ -17,7 +16,7 @@ class HttpCookieTest { String jSessionId = "656cef62-e3c4-40bc-a8df-94732920ed46"; // when - HttpCookie httpCookie = HttpCookie.from("yummy_cookie=choco; JSESSIONID=656cef62-e3c4-40bc-a8df-94732920ed46"); + HttpCookie httpCookie = HttpCookie.from("yummy_cookie=choco; JSESSIONID=" + jSessionId); // then assertThat(httpCookie.getValue("JSESSIONID")).isEqualTo(jSessionId); diff --git a/tomcat/src/test/java/org/apache/coyote/http11/RequestURITest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/RequestURITest.java similarity index 93% rename from tomcat/src/test/java/org/apache/coyote/http11/RequestURITest.java rename to tomcat/src/test/java/org/apache/coyote/http11/request/RequestURITest.java index bd8dd74ef3..97d25f2650 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/RequestURITest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/RequestURITest.java @@ -1,6 +1,5 @@ -package org.apache.coyote.http11; +package org.apache.coyote.http11.request; -import org.apache.coyote.http11.request.RequestURI; import org.junit.jupiter.api.DisplayNameGeneration; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.Test; From 3231f0d2cc81e9bff8c40a0559d2e2c89f643c57 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 22:58:00 +0900 Subject: [PATCH 23/29] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=EC=8A=A4?= =?UTF-8?q?=EB=A9=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/nextstep/jwp/controller/FrontController.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java index d62016689e..0eb6021cf2 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java @@ -26,8 +26,4 @@ public void service(HttpRequest request, HttpResponse response) { controller.service(request, response); } - protected void doPost(HttpRequest request, HttpResponse response) { /* NOOP */ } - - protected void doGet(HttpRequest request, HttpResponse response) { /* NOOP */ } - } From 9893af2347a108bd9fae13aaf85fd753156ef042 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 23:46:44 +0900 Subject: [PATCH 24/29] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/coyote/http11/request/HttpRequest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index 3adb08cf63..c0914ea43e 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -41,10 +41,6 @@ public RequestLine getRequestLine() { return requestLine; } - public String getHeaderCookie() { - return headers.getValue("Cookie"); - } - public RequestBody getRequestBody() { return requestBody; } From 0b905047a33b229244d3055d310f80b86870a027 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 23:49:32 +0900 Subject: [PATCH 25/29] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/coyote/http11/response/ResponseViewer.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java index b0007dde2f..9178fd874f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseViewer.java @@ -28,12 +28,13 @@ public static ResponseViewer from(HttpResponse response) { } public String getView() { - String responseHeaderView = statusLineToView() + generateHeaderView(); - String responseBodyView = responseBody.getValue(); - return responseHeaderView + ENTER + ENTER + responseBodyView; + String statusView = generateStatusLineView(); + String headersView = generateHeadersView(); + String bodyView = responseBody.getValue(); + return statusView + headersView + ENTER + ENTER + bodyView; } - private String statusLineToView() { + private String generateStatusLineView() { return String.format( "%s %d %s %s", statusLine.getProtocolVersion(), @@ -43,7 +44,7 @@ private String statusLineToView() { ); } - private String generateHeaderView() { + private String generateHeadersView() { return headers.getValues().entrySet() .stream() .map(header -> header.getKey() + KEY_VALUE_DELIMITER + header.getValue() + BLANK) From 8c06beb92d366f251aedfd87912f51f078e475ca Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sat, 9 Sep 2023 23:50:15 +0900 Subject: [PATCH 26/29] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/coyote/http11/response/StatusLine.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java index 6181b7b5c4..85112612ce 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/StatusLine.java @@ -5,10 +5,6 @@ public class StatusLine { private final String protocolVersion; private final HttpStatus httpStatus; - public static StatusLine empty() { - return new StatusLine(null, null); - } - public StatusLine(String protocolVersion, HttpStatus httpStatus) { this.protocolVersion = protocolVersion; this.httpStatus = httpStatus; From 71b256b04eb9f4800fe2768210b791c34c9ffdae Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sun, 10 Sep 2023 00:01:12 +0900 Subject: [PATCH 27/29] =?UTF-8?q?refactor:=20=EC=97=B0=EB=8B=AC=EC=95=84?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20getter=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwp/controller/FrontController.java | 2 +- .../jwp/controller/HomeController.java | 2 +- .../jwp/controller/IndexController.java | 2 +- .../jwp/controller/LoginController.java | 8 ++++---- .../jwp/controller/RegisterController.java | 6 +++--- .../jwp/controller/ResourceController.java | 4 ++-- .../controller/AbstractController.java | 18 ++++++++++++------ .../coyote/http11/request/HttpMethod.java | 2 +- .../coyote/http11/request/HttpRequest.java | 16 ++++++++++++++++ .../coyote/http11/request/RequestLine.java | 12 ++++++++++-- .../coyote/http11/request/RequestURI.java | 4 ---- .../coyote/http11/request/HttpMethodTest.java | 4 ++-- 12 files changed, 53 insertions(+), 27 deletions(-) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java index 0eb6021cf2..493763b3e4 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/FrontController.java @@ -21,7 +21,7 @@ public class FrontController extends AbstractController { @Override public void service(HttpRequest request, HttpResponse response) { - String uri = request.getRequestLine().getRequestURI().getUri(); + String uri = request.getResourceUri(); Controller controller = URIS.getOrDefault(uri, new ResourceController()); controller.service(request, response); } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java index aa408ab06b..e7ce108bef 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -13,7 +13,7 @@ public class HomeController extends AbstractController { @Override protected void doGet(HttpRequest request, HttpResponse response) { - StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); response .statusLine(statusLine) .contentType(ContentType.HTML.getValue()) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java index 0d58db003d..30c5403b99 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java @@ -15,7 +15,7 @@ public class IndexController extends AbstractController { @Override protected void doGet(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(RESOURCE)); - StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); response .statusLine(statusLine) .contentType(ContentType.HTML.getValue()) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index 02a86937c3..1b5cc24460 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -42,7 +42,7 @@ private boolean hasCookie(HttpRequest httpRequest) { } private void redirectHome(HttpRequest request, HttpResponse response) { - StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND); + StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.FOUND); ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); response .statusLine(statusLine) @@ -54,7 +54,7 @@ private void redirectHome(HttpRequest request, HttpResponse response) { private void showLoginPage(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(URI)); - StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); response .statusLine(statusLine) .contentType(HTML.getValue()) @@ -86,7 +86,7 @@ private Optional findUser(HttpRequest request) { private void redirectUnauthorized(HttpRequest httpRequest, HttpResponse httpResponse) { ResponseBody responseBody = new ResponseBody(FileReader.read(UNAUTHORIZED)); httpResponse - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.UNAUTHORIZED)) + .statusLine(new StatusLine(httpRequest.getProtocolVersion(), HttpStatus.UNAUTHORIZED)) .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(UNAUTHORIZED) @@ -98,7 +98,7 @@ private void successLogin(HttpRequest httpRequest, HttpResponse httpResponse) { ResponseBody responseBody = new ResponseBody(FileReader.read(REDIRECT_HOME_URI)); httpResponse - .statusLine(new StatusLine(httpRequest.getRequestLine().getVersion(), HttpStatus.FOUND)) + .statusLine(new StatusLine(httpRequest.getProtocolVersion(), HttpStatus.FOUND)) .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .setCookie(HttpCookie.jSessionId(sessionId)) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index 4f8d289cee..6226a94b4f 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -21,7 +21,7 @@ public class RegisterController extends AbstractController { protected void doGet(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(REGISTER_URI)); response - .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK)) + .statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.OK)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .responseBody(responseBody); @@ -43,7 +43,7 @@ protected void doPost(HttpRequest request, HttpResponse response) { private void redirectLogin(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); response - .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.FOUND)) + .statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.FOUND)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(LOGIN_URI) @@ -55,7 +55,7 @@ private void registerUser(HttpRequest request, RequestBody requestBody, HttpResp ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); response - .statusLine(new StatusLine(request.getRequestLine().getVersion(), HttpStatus.CREATED)) + .statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.CREATED)) .contentType(ContentType.HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(LOGIN_URI) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java index 4f32a121d0..6a43da3c7c 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/ResourceController.java @@ -12,9 +12,9 @@ public class ResourceController extends AbstractController { @Override protected void doGet(HttpRequest request, HttpResponse response) { - String resource = request.getRequestLine().getRequestURI().getResourcePath(); + String resource = request.getResourcePath(); ResponseBody responseBody = new ResponseBody(FileReader.read(resource)); - StatusLine statusLine = new StatusLine(request.getRequestLine().getVersion(), HttpStatus.OK); + StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); response .statusLine(statusLine) .contentType(request.contentType().getValue()) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java index f7dc121a3f..29ebdd8cdc 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java @@ -6,23 +6,29 @@ import org.apache.coyote.http11.response.HttpStatus; import org.apache.coyote.http11.response.StatusLine; +import static org.apache.coyote.http11.request.HttpMethod.GET; +import static org.apache.coyote.http11.request.HttpMethod.POST; + public abstract class AbstractController implements Controller { @Override public void service(HttpRequest request, HttpResponse response) { - if (request.getRequestLine().getHttpMethod().is(HttpMethod.GET)) { + if (request.isMethod(GET)) { doGet(request, response); return; } - if (request.getRequestLine().getHttpMethod().is(HttpMethod.POST)) { + if (request.isMethod(POST)) { doPost(request, response); return; } - response.statusLine( - new StatusLine(request.getRequestLine().getVersion(), HttpStatus.NOT_FOUND) - ).redirect("/404.html"); + doDefault(request, response); } - protected void doPost(HttpRequest request, HttpResponse response) { /* NOOP */ } protected void doGet(HttpRequest request, HttpResponse response) { /* NOOP */ } + + protected void doPost(HttpRequest request, HttpResponse response) { /* NOOP */ } + private void doDefault(HttpRequest request, HttpResponse response) { + response.statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.NOT_FOUND)) + .redirect("/404.html"); + } } \ No newline at end of file diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java index a28aab877e..1c1c5c78c6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpMethod.java @@ -15,7 +15,7 @@ public static HttpMethod from(String methodName) { .orElse(GET); } - public boolean is(HttpMethod other) { + public boolean isSameTo(HttpMethod other) { return this == other; } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index c0914ea43e..0ce2e41e16 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -37,6 +37,18 @@ public ContentType contentType() { return ContentType.from(headers.getValue(CONTENT_TYPE_KEY)); } + public String getProtocolVersion() { + return requestLine.getVersion(); + } + + public String getResourceUri(){ + return requestLine.getRequestURI().getUri(); + } + + public String getResourcePath(){ + return requestLine.getResourcePath(); + } + public RequestLine getRequestLine() { return requestLine; } @@ -45,4 +57,8 @@ public RequestBody getRequestBody() { return requestBody; } + public boolean isMethod(HttpMethod httpMethod) { + return requestLine.isMethod(httpMethod); + } + } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java index 4ca1eebc18..abd6910860 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestLine.java @@ -25,8 +25,16 @@ public static RequestLine from(String request) { ); } - public HttpMethod getHttpMethod() { - return httpMethod; + public boolean isMethod(HttpMethod other) { + return this.httpMethod.isSameTo(other); + } + + public String getResourcePath() { + return requestURI.getResourcePath(); + } + + public String getResourceUri() { + return requestURI.getUri(); } public RequestURI getRequestURI() { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java index 50f4f125d0..f478abeed5 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestURI.java @@ -38,10 +38,6 @@ public String getResourcePath() { return resourcePath; } - public QueryString getQueryString() { - return queryString; - } - public String getUri() { return uri; } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java index ffb0bab93f..74ddd01b3f 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/HttpMethodTest.java @@ -38,8 +38,8 @@ class HttpMethodTest { @Test void 같은지_검증_가능() { assertAll( - () -> Assertions.assertThat(HttpMethod.POST.is(HttpMethod.POST)).isTrue(), - () -> Assertions.assertThat(HttpMethod.GET.is(HttpMethod.POST)).isFalse() + () -> Assertions.assertThat(HttpMethod.POST.isSameTo(HttpMethod.POST)).isTrue(), + () -> Assertions.assertThat(HttpMethod.GET.isSameTo(HttpMethod.POST)).isFalse() ); } From 49af628136d92167039e055e0c4b9e2ba741aac4 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sun, 10 Sep 2023 00:03:02 +0900 Subject: [PATCH 28/29] =?UTF-8?q?chore:=20static=20import=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/jwp/controller/HomeController.java | 6 ++++-- .../java/nextstep/jwp/controller/IndexController.java | 5 +++-- .../java/nextstep/jwp/controller/RegisterController.java | 9 +++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java index e7ce108bef..693ff795b9 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/HomeController.java @@ -1,13 +1,15 @@ package nextstep.jwp.controller; import org.apache.catalina.controller.AbstractController; -import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; import org.apache.coyote.http11.response.HttpStatus; import org.apache.coyote.http11.response.ResponseBody; import org.apache.coyote.http11.response.StatusLine; +import static org.apache.coyote.http11.request.ContentType.HTML; + + public class HomeController extends AbstractController { private static final String DEFAULT_MESSAGE = "Hello world!"; @@ -16,7 +18,7 @@ protected void doGet(HttpRequest request, HttpResponse response) { StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); response .statusLine(statusLine) - .contentType(ContentType.HTML.getValue()) + .contentType(HTML.getValue()) .contentLength(DEFAULT_MESSAGE.getBytes().length) .responseBody(new ResponseBody(DEFAULT_MESSAGE)); } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java index 30c5403b99..fe3a255565 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/IndexController.java @@ -1,7 +1,6 @@ package nextstep.jwp.controller; import org.apache.catalina.controller.AbstractController; -import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; import org.apache.coyote.http11.response.HttpStatus; @@ -9,6 +8,8 @@ import org.apache.coyote.http11.response.StatusLine; import org.apache.coyote.http11.util.FileReader; +import static org.apache.coyote.http11.request.ContentType.HTML; + public class IndexController extends AbstractController { private static final String RESOURCE = "/index.html"; @@ -18,7 +19,7 @@ protected void doGet(HttpRequest request, HttpResponse response) { StatusLine statusLine = new StatusLine(request.getProtocolVersion(), HttpStatus.OK); response .statusLine(statusLine) - .contentType(ContentType.HTML.getValue()) + .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .responseBody(responseBody); } diff --git a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index 6226a94b4f..48747a9593 100644 --- a/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -3,7 +3,6 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.catalina.controller.AbstractController; -import org.apache.coyote.http11.request.ContentType; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.response.HttpResponse; @@ -12,6 +11,8 @@ import org.apache.coyote.http11.response.StatusLine; import org.apache.coyote.http11.util.FileReader; +import static org.apache.coyote.http11.request.ContentType.HTML; + public class RegisterController extends AbstractController { private static final String REGISTER_URI = "/register.html"; @@ -22,7 +23,7 @@ protected void doGet(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(REGISTER_URI)); response .statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.OK)) - .contentType(ContentType.HTML.getValue()) + .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .responseBody(responseBody); } @@ -44,7 +45,7 @@ private void redirectLogin(HttpRequest request, HttpResponse response) { ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); response .statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.FOUND)) - .contentType(ContentType.HTML.getValue()) + .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(LOGIN_URI) .responseBody(responseBody); @@ -56,7 +57,7 @@ private void registerUser(HttpRequest request, RequestBody requestBody, HttpResp ResponseBody responseBody = new ResponseBody(FileReader.read(LOGIN_URI)); response .statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.CREATED)) - .contentType(ContentType.HTML.getValue()) + .contentType(HTML.getValue()) .contentLength(responseBody.getValue().getBytes().length) .redirect(LOGIN_URI) .responseBody(responseBody); From d33e781b8a8a7676007ab4d6db417d4d3fdda5e2 Mon Sep 17 00:00:00 2001 From: iamjooon2 Date: Sun, 10 Sep 2023 00:07:38 +0900 Subject: [PATCH 29/29] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/controller/AbstractController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java index 29ebdd8cdc..688be949ff 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java @@ -1,6 +1,5 @@ package org.apache.catalina.controller; -import org.apache.coyote.http11.request.HttpMethod; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; import org.apache.coyote.http11.response.HttpStatus; @@ -27,6 +26,7 @@ public void service(HttpRequest request, HttpResponse response) { protected void doGet(HttpRequest request, HttpResponse response) { /* NOOP */ } protected void doPost(HttpRequest request, HttpResponse response) { /* NOOP */ } + private void doDefault(HttpRequest request, HttpResponse response) { response.statusLine(new StatusLine(request.getProtocolVersion(), HttpStatus.NOT_FOUND)) .redirect("/404.html");