From 38bce8f33d05cf4c5d31ab582f4298575342053c Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 14:42:32 +0900 Subject: [PATCH 01/25] =?UTF-8?q?refactor:=20request=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/coyote/http11/Http11Processor.java | 48 ++++-------------- .../http11/request/HttpRequestGenerator.java | 50 +++++++++++++++++++ .../apache/coyote/http11/request/Request.java | 35 +++++++++++++ .../request/handler/RequestHandler.java | 16 +++--- .../request/handler/RequestHandlerTest.java | 19 ++++--- 5 files changed, 116 insertions(+), 52 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/request/Request.java 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 1068c76102..58f40da215 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -6,14 +6,11 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; -import java.util.ArrayList; -import java.util.List; import nextstep.jwp.exception.UncheckedServletException; import org.apache.coyote.Processor; -import org.apache.coyote.http11.request.body.RequestBody; +import org.apache.coyote.http11.request.HttpRequestGenerator; +import org.apache.coyote.http11.request.Request; import org.apache.coyote.http11.request.handler.RequestHandler; -import org.apache.coyote.http11.request.header.RequestHeader; -import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.HttpResponseGenerator; import org.apache.coyote.http11.response.ResponseEntity; import org.slf4j.Logger; @@ -24,7 +21,8 @@ public class Http11Processor implements Runnable, Processor { private static final Logger LOG = LoggerFactory.getLogger(Http11Processor.class); private final Socket connection; - private final HttpResponseGenerator httpResponseGenerator = new HttpResponseGenerator(); + private final HttpRequestGenerator requestGenerator = new HttpRequestGenerator(); + private final HttpResponseGenerator responseGenerator = new HttpResponseGenerator(); private final RequestHandler requestHandler = new RequestHandler(); public Http11Processor(Socket connection) { @@ -42,11 +40,11 @@ public void process(final Socket connection) { try (final InputStream inputStream = connection.getInputStream(); final OutputStream outputStream = connection.getOutputStream(); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - final String firstLine = bufferedReader.readLine(); - if (firstLine == null) { - return; - } - final String response = getResponse(bufferedReader, firstLine); + + final Request request = requestGenerator.generate(bufferedReader); + final ResponseEntity responseEntity = requestHandler.getResponse(request); + final String response = responseGenerator.generate(responseEntity); + outputStream.write(response.getBytes()); outputStream.flush(); } catch (IOException | UncheckedServletException e) { @@ -54,32 +52,4 @@ public void process(final Socket connection) { } } - private String getResponse(BufferedReader bufferedReader, String firstLine) throws IOException { - final RequestLine requestLine = RequestLine.from(firstLine); - final RequestHeader requestHeader = getHeader(bufferedReader); - final RequestBody requestBody = getBody(bufferedReader, requestHeader); - final ResponseEntity responseEntity = requestHandler.getResponse(requestLine, requestHeader, requestBody); - return httpResponseGenerator.generate(responseEntity); - } - - private RequestHeader getHeader(final BufferedReader bufferedReader) throws IOException { - List requestHeaders = new ArrayList<>(); - for (String line = bufferedReader.readLine(); !"".equals(line); line = bufferedReader.readLine()) { - requestHeaders.add(line); - } - return RequestHeader.from(requestHeaders); - } - - private RequestBody getBody(final BufferedReader bufferedReader, final RequestHeader requestHeader) - throws IOException { - List contentLengths = requestHeader.headers().get("Content-Length"); - if (contentLengths == null) { - return RequestBody.from(null); - } - int contentLength = Integer.parseInt(contentLengths.get(0)); - char[] buffer = new char[contentLength]; - bufferedReader.read(buffer, 0, contentLength); - return RequestBody.from(new String(buffer)); - } - } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java new file mode 100644 index 0000000000..b7ba417b51 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java @@ -0,0 +1,50 @@ +package org.apache.coyote.http11.request; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.apache.coyote.http11.request.body.RequestBody; +import org.apache.coyote.http11.request.header.RequestHeader; +import org.apache.coyote.http11.request.line.RequestLine; + +public class HttpRequestGenerator { + + private Request request; + + public Request generate(BufferedReader bufferedReader) throws IOException { + final String firstLine = bufferedReader.readLine(); + if (firstLine == null) { + return null; + } + final RequestLine requestLine = RequestLine.from(firstLine); + final RequestHeader requestHeader = getHeader(bufferedReader); + final RequestBody requestBody = getBody(bufferedReader, requestHeader); + return Request.of(requestLine, requestHeader, requestBody); + } + + public Request request() { + return request; + } + + private RequestHeader getHeader(final BufferedReader bufferedReader) throws IOException { + List requestHeaders = new ArrayList<>(); + for (String line = bufferedReader.readLine(); !"".equals(line); line = bufferedReader.readLine()) { + requestHeaders.add(line); + } + return RequestHeader.from(requestHeaders); + } + + private RequestBody getBody(final BufferedReader bufferedReader, final RequestHeader requestHeader) + throws IOException { + List contentLengths = requestHeader.headers().get("Content-Length"); + if (contentLengths == null) { + return RequestBody.from(null); + } + int contentLength = Integer.parseInt(contentLengths.get(0)); + char[] buffer = new char[contentLength]; + bufferedReader.read(buffer, 0, contentLength); + return RequestBody.from(new String(buffer)); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java b/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java new file mode 100644 index 0000000000..190b2db25c --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java @@ -0,0 +1,35 @@ +package org.apache.coyote.http11.request; + +import org.apache.coyote.http11.request.body.RequestBody; +import org.apache.coyote.http11.request.header.RequestHeader; +import org.apache.coyote.http11.request.line.RequestLine; + +public class Request { + + private final RequestLine requestLine; + private final RequestHeader requestHeader; + private final RequestBody requestBody; + + private Request(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { + this.requestLine = requestLine; + this.requestHeader = requestHeader; + this.requestBody = requestBody; + } + + public static Request of(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { + return new Request(requestLine, requestHeader, requestBody); + } + + public RequestLine requestLine() { + return requestLine; + } + + public RequestHeader requestHeader() { + return requestHeader; + } + + public RequestBody requestBody() { + return requestBody; + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/request/handler/RequestHandler.java index 8c1baae462..f10181ac5d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/handler/RequestHandler.java @@ -1,6 +1,7 @@ package org.apache.coyote.http11.request.handler; import org.apache.coyote.http11.auth.AuthService; +import org.apache.coyote.http11.request.Request; import org.apache.coyote.http11.request.body.RequestBody; import org.apache.coyote.http11.request.header.RequestHeader; import org.apache.coyote.http11.request.line.Protocol; @@ -14,13 +15,14 @@ public class RequestHandler { private final AuthService authService = new AuthService(); - public ResponseEntity getResponse( - RequestLine requestLine, - RequestHeader requestHeader, - RequestBody requestBody - ) { - Protocol protocol = requestLine.protocol(); - final String path = requestLine.path().defaultPath(); + public ResponseEntity getResponse(Request request) { + final RequestLine requestLine = request.requestLine(); + final RequestHeader requestHeader = request.requestHeader(); + final RequestBody requestBody = request.requestBody(); + + final Protocol protocol = request.requestLine().protocol(); + final String path = request.requestLine().path().defaultPath(); + if (path.equals("/login")) { return authService.login(requestLine, requestHeader, requestBody); } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java index b981fe31ab..71efa03ea7 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java @@ -6,6 +6,7 @@ import org.apache.coyote.http11.auth.Cookie; import org.apache.coyote.http11.auth.Session; import org.apache.coyote.http11.auth.SessionRepository; +import org.apache.coyote.http11.request.Request; import org.apache.coyote.http11.request.body.RequestBody; import org.apache.coyote.http11.request.header.RequestHeader; import org.apache.coyote.http11.request.line.HttpMethod; @@ -72,10 +73,11 @@ void getLoginResponseEntity() { RequestLine requestLine = requestLine_생성(GET, "/login"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); + Request request = Request.of(requestLine, requestHeader, requestBody); SessionRepository.clearSessions(); // when - ResponseEntity response = requestHandler.getResponse(requestLine, requestHeader, requestBody); + ResponseEntity response = requestHandler.getResponse(request); // then assertAll( @@ -98,9 +100,10 @@ void getFoundResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/login"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); + Request request = Request.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(requestLine, requestHeader, requestBody); + ResponseEntity response = requestHandler.getResponse(request); // then assertAll( @@ -118,9 +121,10 @@ void getUnauthorizedResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/login"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); + Request request = Request.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(requestLine, requestHeader, requestBody); + ResponseEntity response = requestHandler.getResponse(request); // then assertAll( @@ -146,9 +150,10 @@ void getRegisterResponseEntity() { RequestLine requestLine = requestLine_생성(GET, "/register"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); + Request request = Request.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(requestLine, requestHeader, requestBody); + ResponseEntity response = requestHandler.getResponse(request); // then assertAll( @@ -171,9 +176,10 @@ void getConflictResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/register"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); + Request request = Request.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(requestLine, requestHeader, requestBody); + ResponseEntity response = requestHandler.getResponse(request); // then assertAll( @@ -189,9 +195,10 @@ void getFoundResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/register"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); + Request request = Request.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(requestLine, requestHeader, requestBody); + ResponseEntity response = requestHandler.getResponse(request); // then assertAll( From a5ed40395b403e3226b320470271a55de330c32a Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 14:59:29 +0900 Subject: [PATCH 02/25] =?UTF-8?q?refactor:=20=EB=A7=A4=EC=A7=81=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/coyote/http11/Http11Processor.java | 5 ++--- .../org/apache/coyote/http11/auth/AuthService.java | 10 +++++----- .../coyote/http11/request/HttpRequestGenerator.java | 12 +++++++----- .../http11/response/HttpResponseGenerator.java | 6 ++++-- 4 files changed, 18 insertions(+), 15 deletions(-) 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 58f40da215..64b19c434f 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 org.apache.coyote.Processor; import org.apache.coyote.http11.request.HttpRequestGenerator; import org.apache.coyote.http11.request.Request; -import org.apache.coyote.http11.request.handler.RequestHandler; +import org.apache.coyote.http11.request.RequestHandler; import org.apache.coyote.http11.response.HttpResponseGenerator; import org.apache.coyote.http11.response.ResponseEntity; import org.slf4j.Logger; @@ -21,7 +21,6 @@ public class Http11Processor implements Runnable, Processor { private static final Logger LOG = LoggerFactory.getLogger(Http11Processor.class); private final Socket connection; - private final HttpRequestGenerator requestGenerator = new HttpRequestGenerator(); private final HttpResponseGenerator responseGenerator = new HttpResponseGenerator(); private final RequestHandler requestHandler = new RequestHandler(); @@ -41,7 +40,7 @@ public void process(final Socket connection) { final OutputStream outputStream = connection.getOutputStream(); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - final Request request = requestGenerator.generate(bufferedReader); + final Request request = HttpRequestGenerator.generate(bufferedReader); final ResponseEntity responseEntity = requestHandler.getResponse(request); final String response = responseGenerator.generate(responseEntity); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java index bd5b63f59b..10745b678b 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java @@ -2,8 +2,8 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.request.body.RequestBody; -import org.apache.coyote.http11.request.header.RequestHeader; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.Location; @@ -22,7 +22,7 @@ public class AuthService { private static final String LOGIN_PAGE = "/login.html"; private static final String CONFLICT_PAGE = "/409.html"; private static final String UNAUTHORIZED_PAGE = "/401.html"; - private static final String COOKIE_NAME = "JSESSIONID"; + public static final String SESSION_KEY = "JSESSIONID"; private final SessionRepository sessionRepository = new SessionRepository(); @@ -30,7 +30,7 @@ public ResponseEntity login(RequestLine requestLine, RequestHeader requestHeader Protocol protocol = requestLine.protocol(); if (requestLine.method().isGet()) { final Cookie cookie = requestHeader.getCookie(); - final Session session = sessionRepository.getSession(cookie.get(COOKIE_NAME)); + final Session session = sessionRepository.getSession(cookie.get(SESSION_KEY)); if (session == null) { return ResponseEntity.getCookieNullResponseEntity(protocol, OK, Location.from(LOGIN_PAGE)); } @@ -49,7 +49,7 @@ public ResponseEntity login(RequestLine requestLine, RequestHeader requestHeader private ResponseEntity getSuccessLoginResponse(final User user, final Protocol protocol) { ResponseEntity response = ResponseEntity.getCookieNullResponseEntity(protocol, FOUND, Location.from(INDEX_PAGE)); - String jsessionid = response.getHttpCookie().get("JSESSIONID"); + String jsessionid = response.getHttpCookie().get(SESSION_KEY); final Session session = Session.from(jsessionid); session.setAttribute("user", user); sessionRepository.create(session); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java index b7ba417b51..0594d04246 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java @@ -4,15 +4,17 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.coyote.http11.request.body.RequestBody; -import org.apache.coyote.http11.request.header.RequestHeader; import org.apache.coyote.http11.request.line.RequestLine; public class HttpRequestGenerator { private Request request; - public Request generate(BufferedReader bufferedReader) throws IOException { + private HttpRequestGenerator(Request request) { + this.request = request; + } + + public static Request generate(BufferedReader bufferedReader) throws IOException { final String firstLine = bufferedReader.readLine(); if (firstLine == null) { return null; @@ -27,7 +29,7 @@ public Request request() { return request; } - private RequestHeader getHeader(final BufferedReader bufferedReader) throws IOException { + private static RequestHeader getHeader(final BufferedReader bufferedReader) throws IOException { List requestHeaders = new ArrayList<>(); for (String line = bufferedReader.readLine(); !"".equals(line); line = bufferedReader.readLine()) { requestHeaders.add(line); @@ -35,7 +37,7 @@ private RequestHeader getHeader(final BufferedReader bufferedReader) throws IOEx return RequestHeader.from(requestHeaders); } - private RequestBody getBody(final BufferedReader bufferedReader, final RequestHeader requestHeader) + private static RequestBody getBody(final BufferedReader bufferedReader, final RequestHeader requestHeader) throws IOException { List contentLengths = requestHeader.headers().get("Content-Length"); if (contentLengths == null) { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java index 339c87c5dc..64c37c3e99 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java @@ -9,13 +9,15 @@ public class HttpResponseGenerator { public static final String CRLF = "\r\n"; public static final String BLANK = " "; + public static final String CSS_FILE_SUFFIX = ".css"; + public static final String DEFAULT_RESPONSE_BODY = "Hello world!"; private final ClassLoader classLoader = ClassLoader.getSystemClassLoader(); public String generate(final ResponseEntity responseEntity) throws IOException { final String location = responseEntity.getLocation(); if (location.equals("/")) { - return generateResponse(responseEntity, "Hello world!"); + return generateResponse(responseEntity, DEFAULT_RESPONSE_BODY); } if (responseEntity.getHttpStatus() == HttpStatus.FOUND) { return generateRedirectResponse(responseEntity); @@ -40,7 +42,7 @@ private String generateHttpStatusLine(final String protocol, final HttpStatus ht } private String generateContentTypeLine(final String location) { - if (location.endsWith(".css")) { + if (location.endsWith(CSS_FILE_SUFFIX)) { return "Content-Type: text/css;charset=utf-8 "; } return "Content-Type: text/html;charset=utf-8 "; From 63b77a4dada6cc95b1d8557835ebbeb3bea02330 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 14:59:42 +0900 Subject: [PATCH 03/25] =?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 --- .../org/apache/coyote/http11/request/Request.java | 2 -- .../coyote/http11/request/{body => }/RequestBody.java | 2 +- .../http11/request/{handler => }/RequestHandler.java | 5 +---- .../http11/request/{header => }/RequestHeader.java | 11 ++++++++--- .../org/apache/coyote/http11/request/line/Path.java | 6 ++++-- .../coyote/http11/request/line/RequestLine.java | 10 +++++++--- .../apache/coyote/http11/auth/AuthServiceTest.java | 4 ++-- .../org/apache/coyote/http11/auth/CookieTest.java | 2 +- .../coyote/http11/request/body/RequestBodyTest.java | 1 + .../http11/request/handler/RequestHandlerTest.java | 7 +++---- .../request/request/headers/RequestHeaderTest.java | 2 +- 11 files changed, 29 insertions(+), 23 deletions(-) rename tomcat/src/main/java/org/apache/coyote/http11/request/{body => }/RequestBody.java (96%) rename tomcat/src/main/java/org/apache/coyote/http11/request/{handler => }/RequestHandler.java (84%) rename tomcat/src/main/java/org/apache/coyote/http11/request/{header => }/RequestHeader.java (82%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java b/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java index 190b2db25c..6810681b63 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java @@ -1,7 +1,5 @@ package org.apache.coyote.http11.request; -import org.apache.coyote.http11.request.body.RequestBody; -import org.apache.coyote.http11.request.header.RequestHeader; import org.apache.coyote.http11.request.line.RequestLine; public class Request { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/body/RequestBody.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java similarity index 96% rename from tomcat/src/main/java/org/apache/coyote/http11/request/body/RequestBody.java rename to tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java index caaeaf8245..8599d43746 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/body/RequestBody.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestBody.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.request.body; +package org.apache.coyote.http11.request; import java.util.Arrays; import java.util.Map; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java similarity index 84% rename from tomcat/src/main/java/org/apache/coyote/http11/request/handler/RequestHandler.java rename to tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java index f10181ac5d..35bff07989 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java @@ -1,9 +1,6 @@ -package org.apache.coyote.http11.request.handler; +package org.apache.coyote.http11.request; import org.apache.coyote.http11.auth.AuthService; -import org.apache.coyote.http11.request.Request; -import org.apache.coyote.http11.request.body.RequestBody; -import org.apache.coyote.http11.request.header.RequestHeader; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.Location; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/header/RequestHeader.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java similarity index 82% rename from tomcat/src/main/java/org/apache/coyote/http11/request/header/RequestHeader.java rename to tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java index 4e8b86db87..7423818972 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/header/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.request.header; +package org.apache.coyote.http11.request; import java.util.HashMap; import java.util.List; @@ -11,6 +11,8 @@ public class RequestHeader { + private static final int KEY_INDEX = 0; + private static final int VALUE_INDEX = 1; private static final String COOKIE_HEADER = "Cookie"; private final Map> headers; @@ -27,8 +29,11 @@ private static Map> convertKeyAndValue(List headers Map> keyAndValues = new HashMap<>(); for (String header : headers) { List keyAndValue = asList(header.split(":")); - String key = keyAndValue.get(0); - List values = removalSpace(asList(keyAndValue.get(1).split(","))); + + String key = keyAndValue.get(KEY_INDEX); + String value = keyAndValue.get(VALUE_INDEX); + + List values = removalSpace(asList(value.split(","))); keyAndValues.put(key, values); } return keyAndValues; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/line/Path.java b/tomcat/src/main/java/org/apache/coyote/http11/request/line/Path.java index 88132e35ce..37e2c06510 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/line/Path.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/line/Path.java @@ -7,6 +7,8 @@ public class Path { private static final String DEFAULT_URL_QUERY_STRING_SEPARATOR = "\\?"; + private static final int KEY_INDEX = 0; + private static final int VALUE_INDEX = 1; private final DefaultPath defaultPath; private final QueryString queryString; @@ -19,9 +21,9 @@ private Path(DefaultPath defaultPath, QueryString queryString) { public static Path from(String path) { String[] paths = path.split(DEFAULT_URL_QUERY_STRING_SEPARATOR); if (paths.length == 1) { - return new Path(DefaultPath.from(paths[0]), QueryString.from(null)); + return new Path(DefaultPath.from(paths[KEY_INDEX]), QueryString.from(null)); } - return new Path(DefaultPath.from(paths[0]), QueryString.from(paths[1])); + return new Path(DefaultPath.from(paths[KEY_INDEX]), QueryString.from(paths[VALUE_INDEX])); } public String defaultPath() { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/line/RequestLine.java b/tomcat/src/main/java/org/apache/coyote/http11/request/line/RequestLine.java index a2e6b2ee21..4a7b76a69b 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/line/RequestLine.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/line/RequestLine.java @@ -5,6 +5,10 @@ public class RequestLine { + private static final int HTTP_METHOD_INDEX = 0; + private static final int PATH_INDEX = 1; + private static final int PROTOCOL_INDEX = 2; + private final HttpMethod method; private final Path path; private final Protocol protocol; @@ -17,9 +21,9 @@ private RequestLine(HttpMethod method, Path path, Protocol protocol) { public static RequestLine from(String requestLine) { List requestLineElements = Arrays.asList(requestLine.split(" ")); - HttpMethod method = HttpMethod.from(requestLineElements.get(0)); - Path path = Path.from(requestLineElements.get(1)); - Protocol protocol = Protocol.from(requestLineElements.get(2)); + HttpMethod method = HttpMethod.from(requestLineElements.get(HTTP_METHOD_INDEX)); + Path path = Path.from(requestLineElements.get(PATH_INDEX)); + Protocol protocol = Protocol.from(requestLineElements.get(PROTOCOL_INDEX)); return new RequestLine(method, path, protocol); } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/AuthServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/AuthServiceTest.java index 9df7d6671c..18c171b068 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/AuthServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/AuthServiceTest.java @@ -3,8 +3,8 @@ import java.util.List; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.request.body.RequestBody; -import org.apache.coyote.http11.request.header.RequestHeader; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.ResponseEntity; diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java index 3f771a6d7a..a26d16f212 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java @@ -1,7 +1,7 @@ package org.apache.coyote.http11.auth; import java.util.List; -import org.apache.coyote.http11.request.body.RequestBody; +import org.apache.coyote.http11.request.RequestBody; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/body/RequestBodyTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/body/RequestBodyTest.java index 6d79737a9f..7ad2183f1c 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/body/RequestBodyTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/body/RequestBodyTest.java @@ -1,5 +1,6 @@ package org.apache.coyote.http11.request.body; +import org.apache.coyote.http11.request.RequestBody; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java index 71efa03ea7..e17b3876fa 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java @@ -3,12 +3,11 @@ import java.util.List; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.auth.Cookie; -import org.apache.coyote.http11.auth.Session; import org.apache.coyote.http11.auth.SessionRepository; import org.apache.coyote.http11.request.Request; -import org.apache.coyote.http11.request.body.RequestBody; -import org.apache.coyote.http11.request.header.RequestHeader; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.RequestHandler; +import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.ResponseEntity; diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/RequestHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/RequestHeaderTest.java index c458e23eb7..26d90b62f7 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/RequestHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/RequestHeaderTest.java @@ -1,7 +1,7 @@ package org.apache.coyote.http11.request.request.headers; import java.util.List; -import org.apache.coyote.http11.request.header.RequestHeader; +import org.apache.coyote.http11.request.RequestHeader; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; From 89ebd54b6c116771de7ecfc6a890325550999bf4 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 15:13:36 +0900 Subject: [PATCH 04/25] =?UTF-8?q?refactor:=20Status=20Code=EC=99=80=20Redi?= =?UTF-8?q?rect=20URL=20Enum=EC=9C=BC=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 --- .../coyote/http11/auth/AuthService.java | 31 +++++++---------- .../apache/coyote/http11/request/Page.java | 34 +++++++++++++++++++ .../http11/response/ResponseEntity.java | 12 +++++-- 3 files changed, 56 insertions(+), 21 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/request/Page.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java index 10745b678b..68d34e2485 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java @@ -6,22 +6,17 @@ import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.Location; import org.apache.coyote.http11.response.ResponseEntity; +import static org.apache.coyote.http11.request.Page.CONFLICT_PAGE; +import static org.apache.coyote.http11.request.Page.INDEX_PAGE; +import static org.apache.coyote.http11.request.Page.LOGIN_PAGE; +import static org.apache.coyote.http11.request.Page.REGISTER_PAGE; +import static org.apache.coyote.http11.request.Page.UNAUTHORIZED_PAGE; import static org.apache.coyote.http11.request.line.HttpMethod.GET; -import static org.apache.coyote.http11.response.HttpStatus.CONFLICT; -import static org.apache.coyote.http11.response.HttpStatus.FOUND; -import static org.apache.coyote.http11.response.HttpStatus.OK; -import static org.apache.coyote.http11.response.HttpStatus.UNAUTHORIZED; public class AuthService { - private static final String INDEX_PAGE = "/index.html"; - private static final String REGISTER_PAGE = "/register.html"; - private static final String LOGIN_PAGE = "/login.html"; - private static final String CONFLICT_PAGE = "/409.html"; - private static final String UNAUTHORIZED_PAGE = "/401.html"; public static final String SESSION_KEY = "JSESSIONID"; private final SessionRepository sessionRepository = new SessionRepository(); @@ -32,9 +27,9 @@ public ResponseEntity login(RequestLine requestLine, RequestHeader requestHeader final Cookie cookie = requestHeader.getCookie(); final Session session = sessionRepository.getSession(cookie.get(SESSION_KEY)); if (session == null) { - return ResponseEntity.getCookieNullResponseEntity(protocol, OK, Location.from(LOGIN_PAGE)); + return ResponseEntity.getCookieNullResponseEntity(protocol, LOGIN_PAGE); } - return ResponseEntity.getCookieNullResponseEntity(protocol, FOUND, Location.from(INDEX_PAGE)); + return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); } final String account = requestBody.getBy("account"); @@ -42,13 +37,11 @@ public ResponseEntity login(RequestLine requestLine, RequestHeader requestHeader return InMemoryUserRepository.findByAccount(account) .filter(user -> user.checkPassword(password)) .map(user -> getSuccessLoginResponse(user, protocol)) - .orElseGet(() -> ResponseEntity.getCookieNullResponseEntity(protocol, UNAUTHORIZED, - Location.from(UNAUTHORIZED_PAGE))); + .orElseGet(() -> ResponseEntity.getCookieNullResponseEntity(protocol, UNAUTHORIZED_PAGE)); } private ResponseEntity getSuccessLoginResponse(final User user, final Protocol protocol) { - ResponseEntity response = ResponseEntity.getCookieNullResponseEntity(protocol, FOUND, - Location.from(INDEX_PAGE)); + ResponseEntity response = ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); String jsessionid = response.getHttpCookie().get(SESSION_KEY); final Session session = Session.from(jsessionid); session.setAttribute("user", user); @@ -59,18 +52,18 @@ private ResponseEntity getSuccessLoginResponse(final User user, final Protocol p public ResponseEntity register(final RequestLine requestLine, final RequestBody requestBody) { Protocol protocol = requestLine.protocol(); if (requestLine.method() == GET) { - return ResponseEntity.getCookieNullResponseEntity(protocol, OK, Location.from(REGISTER_PAGE)); + return ResponseEntity.getCookieNullResponseEntity(protocol, REGISTER_PAGE); } final String account = requestBody.getBy("account"); if (InMemoryUserRepository.findByAccount(account).isPresent()) { - return ResponseEntity.getCookieNullResponseEntity(protocol, CONFLICT, Location.from(CONFLICT_PAGE)); + return ResponseEntity.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); } final String email = requestBody.getBy("email"); final String password = requestBody.getBy("password"); InMemoryUserRepository.save(new User(account, password, email)); - return ResponseEntity.getCookieNullResponseEntity(protocol, FOUND, Location.from(INDEX_PAGE)); + return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/Page.java b/tomcat/src/main/java/org/apache/coyote/http11/request/Page.java new file mode 100644 index 0000000000..a3e432d5dd --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/Page.java @@ -0,0 +1,34 @@ +package org.apache.coyote.http11.request; + +import org.apache.coyote.http11.response.HttpStatus; + +import static org.apache.coyote.http11.response.HttpStatus.CONFLICT; +import static org.apache.coyote.http11.response.HttpStatus.FOUND; +import static org.apache.coyote.http11.response.HttpStatus.OK; +import static org.apache.coyote.http11.response.HttpStatus.UNAUTHORIZED; + +public enum Page { + + INDEX_PAGE("/index.html", FOUND), + REGISTER_PAGE("/register.html", OK), + LOGIN_PAGE("/login.html", OK), + CONFLICT_PAGE("/409.html", CONFLICT), + UNAUTHORIZED_PAGE("/401.html", UNAUTHORIZED); + + private final String redirectUrl; + private final HttpStatus statusCode; + + Page(String redirectUrl, HttpStatus statusCode) { + this.redirectUrl = redirectUrl; + this.statusCode = statusCode; + } + + public String redirectUrl() { + return redirectUrl; + } + + public HttpStatus statusCode() { + return statusCode; + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java index dc6c785118..605f5330dc 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java @@ -1,6 +1,7 @@ package org.apache.coyote.http11.response; import org.apache.coyote.http11.auth.Cookie; +import org.apache.coyote.http11.request.Page; import org.apache.coyote.http11.request.line.Protocol; public class ResponseEntity { @@ -19,10 +20,17 @@ public ResponseEntity(Protocol protocol, HttpStatus httpStatus, Cookie cookie, L public static ResponseEntity getCookieNullResponseEntity( final Protocol protocol, - final HttpStatus httpStatus, + final Page page + ) { + return new ResponseEntity(protocol, page.statusCode(), Cookie.from(null), Location.from(page.redirectUrl())); + } + + public static ResponseEntity getCookieNullResponseEntity( + final Protocol protocol, + final HttpStatus status, final Location location ) { - return new ResponseEntity(protocol, httpStatus, Cookie.from(null), location); + return new ResponseEntity(protocol, status, Cookie.from(null), location); } public String getProtocol() { From fb57afd82a4f13b619e28f97bf0f7eb53b37c7b7 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 15:20:34 +0900 Subject: [PATCH 05/25] =?UTF-8?q?refactor:=20AuthService=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/auth/AuthService.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java index 68d34e2485..b33178bcc0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java @@ -24,16 +24,23 @@ public class AuthService { public ResponseEntity login(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { Protocol protocol = requestLine.protocol(); if (requestLine.method().isGet()) { - final Cookie cookie = requestHeader.getCookie(); - final Session session = sessionRepository.getSession(cookie.get(SESSION_KEY)); - if (session == null) { - return ResponseEntity.getCookieNullResponseEntity(protocol, LOGIN_PAGE); - } - return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); + return getLoginOrIndexResponse(requestHeader, protocol); } - final String account = requestBody.getBy("account"); final String password = requestBody.getBy("password"); + return getLoginOrElseUnAuthorizedResponse(protocol, account, password); + } + + private ResponseEntity getLoginOrIndexResponse(RequestHeader requestHeader, Protocol protocol) { + final Cookie cookie = requestHeader.getCookie(); + final Session session = sessionRepository.getSession(cookie.get(SESSION_KEY)); + if (session == null) { + return ResponseEntity.getCookieNullResponseEntity(protocol, LOGIN_PAGE); + } + return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); + } + + private ResponseEntity getLoginOrElseUnAuthorizedResponse(Protocol protocol, String account, String password) { return InMemoryUserRepository.findByAccount(account) .filter(user -> user.checkPassword(password)) .map(user -> getSuccessLoginResponse(user, protocol)) @@ -54,7 +61,12 @@ public ResponseEntity register(final RequestLine requestLine, final RequestBody if (requestLine.method() == GET) { return ResponseEntity.getCookieNullResponseEntity(protocol, REGISTER_PAGE); } + return getIndexOrConflictResponse(requestBody, protocol); + + } + private static ResponseEntity getIndexOrConflictResponse(RequestBody requestBody, + Protocol protocol) { final String account = requestBody.getBy("account"); if (InMemoryUserRepository.findByAccount(account).isPresent()) { return ResponseEntity.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); From 221dae974bb128b8f935c1f569283557ff4ac7d9 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 15:23:17 +0900 Subject: [PATCH 06/25] =?UTF-8?q?refactor:=20ResponsePage=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/coyote/http11/auth/AuthService.java | 13 ++++++------- .../coyote/http11/response/ResponseEntity.java | 5 ++--- .../Page.java => response/ResponsePage.java} | 6 +++--- 3 files changed, 11 insertions(+), 13 deletions(-) rename tomcat/src/main/java/org/apache/coyote/http11/{request/Page.java => response/ResponsePage.java} (86%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java index b33178bcc0..c619f1c07a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java @@ -8,11 +8,11 @@ import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.ResponseEntity; -import static org.apache.coyote.http11.request.Page.CONFLICT_PAGE; -import static org.apache.coyote.http11.request.Page.INDEX_PAGE; -import static org.apache.coyote.http11.request.Page.LOGIN_PAGE; -import static org.apache.coyote.http11.request.Page.REGISTER_PAGE; -import static org.apache.coyote.http11.request.Page.UNAUTHORIZED_PAGE; +import static org.apache.coyote.http11.response.ResponsePage.CONFLICT_PAGE; +import static org.apache.coyote.http11.response.ResponsePage.INDEX_PAGE; +import static org.apache.coyote.http11.response.ResponsePage.LOGIN_PAGE; +import static org.apache.coyote.http11.response.ResponsePage.REGISTER_PAGE; +import static org.apache.coyote.http11.response.ResponsePage.UNAUTHORIZED_PAGE; import static org.apache.coyote.http11.request.line.HttpMethod.GET; public class AuthService { @@ -65,8 +65,7 @@ public ResponseEntity register(final RequestLine requestLine, final RequestBody } - private static ResponseEntity getIndexOrConflictResponse(RequestBody requestBody, - Protocol protocol) { + private static ResponseEntity getIndexOrConflictResponse(RequestBody requestBody, Protocol protocol) { final String account = requestBody.getBy("account"); if (InMemoryUserRepository.findByAccount(account).isPresent()) { return ResponseEntity.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java index 605f5330dc..56eb14e979 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java @@ -1,7 +1,6 @@ package org.apache.coyote.http11.response; import org.apache.coyote.http11.auth.Cookie; -import org.apache.coyote.http11.request.Page; import org.apache.coyote.http11.request.line.Protocol; public class ResponseEntity { @@ -20,9 +19,9 @@ public ResponseEntity(Protocol protocol, HttpStatus httpStatus, Cookie cookie, L public static ResponseEntity getCookieNullResponseEntity( final Protocol protocol, - final Page page + final ResponsePage responsePage ) { - return new ResponseEntity(protocol, page.statusCode(), Cookie.from(null), Location.from(page.redirectUrl())); + return new ResponseEntity(protocol, responsePage.statusCode(), Cookie.from(null), Location.from(responsePage.redirectUrl())); } public static ResponseEntity getCookieNullResponseEntity( diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/Page.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponsePage.java similarity index 86% rename from tomcat/src/main/java/org/apache/coyote/http11/request/Page.java rename to tomcat/src/main/java/org/apache/coyote/http11/response/ResponsePage.java index a3e432d5dd..78d658668c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/Page.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponsePage.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.request; +package org.apache.coyote.http11.response; import org.apache.coyote.http11.response.HttpStatus; @@ -7,7 +7,7 @@ import static org.apache.coyote.http11.response.HttpStatus.OK; import static org.apache.coyote.http11.response.HttpStatus.UNAUTHORIZED; -public enum Page { +public enum ResponsePage { INDEX_PAGE("/index.html", FOUND), REGISTER_PAGE("/register.html", OK), @@ -18,7 +18,7 @@ public enum Page { private final String redirectUrl; private final HttpStatus statusCode; - Page(String redirectUrl, HttpStatus statusCode) { + ResponsePage(String redirectUrl, HttpStatus statusCode) { this.redirectUrl = redirectUrl; this.statusCode = statusCode; } From 9789bb47fd5a36014d39438fddcec77c65df33d5 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 16:20:38 +0900 Subject: [PATCH 07/25] =?UTF-8?q?refactor:=20Login,=20Register=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4,=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/auth/LoginController.java | 20 ++++ .../{AuthService.java => LoginService.java} | 26 +---- .../http11/auth/RegisterController.java | 17 +++ .../coyote/http11/auth/RegisterService.java | 38 +++++++ .../coyote/http11/request/RequestHandler.java | 19 ++-- ...ServiceTest.java => LoginServiceTest.java} | 76 +------------ .../http11/auth/RegisterServiceTest.java | 105 ++++++++++++++++++ 7 files changed, 193 insertions(+), 108 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java rename tomcat/src/main/java/org/apache/coyote/http11/auth/{AuthService.java => LoginService.java} (67%) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java rename tomcat/src/test/java/org/apache/coyote/http11/auth/{AuthServiceTest.java => LoginServiceTest.java} (58%) create mode 100644 tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java new file mode 100644 index 0000000000..44f4024981 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java @@ -0,0 +1,20 @@ +package org.apache.coyote.http11.auth; + +import org.apache.coyote.http11.request.Request; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.RequestHeader; +import org.apache.coyote.http11.request.line.RequestLine; +import org.apache.coyote.http11.response.ResponseEntity; + +public class LoginController { + + private final LoginService loginService = new LoginService(); + + public ResponseEntity login(Request request) { + final RequestLine requestLine = request.requestLine(); + final RequestHeader requestHeader = request.requestHeader(); + final RequestBody requestBody = request.requestBody(); + return loginService.login(requestLine, requestHeader, requestBody); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java similarity index 67% rename from tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java rename to tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java index c619f1c07a..da9130b47c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/AuthService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java @@ -8,14 +8,11 @@ import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.ResponseEntity; -import static org.apache.coyote.http11.response.ResponsePage.CONFLICT_PAGE; import static org.apache.coyote.http11.response.ResponsePage.INDEX_PAGE; import static org.apache.coyote.http11.response.ResponsePage.LOGIN_PAGE; -import static org.apache.coyote.http11.response.ResponsePage.REGISTER_PAGE; import static org.apache.coyote.http11.response.ResponsePage.UNAUTHORIZED_PAGE; -import static org.apache.coyote.http11.request.line.HttpMethod.GET; -public class AuthService { +public class LoginService { public static final String SESSION_KEY = "JSESSIONID"; @@ -56,25 +53,4 @@ private ResponseEntity getSuccessLoginResponse(final User user, final Protocol p return response; } - public ResponseEntity register(final RequestLine requestLine, final RequestBody requestBody) { - Protocol protocol = requestLine.protocol(); - if (requestLine.method() == GET) { - return ResponseEntity.getCookieNullResponseEntity(protocol, REGISTER_PAGE); - } - return getIndexOrConflictResponse(requestBody, protocol); - - } - - private static ResponseEntity getIndexOrConflictResponse(RequestBody requestBody, Protocol protocol) { - final String account = requestBody.getBy("account"); - if (InMemoryUserRepository.findByAccount(account).isPresent()) { - return ResponseEntity.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); - } - - final String email = requestBody.getBy("email"); - final String password = requestBody.getBy("password"); - InMemoryUserRepository.save(new User(account, password, email)); - return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); - } - } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java new file mode 100644 index 0000000000..4844aa57c5 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java @@ -0,0 +1,17 @@ +package org.apache.coyote.http11.auth; + +import org.apache.coyote.http11.request.Request; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.line.RequestLine; +import org.apache.coyote.http11.response.ResponseEntity; + +public class RegisterController { + + private final RegisterService registerService = new RegisterService(); + public ResponseEntity register(Request request) { + final RequestLine requestLine = request.requestLine(); + final RequestBody requestBody = request.requestBody(); + return registerService.register(requestLine, requestBody); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java new file mode 100644 index 0000000000..733ca3d42f --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java @@ -0,0 +1,38 @@ +package org.apache.coyote.http11.auth; + +import nextstep.jwp.db.InMemoryUserRepository; +import nextstep.jwp.model.User; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.line.Protocol; +import org.apache.coyote.http11.request.line.RequestLine; +import org.apache.coyote.http11.response.ResponseEntity; + +import static org.apache.coyote.http11.request.line.HttpMethod.GET; +import static org.apache.coyote.http11.response.ResponsePage.CONFLICT_PAGE; +import static org.apache.coyote.http11.response.ResponsePage.INDEX_PAGE; +import static org.apache.coyote.http11.response.ResponsePage.REGISTER_PAGE; + +public class RegisterService { + + public ResponseEntity register(final RequestLine requestLine, final RequestBody requestBody) { + Protocol protocol = requestLine.protocol(); + if (requestLine.method() == GET) { + return ResponseEntity.getCookieNullResponseEntity(protocol, REGISTER_PAGE); + } + return getIndexOrConflictResponse(requestBody, protocol); + + } + + private static ResponseEntity getIndexOrConflictResponse(RequestBody requestBody, Protocol protocol) { + final String account = requestBody.getBy("account"); + if (InMemoryUserRepository.findByAccount(account).isPresent()) { + return ResponseEntity.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); + } + + final String email = requestBody.getBy("email"); + final String password = requestBody.getBy("password"); + InMemoryUserRepository.save(new User(account, password, email)); + return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java index 35bff07989..979d44deba 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java @@ -1,8 +1,8 @@ package org.apache.coyote.http11.request; -import org.apache.coyote.http11.auth.AuthService; +import org.apache.coyote.http11.auth.LoginController; +import org.apache.coyote.http11.auth.RegisterController; import org.apache.coyote.http11.request.line.Protocol; -import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.Location; import org.apache.coyote.http11.response.ResponseEntity; @@ -10,21 +10,18 @@ public class RequestHandler { - private final AuthService authService = new AuthService(); + private final RegisterController registerController = new RegisterController(); + private final LoginController loginController = new LoginController(); public ResponseEntity getResponse(Request request) { - final RequestLine requestLine = request.requestLine(); - final RequestHeader requestHeader = request.requestHeader(); - final RequestBody requestBody = request.requestBody(); - final Protocol protocol = request.requestLine().protocol(); final String path = request.requestLine().path().defaultPath(); - if (path.equals("/login")) { - return authService.login(requestLine, requestHeader, requestBody); - } if (path.equals("/register")) { - return authService.register(requestLine, requestBody); + return registerController.register(request); + } + if (path.equals("/login")) { + return loginController.login(request); } return ResponseEntity.getCookieNullResponseEntity(protocol, OK, Location.from(path)); } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/AuthServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java similarity index 58% rename from tomcat/src/test/java/org/apache/coyote/http11/auth/AuthServiceTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java index 18c171b068..01b7880360 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/AuthServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java @@ -22,9 +22,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; -class AuthServiceTest { +class LoginServiceTest { - private final AuthService authService = new AuthService(); + private final LoginService loginService = new LoginService(); @BeforeEach void setUp() { @@ -73,7 +73,7 @@ void getFoundResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - ResponseEntity response = authService.login(requestLine, requestHeader, requestBody); + ResponseEntity response = loginService.login(requestLine, requestHeader, requestBody); // then assertAll( @@ -93,7 +93,7 @@ void getUnauthorizedResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - ResponseEntity response = authService.login(requestLine, requestHeader, requestBody); + ResponseEntity response = loginService.login(requestLine, requestHeader, requestBody); // then assertAll( @@ -106,74 +106,6 @@ void getUnauthorizedResponseEntity() { } - @Nested - class path가_register면 { - - @Nested - class HTTP_METHOD_GET { - - @Test - @DisplayName("REGISTER Response를 반환한다.") - void getRegisterResponseEntity() { - // given - RequestLine requestLine = requestLine_생성(GET, "/register"); - RequestBody requestBody = requestBody_생성(); - - // when - ResponseEntity response = authService.register(requestLine, requestBody); - - // then - assertAll( - () -> assertThat(response.getHttpStatus()).isEqualTo(OK), - () -> assertThat(response.getLocation()).isEqualTo("/register.html") - ); - } - - } - - @Nested - class HTTP_METHOD_POST { - - @Test - @DisplayName("CONFLICT Response를 반환한다.") - void getConflictResponseEntity() { - // given - InMemoryUserRepository.save(new User(1L, "베베", "password", "rltgjqmduftlagl@gmail.com")); - - RequestLine requestLine = requestLine_생성(POST, "/register"); - RequestBody requestBody = requestBody_생성(); - - // when - ResponseEntity response = authService.register(requestLine, requestBody); - - // then - assertAll( - () -> assertThat(response.getHttpStatus()).isEqualTo(CONFLICT), - () -> assertThat(response.getLocation()).isEqualTo("/409.html") - ); - } - - @Test - @DisplayName("FOUND Response를 반환한다.") - void getFoundResponseEntity() { - // given - RequestLine requestLine = requestLine_생성(POST, "/register"); - RequestBody requestBody = requestBody_생성(); - - // when - ResponseEntity response = authService.register(requestLine, requestBody); - - // then - assertAll( - () -> assertThat(response.getHttpStatus()).isEqualTo(FOUND), - () -> assertThat(response.getLocation()).isEqualTo("/index.html") - ); - } - - } - - } - } } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java new file mode 100644 index 0000000000..6a0e2192b6 --- /dev/null +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java @@ -0,0 +1,105 @@ +package org.apache.coyote.http11.auth; + +import java.util.List; +import nextstep.jwp.db.InMemoryUserRepository; +import nextstep.jwp.model.User; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.RequestHeader; +import org.apache.coyote.http11.request.line.HttpMethod; +import org.apache.coyote.http11.request.line.RequestLine; +import org.apache.coyote.http11.response.ResponseEntity; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static org.apache.coyote.http11.request.line.HttpMethod.GET; +import static org.apache.coyote.http11.request.line.HttpMethod.POST; +import static org.apache.coyote.http11.response.HttpStatus.CONFLICT; +import static org.apache.coyote.http11.response.HttpStatus.FOUND; +import static org.apache.coyote.http11.response.HttpStatus.OK; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +public class RegisterServiceTest { + + private final RegisterService registerService = new RegisterService(); + + @Nested + class path가_register면 { + + public RequestLine requestLine_생성(HttpMethod httpMethod, String defaultPath) { + return RequestLine.from(httpMethod.name() + " " + defaultPath + " " + "HTTP/1.1"); + } + + public RequestBody requestBody_생성() { + String body = "account=베베&password=password&email=mazzi%40woowahan.com"; + return RequestBody.from(body); + } + + @Nested + class HTTP_METHOD_GET { + + @Test + @DisplayName("REGISTER Response를 반환한다.") + void getRegisterResponseEntity() { + // given + RequestLine requestLine = requestLine_생성(GET, "/register"); + RequestBody requestBody = requestBody_생성(); + + // when + ResponseEntity response = registerService.register(requestLine, requestBody); + + // then + assertAll( + () -> assertThat(response.getHttpStatus()).isEqualTo(OK), + () -> assertThat(response.getLocation()).isEqualTo("/register.html") + ); + } + + } + + @Nested + class HTTP_METHOD_POST { + + @Test + @DisplayName("CONFLICT Response를 반환한다.") + void getConflictResponseEntity() { + // given + InMemoryUserRepository.save(new User(1L, "베베", "password", "rltgjqmduftlagl@gmail.com")); + + RequestLine requestLine = requestLine_생성(POST, "/register"); + RequestBody requestBody = requestBody_생성(); + + // when + ResponseEntity response = registerService.register(requestLine, requestBody); + + // then + assertAll( + () -> assertThat(response.getHttpStatus()).isEqualTo(CONFLICT), + () -> assertThat(response.getLocation()).isEqualTo("/409.html") + ); + } + + @Test + @DisplayName("FOUND Response를 반환한다.") + void getFoundResponseEntity() { + // given + InMemoryUserRepository.deleteAll(); + RequestLine requestLine = requestLine_생성(POST, "/register"); + RequestBody requestBody = requestBody_생성(); + + // when + ResponseEntity response = registerService.register(requestLine, requestBody); + + // then + assertAll( + () -> assertThat(response.getHttpStatus()).isEqualTo(FOUND), + () -> assertThat(response.getLocation()).isEqualTo("/index.html") + ); + } + + } + + } + +} From 2f58f2a8772671a8cdf2e8d2710c23187105e4c8 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 17:01:18 +0900 Subject: [PATCH 08/25] =?UTF-8?q?refactor:=20=EC=8A=A4=EB=A0=88=EB=93=9C?= =?UTF-8?q?=20=ED=92=80=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/catalina/connector/Connector.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) 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 e7bed868d0..0484bbd420 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -4,6 +4,14 @@ import java.io.UncheckedIOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import org.apache.coyote.http11.Http11Processor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,8 +22,12 @@ 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 = 250; + private static final int CORE_POOL_SIZE = 10; + private static final Long KEEP_ALIVE_TIME = 60L; private final ServerSocket serverSocket; + private final ThreadPoolExecutor threadPoolExecutor; private boolean stopped; public Connector() { @@ -24,6 +36,12 @@ public Connector() { public Connector(final int port, final int acceptCount) { this.serverSocket = createServerSocket(port, acceptCount); + this.threadPoolExecutor = new ThreadPoolExecutor( + CORE_POOL_SIZE, + MAX_THREAD, + KEEP_ALIVE_TIME, + TimeUnit.SECONDS, + new LinkedBlockingQueue<>(DEFAULT_ACCEPT_COUNT)); this.stopped = false; } @@ -66,13 +84,14 @@ private void process(final Socket connection) { return; } var processor = new Http11Processor(connection); - new Thread(processor).start(); + threadPoolExecutor.execute(processor); } public void stop() { stopped = true; try { serverSocket.close(); + threadPoolExecutor.shutdown(); } catch (IOException e) { log.error(e.getMessage(), e); } From 2d402780da3478b769df6e321e9306f225f787b4 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 17:25:11 +0900 Subject: [PATCH 09/25] =?UTF-8?q?refactor:=20null=EC=9D=B4=EB=A9=B4=20Conc?= =?UTF-8?q?urrentHashMap=EC=97=90=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC?= =?UTF-8?q?=20=EB=84=A3=EC=A7=80=20=EC=95=8A=EB=8A=94=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/connector/Connector.java | 4 ++-- .../org/apache/coyote/http11/auth/SessionRepository.java | 9 ++++++++- 2 files changed, 10 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 0484bbd420..c919000386 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -22,7 +22,7 @@ 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 = 250; + private static final int MAX_THREAD_POOL_SIZE = 250; private static final int CORE_POOL_SIZE = 10; private static final Long KEEP_ALIVE_TIME = 60L; @@ -38,7 +38,7 @@ public Connector(final int port, final int acceptCount) { this.serverSocket = createServerSocket(port, acceptCount); this.threadPoolExecutor = new ThreadPoolExecutor( CORE_POOL_SIZE, - MAX_THREAD, + MAX_THREAD_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new LinkedBlockingQueue<>(DEFAULT_ACCEPT_COUNT)); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java index a6bf80d253..3d6084a12a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java @@ -2,16 +2,23 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class SessionRepository { - private static final Map SESSIONS = new HashMap<>(); + private static final Map SESSIONS = new ConcurrentHashMap<>(); public static void create(Session session) { + if (session.getId() == null) { + return; + } SESSIONS.put(session.getId(), session); } public Session getSession(String id) { + if (id == null) { + return null; + } return SESSIONS.get(id); } From cb615f051f2ffbc0f34719c363fbf148042aeb88 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Fri, 8 Sep 2023 17:25:38 +0900 Subject: [PATCH 10/25] =?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/coyote/http11/auth/SessionRepository.java | 1 - .../java/org/apache/coyote/http11/response/ResponsePage.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java index 3d6084a12a..b0676ca8de 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java @@ -1,6 +1,5 @@ package org.apache.coyote.http11.auth; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponsePage.java b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponsePage.java index 78d658668c..bfa2eaa2c7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponsePage.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/ResponsePage.java @@ -1,7 +1,5 @@ package org.apache.coyote.http11.response; -import org.apache.coyote.http11.response.HttpStatus; - import static org.apache.coyote.http11.response.HttpStatus.CONFLICT; import static org.apache.coyote.http11.response.HttpStatus.FOUND; import static org.apache.coyote.http11.response.HttpStatus.OK; From ae1289a9c02da19372202b23a541d4c84edc9f1c Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Sun, 10 Sep 2023 13:05:24 +0900 Subject: [PATCH 11/25] refactor: request, response add prefix http --- .../apache/coyote/http11/Http11Processor.java | 10 +++--- .../coyote/http11/auth/LoginController.java | 12 +++---- .../coyote/http11/auth/LoginService.java | 18 +++++------ .../http11/auth/RegisterController.java | 10 +++--- .../coyote/http11/auth/RegisterService.java | 12 +++---- .../{Request.java => HttpRequest.java} | 8 ++--- .../http11/request/HttpRequestGenerator.java | 14 ++++---- .../coyote/http11/request/RequestHandler.java | 14 ++++---- ...{ResponseEntity.java => HttpResponse.java} | 12 +++---- .../response/HttpResponseGenerator.java | 30 ++++++++--------- .../coyote/http11/auth/LoginServiceTest.java | 11 +++---- .../http11/auth/RegisterServiceTest.java | 10 +++--- ...BodyTest.java => HttpRequestBodyTest.java} | 4 +-- ...rTest.java => HttpRequestHandlerTest.java} | 32 +++++++++---------- ...erTest.java => HttpRequestHeaderTest.java} | 4 +-- .../response/HttpResponseGeneratorTest.java | 14 ++++---- 16 files changed, 105 insertions(+), 110 deletions(-) rename tomcat/src/main/java/org/apache/coyote/http11/request/{Request.java => HttpRequest.java} (65%) rename tomcat/src/main/java/org/apache/coyote/http11/response/{ResponseEntity.java => HttpResponse.java} (66%) rename tomcat/src/test/java/org/apache/coyote/http11/request/body/{RequestBodyTest.java => HttpRequestBodyTest.java} (94%) rename tomcat/src/test/java/org/apache/coyote/http11/request/handler/{RequestHandlerTest.java => HttpRequestHandlerTest.java} (84%) rename tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/{RequestHeaderTest.java => HttpRequestHeaderTest.java} (95%) 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 64b19c434f..618fcfd19f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -9,10 +9,10 @@ import nextstep.jwp.exception.UncheckedServletException; import org.apache.coyote.Processor; import org.apache.coyote.http11.request.HttpRequestGenerator; -import org.apache.coyote.http11.request.Request; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestHandler; import org.apache.coyote.http11.response.HttpResponseGenerator; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,9 +40,9 @@ public void process(final Socket connection) { final OutputStream outputStream = connection.getOutputStream(); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - final Request request = HttpRequestGenerator.generate(bufferedReader); - final ResponseEntity responseEntity = requestHandler.getResponse(request); - final String response = responseGenerator.generate(responseEntity); + final HttpRequest httpRequest = HttpRequestGenerator.generate(bufferedReader); + final HttpResponse httpResponse = requestHandler.getResponse(httpRequest); + final String response = responseGenerator.generate(httpResponse); outputStream.write(response.getBytes()); outputStream.flush(); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java index 44f4024981..dac05cc0df 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java @@ -1,19 +1,19 @@ package org.apache.coyote.http11.auth; -import org.apache.coyote.http11.request.Request; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; public class LoginController { private final LoginService loginService = new LoginService(); - public ResponseEntity login(Request request) { - final RequestLine requestLine = request.requestLine(); - final RequestHeader requestHeader = request.requestHeader(); - final RequestBody requestBody = request.requestBody(); + public HttpResponse login(HttpRequest httpRequest) { + final RequestLine requestLine = httpRequest.requestLine(); + final RequestHeader requestHeader = httpRequest.requestHeader(); + final RequestBody requestBody = httpRequest.requestBody(); return loginService.login(requestLine, requestHeader, requestBody); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java index da9130b47c..980e97ec43 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java @@ -6,7 +6,7 @@ import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; import static org.apache.coyote.http11.response.ResponsePage.INDEX_PAGE; import static org.apache.coyote.http11.response.ResponsePage.LOGIN_PAGE; @@ -18,7 +18,7 @@ public class LoginService { private final SessionRepository sessionRepository = new SessionRepository(); - public ResponseEntity login(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { + public HttpResponse login(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { Protocol protocol = requestLine.protocol(); if (requestLine.method().isGet()) { return getLoginOrIndexResponse(requestHeader, protocol); @@ -28,24 +28,24 @@ public ResponseEntity login(RequestLine requestLine, RequestHeader requestHeader return getLoginOrElseUnAuthorizedResponse(protocol, account, password); } - private ResponseEntity getLoginOrIndexResponse(RequestHeader requestHeader, Protocol protocol) { + private HttpResponse getLoginOrIndexResponse(RequestHeader requestHeader, Protocol protocol) { final Cookie cookie = requestHeader.getCookie(); final Session session = sessionRepository.getSession(cookie.get(SESSION_KEY)); if (session == null) { - return ResponseEntity.getCookieNullResponseEntity(protocol, LOGIN_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, LOGIN_PAGE); } - return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); } - private ResponseEntity getLoginOrElseUnAuthorizedResponse(Protocol protocol, String account, String password) { + private HttpResponse getLoginOrElseUnAuthorizedResponse(Protocol protocol, String account, String password) { return InMemoryUserRepository.findByAccount(account) .filter(user -> user.checkPassword(password)) .map(user -> getSuccessLoginResponse(user, protocol)) - .orElseGet(() -> ResponseEntity.getCookieNullResponseEntity(protocol, UNAUTHORIZED_PAGE)); + .orElseGet(() -> HttpResponse.getCookieNullResponseEntity(protocol, UNAUTHORIZED_PAGE)); } - private ResponseEntity getSuccessLoginResponse(final User user, final Protocol protocol) { - ResponseEntity response = ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); + private HttpResponse getSuccessLoginResponse(final User user, final Protocol protocol) { + HttpResponse response = HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); String jsessionid = response.getHttpCookie().get(SESSION_KEY); final Session session = Session.from(jsessionid); session.setAttribute("user", user); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java index 4844aa57c5..780d061003 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java @@ -1,16 +1,16 @@ package org.apache.coyote.http11.auth; -import org.apache.coyote.http11.request.Request; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; public class RegisterController { private final RegisterService registerService = new RegisterService(); - public ResponseEntity register(Request request) { - final RequestLine requestLine = request.requestLine(); - final RequestBody requestBody = request.requestBody(); + public HttpResponse register(HttpRequest httpRequest) { + final RequestLine requestLine = httpRequest.requestLine(); + final RequestBody requestBody = httpRequest.requestBody(); return registerService.register(requestLine, requestBody); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java index 733ca3d42f..a19c2b87be 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java @@ -5,7 +5,7 @@ import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; import static org.apache.coyote.http11.request.line.HttpMethod.GET; import static org.apache.coyote.http11.response.ResponsePage.CONFLICT_PAGE; @@ -14,25 +14,25 @@ public class RegisterService { - public ResponseEntity register(final RequestLine requestLine, final RequestBody requestBody) { + public HttpResponse register(final RequestLine requestLine, final RequestBody requestBody) { Protocol protocol = requestLine.protocol(); if (requestLine.method() == GET) { - return ResponseEntity.getCookieNullResponseEntity(protocol, REGISTER_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, REGISTER_PAGE); } return getIndexOrConflictResponse(requestBody, protocol); } - private static ResponseEntity getIndexOrConflictResponse(RequestBody requestBody, Protocol protocol) { + private static HttpResponse getIndexOrConflictResponse(RequestBody requestBody, Protocol protocol) { final String account = requestBody.getBy("account"); if (InMemoryUserRepository.findByAccount(account).isPresent()) { - return ResponseEntity.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); } final String email = requestBody.getBy("email"); final String password = requestBody.getBy("password"); InMemoryUserRepository.save(new User(account, password, email)); - return ResponseEntity.getCookieNullResponseEntity(protocol, INDEX_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java similarity index 65% rename from tomcat/src/main/java/org/apache/coyote/http11/request/Request.java rename to tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java index 6810681b63..9ff8c0d6fd 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/Request.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java @@ -2,20 +2,20 @@ import org.apache.coyote.http11.request.line.RequestLine; -public class Request { +public class HttpRequest { private final RequestLine requestLine; private final RequestHeader requestHeader; private final RequestBody requestBody; - private Request(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { + private HttpRequest(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { this.requestLine = requestLine; this.requestHeader = requestHeader; this.requestBody = requestBody; } - public static Request of(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { - return new Request(requestLine, requestHeader, requestBody); + public static HttpRequest of(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { + return new HttpRequest(requestLine, requestHeader, requestBody); } public RequestLine requestLine() { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java index 0594d04246..e984932381 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java @@ -8,13 +8,13 @@ public class HttpRequestGenerator { - private Request request; + private HttpRequest httpRequest; - private HttpRequestGenerator(Request request) { - this.request = request; + private HttpRequestGenerator(HttpRequest httpRequest) { + this.httpRequest = httpRequest; } - public static Request generate(BufferedReader bufferedReader) throws IOException { + public static HttpRequest generate(BufferedReader bufferedReader) throws IOException { final String firstLine = bufferedReader.readLine(); if (firstLine == null) { return null; @@ -22,11 +22,11 @@ public static Request generate(BufferedReader bufferedReader) throws IOException final RequestLine requestLine = RequestLine.from(firstLine); final RequestHeader requestHeader = getHeader(bufferedReader); final RequestBody requestBody = getBody(bufferedReader, requestHeader); - return Request.of(requestLine, requestHeader, requestBody); + return HttpRequest.of(requestLine, requestHeader, requestBody); } - public Request request() { - return request; + public HttpRequest request() { + return httpRequest; } private static RequestHeader getHeader(final BufferedReader bufferedReader) throws IOException { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java index 979d44deba..929b6aba36 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java @@ -4,7 +4,7 @@ import org.apache.coyote.http11.auth.RegisterController; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.response.Location; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; import static org.apache.coyote.http11.response.HttpStatus.OK; @@ -13,17 +13,17 @@ public class RequestHandler { private final RegisterController registerController = new RegisterController(); private final LoginController loginController = new LoginController(); - public ResponseEntity getResponse(Request request) { - final Protocol protocol = request.requestLine().protocol(); - final String path = request.requestLine().path().defaultPath(); + public HttpResponse getResponse(HttpRequest httpRequest) { + final Protocol protocol = httpRequest.requestLine().protocol(); + final String path = httpRequest.requestLine().path().defaultPath(); if (path.equals("/register")) { - return registerController.register(request); + return registerController.register(httpRequest); } if (path.equals("/login")) { - return loginController.login(request); + return loginController.login(httpRequest); } - return ResponseEntity.getCookieNullResponseEntity(protocol, OK, Location.from(path)); + return HttpResponse.getCookieNullResponseEntity(protocol, OK, Location.from(path)); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java similarity index 66% rename from tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java rename to tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java index 56eb14e979..f1b05c3775 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/ResponseEntity.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponse.java @@ -3,33 +3,33 @@ import org.apache.coyote.http11.auth.Cookie; import org.apache.coyote.http11.request.line.Protocol; -public class ResponseEntity { +public class HttpResponse { private final Protocol protocol; private final HttpStatus httpStatus; private final Cookie cookie; private final Location location; - public ResponseEntity(Protocol protocol, HttpStatus httpStatus, Cookie cookie, Location location) { + public HttpResponse(Protocol protocol, HttpStatus httpStatus, Cookie cookie, Location location) { this.protocol = protocol; this.httpStatus = httpStatus; this.cookie = cookie; this.location = location; } - public static ResponseEntity getCookieNullResponseEntity( + public static HttpResponse getCookieNullResponseEntity( final Protocol protocol, final ResponsePage responsePage ) { - return new ResponseEntity(protocol, responsePage.statusCode(), Cookie.from(null), Location.from(responsePage.redirectUrl())); + return new HttpResponse(protocol, responsePage.statusCode(), Cookie.from(null), Location.from(responsePage.redirectUrl())); } - public static ResponseEntity getCookieNullResponseEntity( + public static HttpResponse getCookieNullResponseEntity( final Protocol protocol, final HttpStatus status, final Location location ) { - return new ResponseEntity(protocol, status, Cookie.from(null), location); + return new HttpResponse(protocol, status, Cookie.from(null), location); } public String getProtocol() { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java index 64c37c3e99..5db9edf68f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java @@ -14,23 +14,23 @@ public class HttpResponseGenerator { private final ClassLoader classLoader = ClassLoader.getSystemClassLoader(); - public String generate(final ResponseEntity responseEntity) throws IOException { - final String location = responseEntity.getLocation(); + public String generate(final HttpResponse httpResponse) throws IOException { + final String location = httpResponse.getLocation(); if (location.equals("/")) { - return generateResponse(responseEntity, DEFAULT_RESPONSE_BODY); + return generateResponse(httpResponse, DEFAULT_RESPONSE_BODY); } - if (responseEntity.getHttpStatus() == HttpStatus.FOUND) { - return generateRedirectResponse(responseEntity); + if (httpResponse.getHttpStatus() == HttpStatus.FOUND) { + return generateRedirectResponse(httpResponse); } final String responseBody = readStaticFile(location); - return generateResponse(responseEntity, responseBody); + return generateResponse(httpResponse, responseBody); } - private String generateResponse(final ResponseEntity responseEntity, final String responseBody) { + private String generateResponse(final HttpResponse httpResponse, final String responseBody) { return String.join( CRLF, - generateHttpStatusLine(responseEntity.getProtocol(), responseEntity.getHttpStatus()), - generateContentTypeLine(responseEntity.getLocation()), + generateHttpStatusLine(httpResponse.getProtocol(), httpResponse.getHttpStatus()), + generateContentTypeLine(httpResponse.getLocation()), generateContentLengthLine(responseBody), "", responseBody @@ -58,19 +58,19 @@ private String readStaticFile(final String location) throws IOException { return new String(Files.readAllBytes(file.toPath())); } - private String generateRedirectResponse(final ResponseEntity responseEntity) { - final HttpStatus httpStatus = responseEntity.getHttpStatus(); + private String generateRedirectResponse(final HttpResponse httpResponse) { + final HttpStatus httpStatus = httpResponse.getHttpStatus(); final String firstLine = String.join(BLANK, "HTTP/1.1", httpStatus.getCode(), httpStatus.name(), ""); return String.join( CRLF, firstLine, - "Location: " + responseEntity.getLocation(), - generateSetCookieLine(responseEntity) + "Location: " + httpResponse.getLocation(), + generateSetCookieLine(httpResponse) ); } - private String generateSetCookieLine(final ResponseEntity responseEntity) { - final String jsessionid = responseEntity.getHttpCookie().get("JSESSIONID"); + private String generateSetCookieLine(final HttpResponse httpResponse) { + final String jsessionid = httpResponse.getHttpCookie().get("JSESSIONID"); if (jsessionid == null) { return ""; } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java index 01b7880360..225faf0915 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java @@ -7,17 +7,14 @@ import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import static org.apache.coyote.http11.request.line.HttpMethod.GET; import static org.apache.coyote.http11.request.line.HttpMethod.POST; -import static org.apache.coyote.http11.response.HttpStatus.CONFLICT; import static org.apache.coyote.http11.response.HttpStatus.FOUND; -import static org.apache.coyote.http11.response.HttpStatus.OK; import static org.apache.coyote.http11.response.HttpStatus.UNAUTHORIZED; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; @@ -32,7 +29,7 @@ void setUp() { } @Nested - class path에_따라_다른_ResponseEntity를_반환한다 { + class path에_따라_다른_Http_ResponseEntity를_반환한다 { public RequestLine requestLine_생성(HttpMethod httpMethod, String defaultPath) { return RequestLine.from(httpMethod.name() + " " + defaultPath + " " + "HTTP/1.1"); @@ -73,7 +70,7 @@ void getFoundResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - ResponseEntity response = loginService.login(requestLine, requestHeader, requestBody); + HttpResponse response = loginService.login(requestLine, requestHeader, requestBody); // then assertAll( @@ -93,7 +90,7 @@ void getUnauthorizedResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - ResponseEntity response = loginService.login(requestLine, requestHeader, requestBody); + HttpResponse response = loginService.login(requestLine, requestHeader, requestBody); // then assertAll( diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java index 6a0e2192b6..ca8ad40bff 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java @@ -1,13 +1,11 @@ package org.apache.coyote.http11.auth; -import java.util.List; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.request.RequestBody; -import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -47,7 +45,7 @@ void getRegisterResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - ResponseEntity response = registerService.register(requestLine, requestBody); + HttpResponse response = registerService.register(requestLine, requestBody); // then assertAll( @@ -71,7 +69,7 @@ void getConflictResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - ResponseEntity response = registerService.register(requestLine, requestBody); + HttpResponse response = registerService.register(requestLine, requestBody); // then assertAll( @@ -89,7 +87,7 @@ void getFoundResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - ResponseEntity response = registerService.register(requestLine, requestBody); + HttpResponse response = registerService.register(requestLine, requestBody); // then assertAll( diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/body/RequestBodyTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/body/HttpRequestBodyTest.java similarity index 94% rename from tomcat/src/test/java/org/apache/coyote/http11/request/body/RequestBodyTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/request/body/HttpRequestBodyTest.java index 7ad2183f1c..1010cc085c 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/body/RequestBodyTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/body/HttpRequestBodyTest.java @@ -7,10 +7,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; -class RequestBodyTest { +class HttpRequestBodyTest { @Nested - class RequestBody_생성_검증 { + class HttpRequestBody_생성_검증 { @Test void RequestBody가_유효하다면_생성한다() { diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java similarity index 84% rename from tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java index e17b3876fa..a215769143 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/RequestHandlerTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java @@ -4,13 +4,13 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.auth.SessionRepository; -import org.apache.coyote.http11.request.Request; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.RequestHandler; import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.ResponseEntity; +import org.apache.coyote.http11.response.HttpResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; -class RequestHandlerTest { +class HttpRequestHandlerTest { private final RequestHandler requestHandler = new RequestHandler(); @@ -35,7 +35,7 @@ void setUp() { } @Nested - class path에_따라_다른_ResponseEntity를_반환한다 { + class path에_따라_다른_Http_ResponseEntity를_반환한다 { public RequestLine requestLine_생성(HttpMethod httpMethod, String defaultPath) { return RequestLine.from(httpMethod.name() + " " + defaultPath + " " + "HTTP/1.1"); @@ -72,11 +72,11 @@ void getLoginResponseEntity() { RequestLine requestLine = requestLine_생성(GET, "/login"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - Request request = Request.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); SessionRepository.clearSessions(); // when - ResponseEntity response = requestHandler.getResponse(request); + HttpResponse response = requestHandler.getResponse(httpRequest); // then assertAll( @@ -99,10 +99,10 @@ void getFoundResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/login"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - Request request = Request.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(request); + HttpResponse response = requestHandler.getResponse(httpRequest); // then assertAll( @@ -120,10 +120,10 @@ void getUnauthorizedResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/login"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - Request request = Request.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(request); + HttpResponse response = requestHandler.getResponse(httpRequest); // then assertAll( @@ -149,10 +149,10 @@ void getRegisterResponseEntity() { RequestLine requestLine = requestLine_생성(GET, "/register"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - Request request = Request.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(request); + HttpResponse response = requestHandler.getResponse(httpRequest); // then assertAll( @@ -175,10 +175,10 @@ void getConflictResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/register"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - Request request = Request.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(request); + HttpResponse response = requestHandler.getResponse(httpRequest); // then assertAll( @@ -194,10 +194,10 @@ void getFoundResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/register"); RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - Request request = Request.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); // when - ResponseEntity response = requestHandler.getResponse(request); + HttpResponse response = requestHandler.getResponse(httpRequest); // then assertAll( diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/RequestHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpRequestHeaderTest.java similarity index 95% rename from tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/RequestHeaderTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpRequestHeaderTest.java index 26d90b62f7..9f6607d57d 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/RequestHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpRequestHeaderTest.java @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; -class RequestHeaderTest { +class HttpRequestHeaderTest { @Nested - class RequestHeader_생성을_검증한다 { + class HttpRequestHeader_생성을_검증한다 { @Test void 유효한_RequestHeader라면_생성한다() { diff --git a/tomcat/src/test/java/org/apache/coyote/http11/response/HttpResponseGeneratorTest.java b/tomcat/src/test/java/org/apache/coyote/http11/response/HttpResponseGeneratorTest.java index 9dad06b8e7..822c6ac058 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/response/HttpResponseGeneratorTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/response/HttpResponseGeneratorTest.java @@ -15,17 +15,17 @@ class HttpResponseGeneratorTest { private final HttpResponseGenerator responseGenerator = new HttpResponseGenerator(); @Nested - class ResponseEntity를_생성한다 { + class HttpResponseEntity를_생성한다 { @Test @DisplayName("URI가 /(슬래쉬)라면 body에 Hello world를 담아서 반환한다.") void generateDefaultResponseEntity() throws IOException { // given Protocol protocol = Protocol.from("HTTP/1.1"); - final ResponseEntity responseEntity = ResponseEntity.getCookieNullResponseEntity(protocol, OK, Location.from("/")); + final HttpResponse httpResponse = HttpResponse.getCookieNullResponseEntity(protocol, OK, Location.from("/")); // when - String response = responseGenerator.generate(responseEntity); + String response = responseGenerator.generate(httpResponse); // then assertThat(response).contains("Hello world!"); @@ -36,10 +36,10 @@ void generateDefaultResponseEntity() throws IOException { void generateFoundResponseEntity() throws IOException { // given Protocol protocol = Protocol.from("HTTP/1.1"); - ResponseEntity responseEntity = ResponseEntity.getCookieNullResponseEntity(protocol, FOUND, Location.from("index.html")); + HttpResponse httpResponse = HttpResponse.getCookieNullResponseEntity(protocol, FOUND, Location.from("index.html")); // when - String response = responseGenerator.generate(responseEntity); + String response = responseGenerator.generate(httpResponse); // then assertThat(response).contains("Location: index.html"); @@ -50,10 +50,10 @@ void generateFoundResponseEntity() throws IOException { void generateCustomResponseEntity() throws IOException { // given Protocol protocol = Protocol.from("HTTP/1.1"); - ResponseEntity responseEntity = ResponseEntity.getCookieNullResponseEntity(protocol, FOUND, Location.from("index.html")); + HttpResponse httpResponse = HttpResponse.getCookieNullResponseEntity(protocol, FOUND, Location.from("index.html")); // when - String response = responseGenerator.generate(responseEntity); + String response = responseGenerator.generate(httpResponse); // then assertThat(response).contains("Location: index.html"); From 353872e4c1c7aca1aeb0a0fdc95578c3aef3f28c Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Sun, 10 Sep 2023 16:34:15 +0900 Subject: [PATCH 12/25] =?UTF-8?q?refactor:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=EC=9D=B4=20=EB=90=98=EC=96=B4=EC=9E=88=EB=8B=A4=EB=A9=B4=20?= =?UTF-8?q?=EC=9D=B8=EB=8D=B1=EC=8A=A4=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EB=A1=9C=20=EB=A6=AC=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/coyote/http11/auth/Cookie.java | 7 +++++++ .../apache/coyote/http11/auth/LoginService.java | 16 ++++++++++------ .../org/apache/coyote/http11/auth/Session.java | 5 +++-- .../coyote/http11/response/HttpResponse.java | 11 ++++++++++- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java index 55ee1e2659..bb62449305 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java @@ -32,6 +32,13 @@ public static Cookie from(final List elements) { )); } + public Cookie() { + } + + public void setSession(Session session) { + elements.put("JSESSIONID", session.getId()); + } + public void put(final String key, final String value) { elements.put(key, value); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java index 980e97ec43..5de98db530 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java @@ -1,5 +1,6 @@ package org.apache.coyote.http11.auth; +import java.util.UUID; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.request.RequestBody; @@ -14,7 +15,7 @@ public class LoginService { - public static final String SESSION_KEY = "JSESSIONID"; + public static final String COOKIE_KEY = "JSESSIONID"; private final SessionRepository sessionRepository = new SessionRepository(); @@ -30,10 +31,12 @@ public HttpResponse login(RequestLine requestLine, RequestHeader requestHeader, private HttpResponse getLoginOrIndexResponse(RequestHeader requestHeader, Protocol protocol) { final Cookie cookie = requestHeader.getCookie(); - final Session session = sessionRepository.getSession(cookie.get(SESSION_KEY)); + final Session session = sessionRepository.getSession(cookie.get(COOKIE_KEY)); if (session == null) { + System.out.println("세션 없음 로그인 페이지로 이동"); return HttpResponse.getCookieNullResponseEntity(protocol, LOGIN_PAGE); } + System.out.println("세션 존재 인덱스 페이지로 이동"); return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); } @@ -45,12 +48,13 @@ private HttpResponse getLoginOrElseUnAuthorizedResponse(Protocol protocol, Strin } private HttpResponse getSuccessLoginResponse(final User user, final Protocol protocol) { - HttpResponse response = HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); - String jsessionid = response.getHttpCookie().get(SESSION_KEY); - final Session session = Session.from(jsessionid); + final String uuid = UUID.randomUUID().toString(); + final Session session = Session.from(uuid); session.setAttribute("user", user); sessionRepository.create(session); - return response; + Cookie cookie = new Cookie(); + cookie.setSession(session); + return HttpResponse.getResponseEntity(protocol, cookie, INDEX_PAGE); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/Session.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/Session.java index f2fda48fd9..d0d758c615 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/Session.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/Session.java @@ -2,11 +2,12 @@ import java.util.HashMap; import java.util.Map; +import nextstep.jwp.model.User; public class Session { private final String id; - private final Map items = new HashMap<>(); + private final Map items = new HashMap<>(); private Session(final String id) { this.id = id; @@ -16,7 +17,7 @@ public static Session from(String id) { return new Session(id); } - public void setAttribute(final String key, final Object value) { + public void setAttribute(final String key, final User value) { items.put(key, value); } 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 f1b05c3775..ff40b48ac6 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 @@ -10,7 +10,7 @@ public class HttpResponse { private final Cookie cookie; private final Location location; - public HttpResponse(Protocol protocol, HttpStatus httpStatus, Cookie cookie, Location location) { + private HttpResponse(Protocol protocol, HttpStatus httpStatus, Cookie cookie, Location location) { this.protocol = protocol; this.httpStatus = httpStatus; this.cookie = cookie; @@ -24,6 +24,15 @@ public static HttpResponse getCookieNullResponseEntity( return new HttpResponse(protocol, responsePage.statusCode(), Cookie.from(null), Location.from(responsePage.redirectUrl())); } + public static HttpResponse getResponseEntity( + final Protocol protocol, + final Cookie cookie, + final ResponsePage responsePage + ) { + System.out.println("cookie.get(\"JSESSIONID\") = " + cookie.get("JSESSIONID")); + return new HttpResponse(protocol, responsePage.statusCode(), cookie, Location.from(responsePage.redirectUrl())); + } + public static HttpResponse getCookieNullResponseEntity( final Protocol protocol, final HttpStatus status, From c4e671945c7a65d6dbf173e2d61db0136ab47351 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Sun, 10 Sep 2023 16:47:12 +0900 Subject: [PATCH 13/25] =?UTF-8?q?refactor:=20controller=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/auth/LoginController.java | 20 ---------- .../coyote/http11/auth/LoginService.java | 26 +++---------- .../http11/auth/RegisterController.java | 17 --------- .../coyote/http11/auth/RegisterService.java | 27 ++++--------- .../http11/controller/AbstractController.java | 24 ++++++++++++ .../coyote/http11/controller/Controller.java | 10 +++++ .../http11/controller/LoginController.java | 38 +++++++++++++++++++ .../http11/controller/RegisterController.java | 23 +++++++++++ .../coyote/http11/request/HttpRequest.java | 10 +++++ .../coyote/http11/request/RequestHandler.java | 8 ++-- .../coyote/http11/auth/LoginServiceTest.java | 4 +- 11 files changed, 124 insertions(+), 83 deletions(-) delete mode 100644 tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java delete mode 100644 tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java 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/controller/Controller.java create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java deleted file mode 100644 index dac05cc0df..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginController.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.apache.coyote.http11.auth; - -import org.apache.coyote.http11.request.HttpRequest; -import org.apache.coyote.http11.request.RequestBody; -import org.apache.coyote.http11.request.RequestHeader; -import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.HttpResponse; - -public class LoginController { - - private final LoginService loginService = new LoginService(); - - public HttpResponse login(HttpRequest httpRequest) { - final RequestLine requestLine = httpRequest.requestLine(); - final RequestHeader requestHeader = httpRequest.requestHeader(); - final RequestBody requestBody = httpRequest.requestBody(); - return loginService.login(requestLine, requestHeader, requestBody); - } - -} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java index 5de98db530..d293011c0c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java @@ -3,10 +3,8 @@ import java.util.UUID; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.request.RequestBody; -import org.apache.coyote.http11.request.RequestHeader; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.line.Protocol; -import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.HttpResponse; import static org.apache.coyote.http11.response.ResponsePage.INDEX_PAGE; @@ -19,28 +17,16 @@ public class LoginService { private final SessionRepository sessionRepository = new SessionRepository(); - public HttpResponse login(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { - Protocol protocol = requestLine.protocol(); - if (requestLine.method().isGet()) { - return getLoginOrIndexResponse(requestHeader, protocol); - } - final String account = requestBody.getBy("account"); - final String password = requestBody.getBy("password"); - return getLoginOrElseUnAuthorizedResponse(protocol, account, password); - } - - private HttpResponse getLoginOrIndexResponse(RequestHeader requestHeader, Protocol protocol) { - final Cookie cookie = requestHeader.getCookie(); + public HttpResponse getLoginViewResponse(HttpRequest request, HttpResponse response) { + final Cookie cookie = request.requestHeader().getCookie(); final Session session = sessionRepository.getSession(cookie.get(COOKIE_KEY)); if (session == null) { - System.out.println("세션 없음 로그인 페이지로 이동"); - return HttpResponse.getCookieNullResponseEntity(protocol, LOGIN_PAGE); + return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), LOGIN_PAGE); } - System.out.println("세션 존재 인덱스 페이지로 이동"); - return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); + return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), INDEX_PAGE); } - private HttpResponse getLoginOrElseUnAuthorizedResponse(Protocol protocol, String account, String password) { + public HttpResponse getLoginOrElseUnAuthorizedResponse(Protocol protocol, String account, String password) { return InMemoryUserRepository.findByAccount(account) .filter(user -> user.checkPassword(password)) .map(user -> getSuccessLoginResponse(user, protocol)) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java deleted file mode 100644 index 780d061003..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterController.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.apache.coyote.http11.auth; - -import org.apache.coyote.http11.request.HttpRequest; -import org.apache.coyote.http11.request.RequestBody; -import org.apache.coyote.http11.request.line.RequestLine; -import org.apache.coyote.http11.response.HttpResponse; - -public class RegisterController { - - private final RegisterService registerService = new RegisterService(); - public HttpResponse register(HttpRequest httpRequest) { - final RequestLine requestLine = httpRequest.requestLine(); - final RequestBody requestBody = httpRequest.requestBody(); - return registerService.register(requestLine, requestBody); - } - -} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java index a19c2b87be..b7f4449302 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java @@ -2,37 +2,24 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.request.RequestBody; -import org.apache.coyote.http11.request.line.Protocol; -import org.apache.coyote.http11.request.line.RequestLine; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.response.HttpResponse; -import static org.apache.coyote.http11.request.line.HttpMethod.GET; import static org.apache.coyote.http11.response.ResponsePage.CONFLICT_PAGE; import static org.apache.coyote.http11.response.ResponsePage.INDEX_PAGE; -import static org.apache.coyote.http11.response.ResponsePage.REGISTER_PAGE; public class RegisterService { - public HttpResponse register(final RequestLine requestLine, final RequestBody requestBody) { - Protocol protocol = requestLine.protocol(); - if (requestLine.method() == GET) { - return HttpResponse.getCookieNullResponseEntity(protocol, REGISTER_PAGE); - } - return getIndexOrConflictResponse(requestBody, protocol); - - } - - private static HttpResponse getIndexOrConflictResponse(RequestBody requestBody, Protocol protocol) { - final String account = requestBody.getBy("account"); + public HttpResponse getIndexOrConflictResponse(HttpRequest request, HttpResponse response) { + final String account = request.requestBody().getBy("account"); if (InMemoryUserRepository.findByAccount(account).isPresent()) { - return HttpResponse.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); + return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), CONFLICT_PAGE); } - final String email = requestBody.getBy("email"); - final String password = requestBody.getBy("password"); + final String email = request.requestBody().getBy("email"); + final String password = request.requestBody().getBy("password"); InMemoryUserRepository.save(new User(account, password, email)); - return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); + return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), INDEX_PAGE); } } 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..4e31a86c99 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/AbstractController.java @@ -0,0 +1,24 @@ +package org.apache.coyote.http11.controller; + +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.line.HttpMethod; +import org.apache.coyote.http11.response.HttpResponse; + +public abstract class AbstractController implements Controller { + + @Override + public HttpResponse service(final HttpRequest request, final HttpResponse response) { + if (request.methodIsEqualTo(HttpMethod.GET)) { + return doGet(request, response); + } + if (request.methodIsEqualTo(HttpMethod.POST)) { + return doPost(request, response); + } + return null; + } + + protected abstract HttpResponse doPost(final HttpRequest request, final HttpResponse response); + + protected abstract HttpResponse doGet(final HttpRequest request, final HttpResponse response); + +} 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..677cfa7e3f --- /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(final HttpRequest request, final HttpResponse response); + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java new file mode 100644 index 0000000000..da400ef484 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java @@ -0,0 +1,38 @@ +package org.apache.coyote.http11.controller; + +import org.apache.coyote.http11.auth.LoginService; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.RequestBody; +import org.apache.coyote.http11.request.line.HttpMethod; +import org.apache.coyote.http11.response.HttpResponse; + +public class LoginController extends AbstractController { + + private final LoginService loginService = new LoginService(); + + @Override + public HttpResponse service(HttpRequest request, HttpResponse response) { + if (request.methodIsEqualTo(HttpMethod.GET)) { + return doGet(request, response); + } + return doPost(request, response); + } + + @Override + protected HttpResponse doPost(final HttpRequest request, final HttpResponse response) { + RequestBody requestBody = request.requestBody(); + final String account = requestBody.getBy("account"); + final String password = requestBody.getBy("password"); + return loginService.getLoginOrElseUnAuthorizedResponse( + request.getProtocol(), + account, + password + ); + } + + @Override + protected HttpResponse doGet(final HttpRequest request, final HttpResponse response) { + return loginService.getLoginViewResponse(request, response); + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java new file mode 100644 index 0000000000..305eecd5f4 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java @@ -0,0 +1,23 @@ +package org.apache.coyote.http11.controller; + +import org.apache.coyote.http11.auth.RegisterService; +import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.response.HttpResponse; + +import static org.apache.coyote.http11.response.ResponsePage.REGISTER_PAGE; + +public class RegisterController extends AbstractController { + + private final RegisterService registerService = new RegisterService(); + + @Override + protected HttpResponse doPost(HttpRequest request, HttpResponse response) { + return registerService.getIndexOrConflictResponse(request, response); + } + + @Override + protected HttpResponse doGet(HttpRequest request, HttpResponse response) { + return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), REGISTER_PAGE); + } + +} 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 9ff8c0d6fd..7b3daa4d21 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,5 +1,7 @@ package org.apache.coyote.http11.request; +import org.apache.coyote.http11.request.line.HttpMethod; +import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.request.line.RequestLine; public class HttpRequest { @@ -30,4 +32,12 @@ public RequestBody requestBody() { return requestBody; } + public boolean methodIsEqualTo(HttpMethod httpMethod) { + return this.requestLine.method().equals(httpMethod); + } + + public Protocol getProtocol() { + return requestLine.protocol(); + } + } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java index 929b6aba36..93aea5c592 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java @@ -1,7 +1,7 @@ package org.apache.coyote.http11.request; -import org.apache.coyote.http11.auth.LoginController; -import org.apache.coyote.http11.auth.RegisterController; +import org.apache.coyote.http11.controller.LoginController; +import org.apache.coyote.http11.controller.RegisterController; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.response.Location; import org.apache.coyote.http11.response.HttpResponse; @@ -18,10 +18,10 @@ public HttpResponse getResponse(HttpRequest httpRequest) { final String path = httpRequest.requestLine().path().defaultPath(); if (path.equals("/register")) { - return registerController.register(httpRequest); + return registerController.service(httpRequest, null); } if (path.equals("/login")) { - return loginController.login(httpRequest); + return loginController.service(httpRequest, null); } return HttpResponse.getCookieNullResponseEntity(protocol, OK, Location.from(path)); } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java index 225faf0915..bde738044b 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java @@ -70,7 +70,7 @@ void getFoundResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - HttpResponse response = loginService.login(requestLine, requestHeader, requestBody); + HttpResponse response = loginService.getLoginViewResponse(requestLine, requestHeader, requestBody); // then assertAll( @@ -90,7 +90,7 @@ void getUnauthorizedResponseEntity() { RequestBody requestBody = requestBody_생성(); // when - HttpResponse response = loginService.login(requestLine, requestHeader, requestBody); + HttpResponse response = loginService.getLoginViewResponse(requestLine, requestHeader, requestBody); // then assertAll( From e03eb85b73186994d091e9aac82907eb74aa3aa3 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Sun, 10 Sep 2023 16:51:37 +0900 Subject: [PATCH 14/25] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/auth/LoginServiceTest.java | 12 ++++++-- .../http11/auth/RegisterServiceTest.java | 29 ++++--------------- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java index bde738044b..87baf48336 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java @@ -3,6 +3,7 @@ import java.util.List; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.RequestHeader; import org.apache.coyote.http11.request.line.HttpMethod; @@ -66,11 +67,13 @@ void getFoundResponseEntity() { InMemoryUserRepository.save(new User(1L, "베베", "password", "rltgjqmduftlagl@gmail.com")); RequestLine requestLine = requestLine_생성(POST, "/login"); - RequestHeader requestHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); + String account = requestBody.getBy("account"); + String password = requestBody.getBy("password"); + // when - HttpResponse response = loginService.getLoginViewResponse(requestLine, requestHeader, requestBody); + HttpResponse response = loginService.getLoginOrElseUnAuthorizedResponse(requestLine.protocol(), account, password); // then assertAll( @@ -87,10 +90,13 @@ void getUnauthorizedResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/login"); RequestHeader requestHeader = requestHeader_생성(); + RequestBody requestBody = requestBody_생성(); + String account = requestBody.getBy("account"); + String password = requestBody.getBy("password"); // when - HttpResponse response = loginService.getLoginViewResponse(requestLine, requestHeader, requestBody); + HttpResponse response = loginService.getLoginOrElseUnAuthorizedResponse(requestLine.protocol(), account, password); // then assertAll( diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java index ca8ad40bff..31c98d645f 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java @@ -2,6 +2,7 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; +import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; @@ -34,28 +35,6 @@ class path가_register면 { return RequestBody.from(body); } - @Nested - class HTTP_METHOD_GET { - - @Test - @DisplayName("REGISTER Response를 반환한다.") - void getRegisterResponseEntity() { - // given - RequestLine requestLine = requestLine_생성(GET, "/register"); - RequestBody requestBody = requestBody_생성(); - - // when - HttpResponse response = registerService.register(requestLine, requestBody); - - // then - assertAll( - () -> assertThat(response.getHttpStatus()).isEqualTo(OK), - () -> assertThat(response.getLocation()).isEqualTo("/register.html") - ); - } - - } - @Nested class HTTP_METHOD_POST { @@ -67,9 +46,10 @@ void getConflictResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/register"); RequestBody requestBody = requestBody_생성(); + HttpRequest request = HttpRequest.of(requestLine, null, requestBody); // when - HttpResponse response = registerService.register(requestLine, requestBody); + HttpResponse response = registerService.getIndexOrConflictResponse(request, null); // then assertAll( @@ -85,9 +65,10 @@ void getFoundResponseEntity() { InMemoryUserRepository.deleteAll(); RequestLine requestLine = requestLine_생성(POST, "/register"); RequestBody requestBody = requestBody_생성(); + HttpRequest request = HttpRequest.of(requestLine, null, requestBody); // when - HttpResponse response = registerService.register(requestLine, requestBody); + HttpResponse response = registerService.getIndexOrConflictResponse(request, null); // then assertAll( From 01f3cbeb7382513b1bddce11ceff503a41cfdb45 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Sun, 10 Sep 2023 16:56:56 +0900 Subject: [PATCH 15/25] =?UTF-8?q?refactor:=20service=20layer=EC=97=90?= =?UTF-8?q?=EC=84=9C=EB=8A=94=20request=EC=99=80=20response=EC=9D=98=20?= =?UTF-8?q?=EC=97=B0=EA=B4=80=EA=B4=80=EA=B3=84=EB=A5=BC=20=EB=81=8A?= =?UTF-8?q?=EB=8A=94=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/coyote/http11/auth/LoginService.java | 8 +++----- .../coyote/http11/auth/RegisterService.java | 10 ++++------ .../http11/controller/LoginController.java | 6 +++++- .../http11/controller/RegisterController.java | 7 ++++++- .../coyote/http11/auth/RegisterServiceTest.java | 17 +++++++++++++---- 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java index d293011c0c..43e8d3ac41 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java @@ -3,7 +3,6 @@ import java.util.UUID; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.response.HttpResponse; @@ -17,13 +16,12 @@ public class LoginService { private final SessionRepository sessionRepository = new SessionRepository(); - public HttpResponse getLoginViewResponse(HttpRequest request, HttpResponse response) { - final Cookie cookie = request.requestHeader().getCookie(); + public HttpResponse getLoginViewResponse(Cookie cookie, Protocol protocol) { final Session session = sessionRepository.getSession(cookie.get(COOKIE_KEY)); if (session == null) { - return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), LOGIN_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, LOGIN_PAGE); } - return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), INDEX_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); } public HttpResponse getLoginOrElseUnAuthorizedResponse(Protocol protocol, String account, String password) { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java index b7f4449302..092de47e91 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java @@ -3,6 +3,7 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.response.HttpResponse; import static org.apache.coyote.http11.response.ResponsePage.CONFLICT_PAGE; @@ -10,16 +11,13 @@ public class RegisterService { - public HttpResponse getIndexOrConflictResponse(HttpRequest request, HttpResponse response) { - final String account = request.requestBody().getBy("account"); + public HttpResponse getIndexOrConflictResponse(String account, String password, String email, Protocol protocol) { if (InMemoryUserRepository.findByAccount(account).isPresent()) { - return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), CONFLICT_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, CONFLICT_PAGE); } - final String email = request.requestBody().getBy("email"); - final String password = request.requestBody().getBy("password"); InMemoryUserRepository.save(new User(account, password, email)); - return HttpResponse.getCookieNullResponseEntity(request.getProtocol(), INDEX_PAGE); + return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java index da400ef484..9ff06ce9c1 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java @@ -1,9 +1,11 @@ package org.apache.coyote.http11.controller; +import org.apache.coyote.http11.auth.Cookie; import org.apache.coyote.http11.auth.LoginService; import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.line.HttpMethod; +import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.response.HttpResponse; public class LoginController extends AbstractController { @@ -32,7 +34,9 @@ protected HttpResponse doPost(final HttpRequest request, final HttpResponse resp @Override protected HttpResponse doGet(final HttpRequest request, final HttpResponse response) { - return loginService.getLoginViewResponse(request, response); + Cookie cookie = request.requestHeader().getCookie(); + Protocol protocol = request.getProtocol(); + return loginService.getLoginViewResponse(cookie, protocol); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java index 305eecd5f4..9acffcf328 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java @@ -2,6 +2,7 @@ import org.apache.coyote.http11.auth.RegisterService; import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.response.HttpResponse; import static org.apache.coyote.http11.response.ResponsePage.REGISTER_PAGE; @@ -12,7 +13,11 @@ public class RegisterController extends AbstractController { @Override protected HttpResponse doPost(HttpRequest request, HttpResponse response) { - return registerService.getIndexOrConflictResponse(request, response); + final String account = request.requestBody().getBy("account"); + final String password = request.requestBody().getBy("password"); + final String email = request.requestBody().getBy("email"); + final Protocol protocol = request.getProtocol(); + return registerService.getIndexOrConflictResponse(account, password, email, protocol); } @Override diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java index 31c98d645f..05c8edbe08 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/RegisterServiceTest.java @@ -5,6 +5,7 @@ import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.line.HttpMethod; +import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.HttpResponse; import org.junit.jupiter.api.DisplayName; @@ -46,10 +47,14 @@ void getConflictResponseEntity() { RequestLine requestLine = requestLine_생성(POST, "/register"); RequestBody requestBody = requestBody_생성(); - HttpRequest request = HttpRequest.of(requestLine, null, requestBody); + + final String account = requestBody.getBy("account"); + final String password = requestBody.getBy("password"); + final String email = requestBody.getBy("email"); + final Protocol protocol = requestLine.protocol(); // when - HttpResponse response = registerService.getIndexOrConflictResponse(request, null); + HttpResponse response = registerService.getIndexOrConflictResponse(account, password, email, protocol); // then assertAll( @@ -65,10 +70,14 @@ void getFoundResponseEntity() { InMemoryUserRepository.deleteAll(); RequestLine requestLine = requestLine_생성(POST, "/register"); RequestBody requestBody = requestBody_생성(); - HttpRequest request = HttpRequest.of(requestLine, null, requestBody); + + final String account = requestBody.getBy("account"); + final String password = requestBody.getBy("password"); + final String email = requestBody.getBy("email"); + final Protocol protocol = requestLine.protocol(); // when - HttpResponse response = registerService.getIndexOrConflictResponse(request, null); + HttpResponse response = registerService.getIndexOrConflictResponse(account, password, email, protocol); // then assertAll( From 19edeb88c58e65d921c89eb4d7e81961bb532145 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Sun, 10 Sep 2023 16:57:27 +0900 Subject: [PATCH 16/25] =?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 --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 4 ++-- .../java/org/apache/coyote/http11/auth/RegisterService.java | 1 - .../java/org/apache/coyote/http11/request/RequestHandler.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) 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 618fcfd19f..f74cff0b6b 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -8,11 +8,11 @@ import java.net.Socket; import nextstep.jwp.exception.UncheckedServletException; import org.apache.coyote.Processor; -import org.apache.coyote.http11.request.HttpRequestGenerator; import org.apache.coyote.http11.request.HttpRequest; +import org.apache.coyote.http11.request.HttpRequestGenerator; import org.apache.coyote.http11.request.RequestHandler; -import org.apache.coyote.http11.response.HttpResponseGenerator; import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.HttpResponseGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java index 092de47e91..3bce897cf6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/RegisterService.java @@ -2,7 +2,6 @@ import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.line.Protocol; import org.apache.coyote.http11.response.HttpResponse; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java index 93aea5c592..6318198a2c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHandler.java @@ -3,8 +3,8 @@ import org.apache.coyote.http11.controller.LoginController; import org.apache.coyote.http11.controller.RegisterController; import org.apache.coyote.http11.request.line.Protocol; -import org.apache.coyote.http11.response.Location; import org.apache.coyote.http11.response.HttpResponse; +import org.apache.coyote.http11.response.Location; import static org.apache.coyote.http11.response.HttpStatus.OK; From b2f16b602336c024d4c73a8f69b7154a985c48ee Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Mon, 11 Sep 2023 12:50:28 +0900 Subject: [PATCH 17/25] =?UTF-8?q?refactor:=20HttpRequestGenerator=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/http11/request/HttpRequestGenerator.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java index e984932381..aad9f85620 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java @@ -8,12 +8,6 @@ public class HttpRequestGenerator { - private HttpRequest httpRequest; - - private HttpRequestGenerator(HttpRequest httpRequest) { - this.httpRequest = httpRequest; - } - public static HttpRequest generate(BufferedReader bufferedReader) throws IOException { final String firstLine = bufferedReader.readLine(); if (firstLine == null) { @@ -25,10 +19,6 @@ public static HttpRequest generate(BufferedReader bufferedReader) throws IOExcep return HttpRequest.of(requestLine, requestHeader, requestBody); } - public HttpRequest request() { - return httpRequest; - } - private static RequestHeader getHeader(final BufferedReader bufferedReader) throws IOException { List requestHeaders = new ArrayList<>(); for (String line = bufferedReader.readLine(); !"".equals(line); line = bufferedReader.readLine()) { From 00e56acf33140ae437d88cd72ac2016c5a7f4e40 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Mon, 11 Sep 2023 12:54:06 +0900 Subject: [PATCH 18/25] =?UTF-8?q?refactor:=20=EB=8B=A4=EC=A4=91=20cookie?= =?UTF-8?q?=20header=20=EC=84=A4=EC=A0=95=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/coyote/http11/request/RequestHeader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java index 7423818972..061b428f10 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java @@ -33,7 +33,7 @@ private static Map> convertKeyAndValue(List headers String key = keyAndValue.get(KEY_INDEX); String value = keyAndValue.get(VALUE_INDEX); - List values = removalSpace(asList(value.split(","))); + List values = removalSpace(asList(value.split(";"))); keyAndValues.put(key, values); } return keyAndValues; From c7d1c440dbb786c3a2c90f4345a301d9f821f584 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Mon, 11 Sep 2023 13:52:54 +0900 Subject: [PATCH 19/25] =?UTF-8?q?refactor:=20RequestHeader=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{RequestHeader.java => HttpHeader.java} | 8 ++--- .../coyote/http11/request/HttpRequest.java | 14 ++++----- .../http11/request/HttpRequestGenerator.java | 14 ++++----- .../coyote/http11/auth/LoginServiceTest.java | 9 +++--- .../handler/HttpRequestHandlerTest.java | 30 +++++++++---------- ...eaderTest.java => HttpHttpHeaderTest.java} | 20 ++++++------- 6 files changed, 47 insertions(+), 48 deletions(-) rename tomcat/src/main/java/org/apache/coyote/http11/request/{RequestHeader.java => HttpHeader.java} (88%) rename tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/{HttpRequestHeaderTest.java => HttpHttpHeaderTest.java} (62%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java similarity index 88% rename from tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java rename to tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java index 061b428f10..77c9f55b8d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java @@ -9,7 +9,7 @@ import static java.util.Arrays.asList; import static java.util.Collections.EMPTY_LIST; -public class RequestHeader { +public class HttpHeader { private static final int KEY_INDEX = 0; private static final int VALUE_INDEX = 1; @@ -17,12 +17,12 @@ public class RequestHeader { private final Map> headers; - private RequestHeader(Map> headers) { + private HttpHeader(Map> headers) { this.headers = headers; } - public static RequestHeader from(List headers) { - return new RequestHeader(convertKeyAndValue(headers)); + public static HttpHeader from(List headers) { + return new HttpHeader(convertKeyAndValue(headers)); } private static Map> convertKeyAndValue(List headers) { 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 7b3daa4d21..a5fae2bf13 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,25 +7,25 @@ public class HttpRequest { private final RequestLine requestLine; - private final RequestHeader requestHeader; + private final HttpHeader httpHeader; private final RequestBody requestBody; - private HttpRequest(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { + private HttpRequest(RequestLine requestLine, HttpHeader httpHeader, RequestBody requestBody) { this.requestLine = requestLine; - this.requestHeader = requestHeader; + this.httpHeader = httpHeader; this.requestBody = requestBody; } - public static HttpRequest of(RequestLine requestLine, RequestHeader requestHeader, RequestBody requestBody) { - return new HttpRequest(requestLine, requestHeader, requestBody); + public static HttpRequest of(RequestLine requestLine, HttpHeader httpHeader, RequestBody requestBody) { + return new HttpRequest(requestLine, httpHeader, requestBody); } public RequestLine requestLine() { return requestLine; } - public RequestHeader requestHeader() { - return requestHeader; + public HttpHeader requestHeader() { + return httpHeader; } public RequestBody requestBody() { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java index aad9f85620..2d81c20b4d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequestGenerator.java @@ -14,22 +14,22 @@ public static HttpRequest generate(BufferedReader bufferedReader) throws IOExcep return null; } final RequestLine requestLine = RequestLine.from(firstLine); - final RequestHeader requestHeader = getHeader(bufferedReader); - final RequestBody requestBody = getBody(bufferedReader, requestHeader); - return HttpRequest.of(requestLine, requestHeader, requestBody); + final HttpHeader httpHeader = getHeader(bufferedReader); + final RequestBody requestBody = getBody(bufferedReader, httpHeader); + return HttpRequest.of(requestLine, httpHeader, requestBody); } - private static RequestHeader getHeader(final BufferedReader bufferedReader) throws IOException { + private static HttpHeader getHeader(final BufferedReader bufferedReader) throws IOException { List requestHeaders = new ArrayList<>(); for (String line = bufferedReader.readLine(); !"".equals(line); line = bufferedReader.readLine()) { requestHeaders.add(line); } - return RequestHeader.from(requestHeaders); + return HttpHeader.from(requestHeaders); } - private static RequestBody getBody(final BufferedReader bufferedReader, final RequestHeader requestHeader) + private static RequestBody getBody(final BufferedReader bufferedReader, final HttpHeader httpHeader) throws IOException { - List contentLengths = requestHeader.headers().get("Content-Length"); + List contentLengths = httpHeader.headers().get("Content-Length"); if (contentLengths == null) { return RequestBody.from(null); } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java index 87baf48336..71bb014c15 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/LoginServiceTest.java @@ -3,9 +3,8 @@ import java.util.List; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; -import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; -import org.apache.coyote.http11.request.RequestHeader; +import org.apache.coyote.http11.request.HttpHeader; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.HttpResponse; @@ -36,7 +35,7 @@ class path에_따라_다른_Http_ResponseEntity를_반환한다 { return RequestLine.from(httpMethod.name() + " " + defaultPath + " " + "HTTP/1.1"); } - public RequestHeader requestHeader_생성() { + public HttpHeader requestHeader_생성() { List requests = List.of( "Host: www.test01.com", "Accept: image/gif, image/jpeg, */*", @@ -46,7 +45,7 @@ class path에_따라_다른_Http_ResponseEntity를_반환한다 { "Content-Length: 35" ); - return RequestHeader.from(requests); + return HttpHeader.from(requests); } public RequestBody requestBody_생성() { @@ -89,7 +88,7 @@ void getUnauthorizedResponseEntity() { InMemoryUserRepository.save(new User(1L, "페페", "password", "rltgjqmduftlagl@gmail.com")); RequestLine requestLine = requestLine_생성(POST, "/login"); - RequestHeader requestHeader = requestHeader_생성(); + HttpHeader httpHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); String account = requestBody.getBy("account"); diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java index a215769143..25ae22fa19 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java @@ -7,7 +7,7 @@ import org.apache.coyote.http11.request.HttpRequest; import org.apache.coyote.http11.request.RequestBody; import org.apache.coyote.http11.request.RequestHandler; -import org.apache.coyote.http11.request.RequestHeader; +import org.apache.coyote.http11.request.HttpHeader; import org.apache.coyote.http11.request.line.HttpMethod; import org.apache.coyote.http11.request.line.RequestLine; import org.apache.coyote.http11.response.HttpResponse; @@ -41,7 +41,7 @@ class path에_따라_다른_Http_ResponseEntity를_반환한다 { return RequestLine.from(httpMethod.name() + " " + defaultPath + " " + "HTTP/1.1"); } - public RequestHeader requestHeader_생성() { + public HttpHeader requestHeader_생성() { List requests = List.of( "Host: www.test01.com", "Accept: image/gif, image/jpeg, */*", @@ -51,7 +51,7 @@ class path에_따라_다른_Http_ResponseEntity를_반환한다 { "Content-Length: 35" ); - return RequestHeader.from(requests); + return HttpHeader.from(requests); } public RequestBody requestBody_생성() { @@ -70,9 +70,9 @@ class HTTP_METHOD_GET { void getLoginResponseEntity() { // given RequestLine requestLine = requestLine_생성(GET, "/login"); - RequestHeader requestHeader = requestHeader_생성(); + HttpHeader httpHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, httpHeader, requestBody); SessionRepository.clearSessions(); // when @@ -97,9 +97,9 @@ void getFoundResponseEntity() { InMemoryUserRepository.save(new User(1L, "베베", "password", "rltgjqmduftlagl@gmail.com")); RequestLine requestLine = requestLine_생성(POST, "/login"); - RequestHeader requestHeader = requestHeader_생성(); + HttpHeader httpHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, httpHeader, requestBody); // when HttpResponse response = requestHandler.getResponse(httpRequest); @@ -118,9 +118,9 @@ void getUnauthorizedResponseEntity() { InMemoryUserRepository.save(new User(1L, "페페", "password", "rltgjqmduftlagl@gmail.com")); RequestLine requestLine = requestLine_생성(POST, "/login"); - RequestHeader requestHeader = requestHeader_생성(); + HttpHeader httpHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, httpHeader, requestBody); // when HttpResponse response = requestHandler.getResponse(httpRequest); @@ -147,9 +147,9 @@ class HTTP_METHOD_GET { void getRegisterResponseEntity() { // given RequestLine requestLine = requestLine_생성(GET, "/register"); - RequestHeader requestHeader = requestHeader_생성(); + HttpHeader httpHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, httpHeader, requestBody); // when HttpResponse response = requestHandler.getResponse(httpRequest); @@ -173,9 +173,9 @@ void getConflictResponseEntity() { InMemoryUserRepository.save(new User(1L, "베베", "password", "rltgjqmduftlagl@gmail.com")); RequestLine requestLine = requestLine_생성(POST, "/register"); - RequestHeader requestHeader = requestHeader_생성(); + HttpHeader httpHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, httpHeader, requestBody); // when HttpResponse response = requestHandler.getResponse(httpRequest); @@ -192,9 +192,9 @@ void getConflictResponseEntity() { void getFoundResponseEntity() { // given RequestLine requestLine = requestLine_생성(POST, "/register"); - RequestHeader requestHeader = requestHeader_생성(); + HttpHeader httpHeader = requestHeader_생성(); RequestBody requestBody = requestBody_생성(); - HttpRequest httpRequest = HttpRequest.of(requestLine, requestHeader, requestBody); + HttpRequest httpRequest = HttpRequest.of(requestLine, httpHeader, requestBody); // when HttpResponse response = requestHandler.getResponse(httpRequest); diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpRequestHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpHttpHeaderTest.java similarity index 62% rename from tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpRequestHeaderTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpHttpHeaderTest.java index 9f6607d57d..63e438aae1 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpRequestHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpHttpHeaderTest.java @@ -1,17 +1,17 @@ package org.apache.coyote.http11.request.request.headers; import java.util.List; -import org.apache.coyote.http11.request.RequestHeader; +import org.apache.coyote.http11.request.HttpHeader; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; -class HttpRequestHeaderTest { +class HttpHttpHeaderTest { @Nested - class HttpRequestHeader_생성을_검증한다 { + class HttpHttpHeader_생성을_검증한다 { @Test void 유효한_RequestHeader라면_생성한다() { @@ -26,21 +26,21 @@ class HttpRequestHeader_생성을_검증한다 { ); // when - RequestHeader requestHeader = RequestHeader.from(requests); + HttpHeader httpHeader = HttpHeader.from(requests); // then assertAll( - () -> assertThat(requestHeader.headers().get("Host")) + () -> assertThat(httpHeader.headers().get("Host")) .contains("www.test01.com"), - () -> assertThat(requestHeader.headers().get("Accept")) + () -> assertThat(httpHeader.headers().get("Accept")) .contains("image/gif", "image/jpeg", "*/*"), - () -> assertThat(requestHeader.headers().get("Accept-Language")) + () -> assertThat(httpHeader.headers().get("Accept-Language")) .contains("en-us"), - () -> assertThat(requestHeader.headers().get("Accept-Encoding")) + () -> assertThat(httpHeader.headers().get("Accept-Encoding")) .contains("gzip", "deflate"), - () -> assertThat(requestHeader.headers().get("User-Agent")) + () -> assertThat(httpHeader.headers().get("User-Agent")) .contains("Mozilla/4.0"), - () -> assertThat(requestHeader.headers().get("Content-Length")) + () -> assertThat(httpHeader.headers().get("Content-Length")) .contains("35") ); } From ded5f7a8694584c13b5597044bf4ca297d9f5a78 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Mon, 11 Sep 2023 14:02:04 +0900 Subject: [PATCH 20/25] =?UTF-8?q?refactor:=20Session=EC=97=90=EC=84=9C=20n?= =?UTF-8?q?ull=20=EB=8C=80=EC=8B=A0=20Optional=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/coyote/http11/auth/LoginService.java | 5 +++-- .../org/apache/coyote/http11/auth/SessionRepository.java | 8 +++----- .../apache/coyote/http11/auth/SessionRepositoryTest.java | 5 +++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java index 43e8d3ac41..6776f4c65b 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java @@ -1,5 +1,6 @@ package org.apache.coyote.http11.auth; +import java.util.Optional; import java.util.UUID; import nextstep.jwp.db.InMemoryUserRepository; import nextstep.jwp.model.User; @@ -17,8 +18,8 @@ public class LoginService { private final SessionRepository sessionRepository = new SessionRepository(); public HttpResponse getLoginViewResponse(Cookie cookie, Protocol protocol) { - final Session session = sessionRepository.getSession(cookie.get(COOKIE_KEY)); - if (session == null) { + final Optional session = sessionRepository.getSession(cookie.get(COOKIE_KEY)); + if (session.isEmpty()) { return HttpResponse.getCookieNullResponseEntity(protocol, LOGIN_PAGE); } return HttpResponse.getCookieNullResponseEntity(protocol, INDEX_PAGE); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java index b0676ca8de..aea0189253 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java @@ -1,6 +1,7 @@ package org.apache.coyote.http11.auth; import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; public class SessionRepository { @@ -14,11 +15,8 @@ public static void create(Session session) { SESSIONS.put(session.getId(), session); } - public Session getSession(String id) { - if (id == null) { - return null; - } - return SESSIONS.get(id); + public Optional getSession(String id) { + return Optional.ofNullable(SESSIONS.get(id)); } public static void clearSessions() { diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/SessionRepositoryTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/SessionRepositoryTest.java index e931fb3222..7986623192 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/SessionRepositoryTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/SessionRepositoryTest.java @@ -1,5 +1,6 @@ package org.apache.coyote.http11.auth; +import java.util.Optional; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -27,10 +28,10 @@ class SessionRepositoryTest { sessionRepository.create(Session.from(sessionId)); // when - Session session = sessionRepository.getSession(sessionId); + Optional session = sessionRepository.getSession(sessionId); // then - Assertions.assertThat(session.getId()).isEqualTo(sessionId); + Assertions.assertThat(session.get().getId()).isEqualTo(sessionId); } } From a871936910d11ac3e2bada36a533f203cd1a2da5 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Mon, 11 Sep 2023 14:09:27 +0900 Subject: [PATCH 21/25] =?UTF-8?q?refactor:=20null=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=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/coyote/http11/auth/SessionRepository.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java index aea0189253..81955aeef6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java @@ -9,9 +9,6 @@ public class SessionRepository { private static final Map SESSIONS = new ConcurrentHashMap<>(); public static void create(Session session) { - if (session.getId() == null) { - return; - } SESSIONS.put(session.getId(), session); } From ae90174f9c3eadc5cbcc1d5f51de773865c59f79 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Mon, 11 Sep 2023 14:26:27 +0900 Subject: [PATCH 22/25] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http11/controller/LoginController.java | 1 + .../coyote/http11/request/HttpHeader.java | 2 +- .../handler/HttpRequestHandlerTest.java | 25 ------------------- 3 files changed, 2 insertions(+), 26 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java index 9ff06ce9c1..749f1e4b49 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/LoginController.java @@ -34,6 +34,7 @@ protected HttpResponse doPost(final HttpRequest request, final HttpResponse resp @Override protected HttpResponse doGet(final HttpRequest request, final HttpResponse response) { + System.out.println("실행"); Cookie cookie = request.requestHeader().getCookie(); Protocol protocol = request.getProtocol(); return loginService.getLoginViewResponse(cookie, protocol); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java index 77c9f55b8d..fc6176ca24 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java @@ -33,7 +33,7 @@ private static Map> convertKeyAndValue(List headers String key = keyAndValue.get(KEY_INDEX); String value = keyAndValue.get(VALUE_INDEX); - List values = removalSpace(asList(value.split(";"))); + List values = removalSpace(asList(value.split(","))); keyAndValues.put(key, values); } return keyAndValues; diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java index 25ae22fa19..d3db90055a 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/handler/HttpRequestHandlerTest.java @@ -62,31 +62,6 @@ class path에_따라_다른_Http_ResponseEntity를_반환한다 { @Nested class path가_login이라면 { - @Nested - class HTTP_METHOD_GET { - - @Test - @DisplayName("로그인을 하지 않은 상태일 때 LOGIN Response를 반환한다.") - void getLoginResponseEntity() { - // given - RequestLine requestLine = requestLine_생성(GET, "/login"); - HttpHeader httpHeader = requestHeader_생성(); - RequestBody requestBody = requestBody_생성(); - HttpRequest httpRequest = HttpRequest.of(requestLine, httpHeader, requestBody); - SessionRepository.clearSessions(); - - // when - HttpResponse response = requestHandler.getResponse(httpRequest); - - // then - assertAll( - () -> assertThat(response.getHttpStatus()).isEqualTo(OK), - () -> assertThat(response.getLocation()).isEqualTo("/login.html") - ); - } - - } - @Nested class HTTP_METHOD_POST { From 255ced3cd159e0ba7e26607e464f307a93fb5b7e Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Wed, 13 Sep 2023 02:33:21 +0900 Subject: [PATCH 23/25] =?UTF-8?q?refactor:=20cookie=20=EA=B0=92=20Optional?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/coyote/http11/Http11Processor.java | 1 + .../main/java/org/apache/coyote/http11/auth/Cookie.java | 8 ++++++-- .../java/org/apache/coyote/http11/auth/LoginService.java | 6 +++++- .../org/apache/coyote/http11/auth/SessionRepository.java | 3 +++ 4 files changed, 15 insertions(+), 3 deletions(-) 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 f74cff0b6b..6f37d59585 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -43,6 +43,7 @@ public void process(final Socket connection) { final HttpRequest httpRequest = HttpRequestGenerator.generate(bufferedReader); final HttpResponse httpResponse = requestHandler.getResponse(httpRequest); final String response = responseGenerator.generate(httpResponse); + System.out.println("response = " + response); outputStream.write(response.getBytes()); outputStream.flush(); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java index bb62449305..f67862b16a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import static java.util.Collections.EMPTY_MAP; import static java.util.stream.Collectors.collectingAndThen; @@ -43,8 +44,11 @@ public void put(final String key, final String value) { elements.put(key, value); } - public String get(final String key) { - return elements.get(key); + public Optional get(final String key) { + if (key == null) { + return Optional.empty(); + } + return Optional.of(elements.get(key)); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java index 6776f4c65b..c72ad0a81a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/LoginService.java @@ -18,7 +18,11 @@ public class LoginService { private final SessionRepository sessionRepository = new SessionRepository(); public HttpResponse getLoginViewResponse(Cookie cookie, Protocol protocol) { - final Optional session = sessionRepository.getSession(cookie.get(COOKIE_KEY)); + Optional cookieOption = cookie.get(COOKIE_KEY); + if (cookieOption.isEmpty()) { + return HttpResponse.getCookieNullResponseEntity(protocol, LOGIN_PAGE); + } + final Optional session = sessionRepository.getSession(cookieOption.get()); if (session.isEmpty()) { return HttpResponse.getCookieNullResponseEntity(protocol, LOGIN_PAGE); } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java index 81955aeef6..341f8fedd3 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java @@ -13,6 +13,9 @@ public static void create(Session session) { } public Optional getSession(String id) { + if (id == null) { + return Optional.ofNullable(null); + } return Optional.ofNullable(SESSIONS.get(id)); } From ad61f36ec7b8b8f852ad2f06a4ddb2827d084232 Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Wed, 13 Sep 2023 02:41:17 +0900 Subject: [PATCH 24/25] =?UTF-8?q?refactor:=20=EC=97=AC=EB=9F=AC=EA=B0=9C?= =?UTF-8?q?=EC=9D=98=20cookie=20=EA=B0=92=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/coyote/http11/auth/Cookie.java | 2 +- .../java/org/apache/coyote/http11/request/HttpHeader.java | 2 +- .../coyote/http11/response/HttpResponseGenerator.java | 7 ++++++- .../java/org/apache/coyote/http11/auth/CookieTest.java | 4 ++-- .../http11/request/request/headers/HttpHttpHeaderTest.java | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java index f67862b16a..5670290ac8 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/Cookie.java @@ -48,7 +48,7 @@ public Optional get(final String key) { if (key == null) { return Optional.empty(); } - return Optional.of(elements.get(key)); + return Optional.ofNullable(elements.get(key)); } } diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java index fc6176ca24..77c9f55b8d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpHeader.java @@ -33,7 +33,7 @@ private static Map> convertKeyAndValue(List headers String key = keyAndValue.get(KEY_INDEX); String value = keyAndValue.get(VALUE_INDEX); - List values = removalSpace(asList(value.split(","))); + List values = removalSpace(asList(value.split(";"))); keyAndValues.put(key, values); } return keyAndValues; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java index 5db9edf68f..aefaed8dc0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/response/HttpResponseGenerator.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.net.URL; import java.nio.file.Files; +import java.util.Optional; public class HttpResponseGenerator { @@ -70,7 +71,11 @@ private String generateRedirectResponse(final HttpResponse httpResponse) { } private String generateSetCookieLine(final HttpResponse httpResponse) { - final String jsessionid = httpResponse.getHttpCookie().get("JSESSIONID"); + Optional cookieOption = httpResponse.getHttpCookie().get("JSESSIONID"); + if (cookieOption.isEmpty()) { + return null; + } + final String jsessionid = cookieOption.get(); if (jsessionid == null) { return ""; } diff --git a/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java b/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java index a26d16f212..3079165cbc 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/auth/CookieTest.java @@ -22,7 +22,7 @@ class 쿠키_생성_검증 { Cookie cookie = Cookie.from(elements); // then - assertThat(cookie.get("JSESSIONID")).isEqualTo("5669d1ea-eb70-4881-b17e-c7ab8cfd10b8"); + assertThat(cookie.get("JSESSIONID").get()).isEqualTo("5669d1ea-eb70-4881-b17e-c7ab8cfd10b8"); } } @@ -39,7 +39,7 @@ class 쿠키_저장_검증 { cookie.put("woowacourse", "베베"); // then - assertThat(cookie.get("woowacourse")).isEqualTo("베베"); + assertThat(cookie.get("woowacourse").get()).isEqualTo("베베"); } @Test diff --git a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpHttpHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpHttpHeaderTest.java index 63e438aae1..dd6567f37a 100644 --- a/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpHttpHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/request/request/headers/HttpHttpHeaderTest.java @@ -33,11 +33,11 @@ class HttpHttpHeader_생성을_검증한다 { () -> assertThat(httpHeader.headers().get("Host")) .contains("www.test01.com"), () -> assertThat(httpHeader.headers().get("Accept")) - .contains("image/gif", "image/jpeg", "*/*"), + .contains("image/gif, image/jpeg, */*"), () -> assertThat(httpHeader.headers().get("Accept-Language")) .contains("en-us"), () -> assertThat(httpHeader.headers().get("Accept-Encoding")) - .contains("gzip", "deflate"), + .contains("gzip, deflate"), () -> assertThat(httpHeader.headers().get("User-Agent")) .contains("Mozilla/4.0"), () -> assertThat(httpHeader.headers().get("Content-Length")) From 1b8ab949ca3e83128b68b413758cd189d41073da Mon Sep 17 00:00:00 2001 From: wonyongChoi05 Date: Wed, 13 Sep 2023 02:42:37 +0900 Subject: [PATCH 25/25] =?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/auth/SessionRepository.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java index 341f8fedd3..52922b38c6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/auth/SessionRepository.java @@ -19,8 +19,4 @@ public Optional getSession(String id) { return Optional.ofNullable(SESSIONS.get(id)); } - public static void clearSessions() { - SESSIONS.clear(); - } - }