From 2c76bb2a8221775d5af5fecaaa2f6404eee88b6c Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 3 Nov 2023 17:37:00 +0900 Subject: [PATCH 001/124] refactor(http): remove `HttpRequest` class --- .../coyote/http11/request/HttpRequest.java | 44 ------------------- 1 file changed, 44 deletions(-) delete mode 100644 tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java deleted file mode 100644 index a83b5e0..0000000 --- a/tomcat/src/main/java/org/apache/coyote/http11/request/HttpRequest.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.apache.coyote.http11.request; - -import java.io.BufferedReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import lombok.Getter; - -@Getter -public class HttpRequest { - - private String method; - private String path; - private Map headers; - private String body; - - public static HttpRequest parse(BufferedReader bufferedReader) throws IOException { - - HttpRequest request = new HttpRequest(); - - String requestLine = bufferedReader.readLine(); - String[] requestParts = requestLine.split(" "); - request.method = requestParts[0]; - request.path = requestParts[1]; - - String line; - request.headers = new HashMap<>(); - while (!(line = bufferedReader.readLine()).isEmpty()) { - String[] headerParts = line.split(": "); - request.headers.put(headerParts[0], headerParts[1]); - } - - if ("POST".equals(request.method) && request.headers.containsKey("Content-Length")) { - int contentLength = Integer.parseInt(request.headers.get("Content-Length")); - char[] bodyChars = new char[contentLength]; - bufferedReader.read(bodyChars, 0, contentLength); - request.body = new String(bodyChars); - } - - return request; - } - -} From 68207987ce665f0202686f63f9ba05097e2a6ec2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sun, 5 Nov 2023 23:48:16 +0900 Subject: [PATCH 002/124] refactor(http): reorganize Http11Processor class for improved readability --- .../apache/coyote/http11/Http11Processor.java | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 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 d13f01d..3fb4564 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -1,46 +1,47 @@ package org.apache.coyote.http11; -import nextstep.jwp.exception.UncheckedServletException; +import java.io.IOException; +import java.net.Socket; + import org.apache.coyote.Processor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; -import java.net.Socket; +import nextstep.jwp.exception.UncheckedServletException; public class Http11Processor implements Runnable, Processor { - private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); + private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); - private final Socket connection; + private final Socket connection; - public Http11Processor(final Socket connection) { - this.connection = connection; - } + public Http11Processor(final Socket connection) { + this.connection = connection; + } - @Override - public void run() { - process(connection); - } + @Override + public void run() { + process(connection); + } - @Override - public void process(final Socket connection) { - try (final var inputStream = connection.getInputStream(); - final var outputStream = connection.getOutputStream()) { + @Override + public void process(final Socket connection) { + try (final var inputStream = connection.getInputStream(); + final var outputStream = connection.getOutputStream()) { - final var responseBody = "Hello world!"; + final var responseBody = "Hello world!"; - final var response = String.join("\r\n", - "HTTP/1.1 200 OK ", - "Content-Type: text/html;charset=utf-8 ", - "Content-Length: " + responseBody.getBytes().length + " ", - "", - responseBody); + final var response = String.join("\r\n", + "HTTP/1.1 200 OK ", + "Content-Type: text/html;charset=utf-8 ", + "Content-Length: " + responseBody.getBytes().length + " ", + "", + responseBody); - outputStream.write(response.getBytes()); - outputStream.flush(); - } catch (IOException | UncheckedServletException e) { - log.error(e.getMessage(), e); - } - } + outputStream.write(response.getBytes()); + outputStream.flush(); + } catch (IOException | UncheckedServletException e) { + log.error(e.getMessage(), e); + } + } } From 3d5306e247742c2f3e879cb45d887902685e5983 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sun, 5 Nov 2023 23:56:40 +0900 Subject: [PATCH 003/124] refactor(build): remove lombok dependency --- tomcat/build.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/tomcat/build.gradle b/tomcat/build.gradle index 36f1e5d..aad5408 100644 --- a/tomcat/build.gradle +++ b/tomcat/build.gradle @@ -17,9 +17,6 @@ dependencies { implementation 'org.apache.commons:commons-lang3:3.12.0' - implementation 'org.projectlombok:lombok:1.18.22' - annotationProcessor 'org.projectlombok:lombok:1.18.22' - testImplementation 'org.assertj:assertj-core:3.22.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testImplementation "org.mockito:mockito-core:3.+" From 5b4e16d28e2f9d227302dd8b7c95fc5683bbac6f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 00:18:28 +0900 Subject: [PATCH 004/124] feat(http): add BufferedReader to read lines from `inputStream` --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 4 ++++ 1 file changed, 4 insertions(+) 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 3fb4564..3ff144a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -1,6 +1,8 @@ package org.apache.coyote.http11; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.net.Socket; import org.apache.coyote.Processor; @@ -29,6 +31,8 @@ public void process(final Socket connection) { try (final var inputStream = connection.getInputStream(); final var outputStream = connection.getOutputStream()) { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + final var responseBody = "Hello world!"; final var response = String.join("\r\n", From 2718e82924d2b4dd507f56300508f00d7cae4a38 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 00:26:07 +0900 Subject: [PATCH 005/124] feat(http): parse request line --- .../java/org/apache/coyote/http11/Http11Processor.java | 7 +++++++ 1 file changed, 7 insertions(+) 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 3ff144a..107fac6 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -33,6 +33,13 @@ public void process(final Socket connection) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String line = bufferedReader.readLine(); + String[] splittedRequestLine = line.split(" "); + + String httpMethod = splittedRequestLine[0]; + String uri = splittedRequestLine[1]; + String httpVersion = splittedRequestLine[2]; + final var responseBody = "Hello world!"; final var response = String.join("\r\n", From 2c1a152cced064c1694db7ab2ca442f2511f7433 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 00:29:12 +0900 Subject: [PATCH 006/124] refactor(http): replace magic numbers by using constants --- .../java/org/apache/coyote/http11/Http11Processor.java | 10 +++++++--- 1 file changed, 7 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 107fac6..6a7406a 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -13,6 +13,10 @@ public class Http11Processor implements Runnable, Processor { + private static final int HTTP_METHOD = 0; + private static final int HTTP_URI = 1; + private static final int HTTP_VERSION = 2; + private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); private final Socket connection; @@ -36,9 +40,9 @@ public void process(final Socket connection) { String line = bufferedReader.readLine(); String[] splittedRequestLine = line.split(" "); - String httpMethod = splittedRequestLine[0]; - String uri = splittedRequestLine[1]; - String httpVersion = splittedRequestLine[2]; + String httpMethod = splittedRequestLine[HTTP_METHOD]; + String uri = splittedRequestLine[HTTP_URI]; + String httpVersion = splittedRequestLine[HTTP_VERSION]; final var responseBody = "Hello world!"; From 4ea8df93c1a8520dd11ec54c60250616a481b585 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 00:34:45 +0900 Subject: [PATCH 007/124] refactor(http): replace poor readability argument with constant --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 6a7406a..00020b3 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -16,6 +16,7 @@ public class Http11Processor implements Runnable, Processor { private static final int HTTP_METHOD = 0; private static final int HTTP_URI = 1; private static final int HTTP_VERSION = 2; + private static final String REQUEST_LINE_SPACE = " "; private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); @@ -38,7 +39,7 @@ public void process(final Socket connection) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = bufferedReader.readLine(); - String[] splittedRequestLine = line.split(" "); + String[] splittedRequestLine = line.split(REQUEST_LINE_SPACE); String httpMethod = splittedRequestLine[HTTP_METHOD]; String uri = splittedRequestLine[HTTP_URI]; From 63f790bf9ab0646ae3eec622be5192012b343f1f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 01:16:22 +0900 Subject: [PATCH 008/124] feat(http): add HttpMethod enum --- .../main/java/org/apache/coyote/http11/HttpMethod.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/HttpMethod.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpMethod.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpMethod.java new file mode 100644 index 0000000..56ae2ad --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpMethod.java @@ -0,0 +1,10 @@ +package org.apache.coyote.http11; + +public enum HttpMethod { + + GET, + POST, + PUT, + DELETE; + +} From a1e901846df1fa10ff8a51bd77aa74fa30da9e0b Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 02:29:15 +0900 Subject: [PATCH 009/124] refactor(http): rename constant --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 00020b3..9f3be95 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -17,6 +17,7 @@ public class Http11Processor implements Runnable, Processor { private static final int HTTP_URI = 1; private static final int HTTP_VERSION = 2; private static final String REQUEST_LINE_SPACE = " "; + private static final String BLANK_SPACE = " "; private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); @@ -39,7 +40,7 @@ public void process(final Socket connection) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = bufferedReader.readLine(); - String[] splittedRequestLine = line.split(REQUEST_LINE_SPACE); + String[] splittedRequestLine = line.split(BLANK_SPACE); String httpMethod = splittedRequestLine[HTTP_METHOD]; String uri = splittedRequestLine[HTTP_URI]; From 00cae424526e2a9c21db949eaf7b84b5887a4edc Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 02:29:49 +0900 Subject: [PATCH 010/124] refactor(http): add constants to improve readability --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 9f3be95..c27b401 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -16,8 +16,10 @@ public class Http11Processor implements Runnable, Processor { private static final int HTTP_METHOD = 0; private static final int HTTP_URI = 1; private static final int HTTP_VERSION = 2; - private static final String REQUEST_LINE_SPACE = " "; + private static final int HEADER_KEY = 0; + private static final int HEADER_VALUE = 0; private static final String BLANK_SPACE = " "; + private static final String HEADER_SPLITTER = ": "; private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); From f9b3249e30b383d4bac2c12f9ff5af09dd01a06f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 02:50:19 +0900 Subject: [PATCH 011/124] refactor(http): add logs to check flow --- .../src/main/java/org/apache/coyote/http11/Http11Processor.java | 2 ++ 1 file changed, 2 insertions(+) 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 c27b401..dc69032 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -47,6 +47,8 @@ public void process(final Socket connection) { String httpMethod = splittedRequestLine[HTTP_METHOD]; String uri = splittedRequestLine[HTTP_URI]; String httpVersion = splittedRequestLine[HTTP_VERSION]; + log.info("httpMethod: {}, uri: {}, httpVersion: {}", httpMethod, uri, httpVersion); + log.info("requestHeaders: {}", requestHeaders); final var responseBody = "Hello world!"; From 0dac2b97011e497fc162adf54cd5d0b4e661a549 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 08:26:01 +0900 Subject: [PATCH 012/124] feat(http): add parsing HTTP request headers --- .../org/apache/coyote/http11/Http11Processor.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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 dc69032..7837f90 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; +import java.util.HashMap; +import java.util.Map; import org.apache.coyote.Processor; import org.slf4j.Logger; @@ -48,6 +50,16 @@ public void process(final Socket connection) { String uri = splittedRequestLine[HTTP_URI]; String httpVersion = splittedRequestLine[HTTP_VERSION]; log.info("httpMethod: {}, uri: {}, httpVersion: {}", httpMethod, uri, httpVersion); + + Map requestHeaders = new HashMap<>(); + + line = bufferedReader.readLine(); + while (!line.equals("")) { + String[] splittedHeaderLine = line.split(HEADER_SPLITTER); + requestHeaders.put(splittedHeaderLine[HEADER_KEY], splittedHeaderLine[HEADER_VALUE]); + line = bufferedReader.readLine(); + } + log.info("requestHeaders: {}", requestHeaders); final var responseBody = "Hello world!"; From 41a83a5686e58521ed8f287ae4e1f68fbbc5e2cf Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 16:13:36 +0900 Subject: [PATCH 013/124] feat(http): add parsing HTTP request body --- .../apache/coyote/http11/Http11Processor.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) 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 7837f90..6c116da 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -62,6 +62,28 @@ public void process(final Socket connection) { log.info("requestHeaders: {}", requestHeaders); + String requestBody; + if (requestHeaders.containsKey("Content-Length")) { + int contentLength = Integer.parseInt(requestHeaders.get("Content-Length")); + char[] bodyChars = new char[contentLength]; + bufferedReader.read(bodyChars, 0, contentLength); + requestBody = new String(bodyChars); + } else if (requestHeaders.containsKey("Transfer-Encoding") && requestHeaders.get("Transfer-Encoding") + .equals("chunked")) { + StringBuilder chunkRequestBody = new StringBuilder(); + while ((line = bufferedReader.readLine()) != null) { + int chunkSize = Integer.parseInt(line, 16); + if (chunkSize == 0) { + break; + } + char[] chunk = new char[chunkSize]; + bufferedReader.read(chunk, 0, chunkSize); + chunkRequestBody.append(chunk); + bufferedReader.readLine(); + } + requestBody = chunkRequestBody.toString(); + } + final var responseBody = "Hello world!"; final var response = String.join("\r\n", From 5097b61b7f9f5dc5d817b5ef77a21e275fff8005 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 16:21:25 +0900 Subject: [PATCH 014/124] refactor(http): correct `HEADER_VALUE` --- .../src/main/java/org/apache/coyote/http11/Http11Processor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6c116da..62b8739 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -19,7 +19,7 @@ public class Http11Processor implements Runnable, Processor { private static final int HTTP_URI = 1; private static final int HTTP_VERSION = 2; private static final int HEADER_KEY = 0; - private static final int HEADER_VALUE = 0; + private static final int HEADER_VALUE = 1; private static final String BLANK_SPACE = " "; private static final String HEADER_SPLITTER = ": "; From 9376c0300f1d302694bad79ccf18ba03b1fdab03 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 17:04:49 +0900 Subject: [PATCH 015/124] style(http): add explanatory comments --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 4 ++++ 1 file changed, 4 insertions(+) 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 62b8739..50c4695 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -41,6 +41,7 @@ public void process(final Socket connection) { try (final var inputStream = connection.getInputStream(); final var outputStream = connection.getOutputStream()) { + // HTTP Request BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = bufferedReader.readLine(); @@ -84,6 +85,9 @@ public void process(final Socket connection) { requestBody = chunkRequestBody.toString(); } + // HTTP Response + + final var responseBody = "Hello world!"; final var response = String.join("\r\n", From 9cdde5a003f62a529c0b1068dd734559555f111a Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 19:53:39 +0900 Subject: [PATCH 016/124] feat(http): add HttpStatus enum --- .../org/apache/coyote/http11/HttpStatus.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/HttpStatus.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpStatus.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpStatus.java new file mode 100644 index 0000000..30462a8 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpStatus.java @@ -0,0 +1,28 @@ +package org.apache.coyote.http11; + +public enum HttpStatus { + + OK(200, "OK"), + CREATED(201, "Created"), + FOUND(302, "Found"), + NOT_FOUND(404, "Not Found"), + UNAUTHORIZED(401, "Unauthorized"), + INTERNAL_SERVER_ERROR(500, "Internal Server Erro"), + BAD_REQUEST(400, "Bad Request"); + + private final int code; + private final String status; + + HttpStatus(int code, String status) { + this.code = code; + this.status = status; + } + + public int getCode() { + return code; + } + + public String getStatus() { + return status; + } +} From 7b15d14a5fb36d08a8c5989746d9122e27f50296 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Mon, 6 Nov 2023 22:30:39 +0900 Subject: [PATCH 017/124] refactor(http): use HttpMethod enum for request parsing --- .../java/org/apache/coyote/http11/Http11Processor.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 50c4695..2c6fbfd 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -47,7 +47,12 @@ public void process(final Socket connection) { String line = bufferedReader.readLine(); String[] splittedRequestLine = line.split(BLANK_SPACE); - String httpMethod = splittedRequestLine[HTTP_METHOD]; + HttpMethod httpMethod; + try { + httpMethod = HttpMethod.valueOf(splittedRequestLine[HTTP_METHOD]); + } catch (IllegalArgumentException e) { + httpMethod = null; + } String uri = splittedRequestLine[HTTP_URI]; String httpVersion = splittedRequestLine[HTTP_VERSION]; log.info("httpMethod: {}, uri: {}, httpVersion: {}", httpMethod, uri, httpVersion); From 82a15dd082165fe10eef2125e2567ea6837c14d2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 7 Nov 2023 03:01:24 +0900 Subject: [PATCH 018/124] feat(http): add response handling for GET HTTP method --- .../apache/coyote/http11/Http11Processor.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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 2c6fbfd..0a5b7c7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -91,7 +91,24 @@ public void process(final Socket connection) { } // HTTP Response - + HttpStatus httpStatus = null; + String responseBody = null; + + if (httpMethod == null) { + responseBody = "Unsupported Method"; + httpStatus = HttpStatus.BAD_REQUEST; + } else { + if (httpMethod.equals(HttpMethod.GET)) { + String resourceContent = findResources(uri); + if (resourceContent != null) { + responseBody = resourceContent; + httpStatus = HttpStatus.OK; + } else { + responseBody = "Resource Not Found"; + httpStatus = HttpStatus.NOT_FOUND; + } + } + } final var responseBody = "Hello world!"; From a91d6a9824d0644e02a3c5bc152db0449b6c68bc Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 7 Nov 2023 09:28:10 +0900 Subject: [PATCH 019/124] feat(http): add `findResources` method that read static resources --- .../org/apache/coyote/http11/Http11Processor.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 0a5b7c7..46f2c28 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -4,6 +4,9 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; @@ -125,4 +128,16 @@ public void process(final Socket connection) { log.error(e.getMessage(), e); } } + + private String findResources(String uri) { + try { + Path filePath = Paths.get(System.getProperty("user.dir"), "tomcat/src/main/resources/static" + uri); + if (Files.exists(filePath) && !Files.isDirectory(filePath)) { + return Files.readString(filePath); + } + } catch (IOException e) { + log.error("Error reading resource: " + uri, e); + } + return null; + } } From bf2d7546b0f1d25b3a6397c247197d0cd294bb84 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 7 Nov 2023 09:28:42 +0900 Subject: [PATCH 020/124] refactor(http): add logs to check flow --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 4 ++++ 1 file changed, 4 insertions(+) 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 46f2c28..193d0e7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -103,6 +103,7 @@ public void process(final Socket connection) { } else { if (httpMethod.equals(HttpMethod.GET)) { String resourceContent = findResources(uri); + log.info("resourceContent: {}", resourceContent); if (resourceContent != null) { responseBody = resourceContent; httpStatus = HttpStatus.OK; @@ -122,6 +123,8 @@ public void process(final Socket connection) { "", responseBody); + log.info("response: {}", response); + outputStream.write(response.getBytes()); outputStream.flush(); } catch (IOException | UncheckedServletException e) { @@ -132,6 +135,7 @@ public void process(final Socket connection) { private String findResources(String uri) { try { Path filePath = Paths.get(System.getProperty("user.dir"), "tomcat/src/main/resources/static" + uri); + log.info("filePath: {}", filePath); if (Files.exists(filePath) && !Files.isDirectory(filePath)) { return Files.readString(filePath); } From 8bedc88bb3e28a4b15da90cc045481e150e6fc65 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 7 Nov 2023 09:30:14 +0900 Subject: [PATCH 021/124] feat(http): add HTTP response creation logic --- .../org/apache/coyote/http11/Http11Processor.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 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 193d0e7..f48de05 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -114,12 +114,11 @@ public void process(final Socket connection) { } } - final var responseBody = "Hello world!"; - - final var response = String.join("\r\n", - "HTTP/1.1 200 OK ", - "Content-Type: text/html;charset=utf-8 ", - "Content-Length: " + responseBody.getBytes().length + " ", + // creating HTTP Response + String response = String.join("\r\n", + "HTTP/1.1 " + httpStatus.getCode() + " " + httpStatus.getStatus(), + "Content-Type: text/html;charset=utf-8", + "Content-Length: " + responseBody.getBytes().length, "", responseBody); From 99a5f3a84a549023983b45e05e0a805f525b5fc1 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 7 Nov 2023 15:26:36 +0900 Subject: [PATCH 022/124] feat(http): add ContentType enum --- .../org/apache/coyote/http11/ContentType.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/ContentType.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java b/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java new file mode 100644 index 0000000..18a21ce --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java @@ -0,0 +1,34 @@ +package org.apache.coyote.http11; + +import java.util.Arrays; + +public enum ContentType { + + HTML("html", "text/html;charset=utf-8"), + CSS("css", "text/css;charset=utf-8"), + JS("js", "application/javascript;charset=utf-8"), + PNG("png", "image/png"), + JPG("jpg", "image/jpeg"), + JPEG("jpeg", "image/jpeg"), + GIF("gif", "image/gif"), + DEFAULT("", "text/plain;charset=utf-8"); + + private final String extension; + private final String mimeType; + + ContentType(String extension, String mimeType) { + this.extension = extension; + this.mimeType = mimeType; + } + + public String getMimeType() { + return mimeType; + } + + public static ContentType findByExtension(String extension) { + return Arrays.stream(values()) + .filter(mimeType -> mimeType.extension.equalsIgnoreCase(extension)) + .findFirst() + .orElse(DEFAULT); + } +} From fce34e8cb60caf70a092092661b7ce846618aa56 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 7 Nov 2023 15:46:33 +0900 Subject: [PATCH 023/124] refactor(http): remove response confirming log --- .../src/main/java/org/apache/coyote/http11/Http11Processor.java | 2 -- 1 file changed, 2 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 f48de05..5f92593 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -122,8 +122,6 @@ public void process(final Socket connection) { "", responseBody); - log.info("response: {}", response); - outputStream.write(response.getBytes()); outputStream.flush(); } catch (IOException | UncheckedServletException e) { From 64726c7d913860951c73f4d03f3095690cb50602 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 7 Nov 2023 16:02:22 +0900 Subject: [PATCH 024/124] feat(http): improve logic to determine MIME types dynamically --- .../src/main/java/org/apache/coyote/http11/Http11Processor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5f92593..ff8ae21 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -117,7 +117,7 @@ public void process(final Socket connection) { // creating HTTP Response String response = String.join("\r\n", "HTTP/1.1 " + httpStatus.getCode() + " " + httpStatus.getStatus(), - "Content-Type: text/html;charset=utf-8", + "Content-Type: " + ContentType.findByExtension(uri.split("\\.")[1]).getMimeType(), "Content-Length: " + responseBody.getBytes().length, "", responseBody); From 1ac03ddec754b375d15b287e5274185c0c38e51e Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 10:27:03 +0900 Subject: [PATCH 025/124] feat(http): add query parsing logic --- .../org/apache/coyote/http11/Http11Processor.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 ff8ae21..33a5e09 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -57,6 +57,20 @@ public void process(final Socket connection) { httpMethod = null; } String uri = splittedRequestLine[HTTP_URI]; + + // if `uri` contains `?` + Map queryParams = new HashMap<>(); + if (uri.contains("?")) { + String[] splittedQuery = uri.split("\\?")[1].split("\\&"); + uri = uri.split("\\?")[0]; + for (int i = 0; i < splittedQuery.length; i++) { + String[] values = splittedQuery[i].split("\\="); + queryParams.put(values[0], values[1]); + } + } + + log.info("queryParams: {}", queryParams); + String httpVersion = splittedRequestLine[HTTP_VERSION]; log.info("httpMethod: {}, uri: {}, httpVersion: {}", httpMethod, uri, httpVersion); From 73a4543136baf05f99f9018058dc21ea0a68b552 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 12:40:12 +0900 Subject: [PATCH 026/124] feat(HttpRequest): add HttpRequest class --- .../coyote/http11/HttpRequest/HttpRequest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java new file mode 100644 index 0000000..a3bfa71 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -0,0 +1,18 @@ +package org.apache.coyote.http11.HttpRequest; + +public class HttpRequest { + + private final String httpMethod; + private final String uri; + private final String httpVersion; + + private HttpRequest(String httpMethod, String uri, String httpVersion) { + this.httpMethod = httpMethod; + this.uri = uri; + this.httpVersion = httpVersion; + } + + public static HttpRequest of(String httpMethod, String uri, String httpVersion) { + return new HttpRequest(httpMethod, uri, httpVersion); + } +} From c1ba78a3850ff64b59b6b048a7dce57fabd272c9 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 12:53:26 +0900 Subject: [PATCH 027/124] refactor(HttpRequest): rename HttpRequest class fields --- .../coyote/http11/HttpRequest/HttpRequest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index a3bfa71..d9de89c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -2,14 +2,14 @@ public class HttpRequest { - private final String httpMethod; - private final String uri; - private final String httpVersion; + private final String requestLine; + private final String requestHeader; + private final String requestBody; - private HttpRequest(String httpMethod, String uri, String httpVersion) { - this.httpMethod = httpMethod; - this.uri = uri; - this.httpVersion = httpVersion; + private HttpRequest(String requestLine, String requestHeader, String requestBody) { + this.requestLine = requestLine; + this.requestHeader = requestHeader; + this.requestBody = requestBody; } public static HttpRequest of(String httpMethod, String uri, String httpVersion) { From 4d3e02619a8bf3fd8d9a2ad6e536d4e2e5255bab Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 13:59:12 +0900 Subject: [PATCH 028/124] refactor(HttpRequest): change static factory method parameter to BufferedReader --- .../apache/coyote/http11/HttpRequest/HttpRequest.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index d9de89c..d14bf51 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -1,5 +1,8 @@ package org.apache.coyote.http11.HttpRequest; +import java.io.BufferedReader; +import java.io.IOException; + public class HttpRequest { private final String requestLine; @@ -12,7 +15,9 @@ private HttpRequest(String requestLine, String requestHeader, String requestBody this.requestBody = requestBody; } - public static HttpRequest of(String httpMethod, String uri, String httpVersion) { - return new HttpRequest(httpMethod, uri, httpVersion); + public static HttpRequest of(BufferedReader bufferedReader) throws IOException { + + } + } } From fcd4d137c3d7efcad40c801be7b06566e4c533b7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 14:00:08 +0900 Subject: [PATCH 029/124] refactor(HttpRequest): rename static factory method to `from` --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index d14bf51..8840b8f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -15,7 +15,7 @@ private HttpRequest(String requestLine, String requestHeader, String requestBody this.requestBody = requestBody; } - public static HttpRequest of(BufferedReader bufferedReader) throws IOException { + public static HttpRequest from(BufferedReader bufferedReader) throws IOException { } From e384975f1c69c6a1b9ccf279f048343040ef805f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 14:24:26 +0900 Subject: [PATCH 030/124] feat(HttpRequest): add `getRequestline` method to read request line --- .../org/apache/coyote/http11/HttpRequest/HttpRequest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 8840b8f..7dd6064 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -19,5 +19,9 @@ public static HttpRequest from(BufferedReader bufferedReader) throws IOException } + private static String getRequestLine(BufferedReader bufferedReader) throws IOException { + return bufferedReader.readLine(); + } + } } From 70b9d3e933eced0d94d7ad12c9f613e3014cc56d Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 14:25:07 +0900 Subject: [PATCH 031/124] feat(HttpRequest): add `getRequestHeader` method to read request header --- .../org/apache/coyote/http11/HttpRequest/HttpRequest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 7dd6064..5dd58b7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -23,5 +23,12 @@ private static String getRequestLine(BufferedReader bufferedReader) throws IOExc return bufferedReader.readLine(); } + private static String getRequestHeader(BufferedReader bufferedReader) throws IOException { + StringBuilder requestHeaderBuilder = new StringBuilder(); + String headerLine; + while ((headerLine = bufferedReader.readLine()) != null && !headerLine.equals("")) { + requestHeaderBuilder.append(headerLine).append("\r\n"); + } + return requestHeaderBuilder.toString(); } } From 3d3b3878d3f35dccef455a6e937704af87e3edd2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 14:25:23 +0900 Subject: [PATCH 032/124] feat(HttpRequest): add `getRequestBody` method to read request body --- .../apache/coyote/http11/HttpRequest/HttpRequest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 5dd58b7..57e6366 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -31,4 +31,13 @@ private static String getRequestHeader(BufferedReader bufferedReader) throws IOE } return requestHeaderBuilder.toString(); } + + private static String getRequestBody(BufferedReader bufferedReader) throws IOException { + StringBuilder requestBodyBuilder = new StringBuilder(); + String bodyLine; + while ((bodyLine = bufferedReader.readLine()) != null) { + requestBodyBuilder.append(bodyLine).append("\r\n"); + } + return requestBodyBuilder.toString(); + } } From 3108ea26828a235ed86db5a0902da81bf371c890 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 14:26:16 +0900 Subject: [PATCH 033/124] refactor(HttpRequest): replace low readability code with constant --- .../org/apache/coyote/http11/HttpRequest/HttpRequest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 57e6366..70cd323 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -5,6 +5,8 @@ public class HttpRequest { + private static final String CRLF = "\r\n"; + private final String requestLine; private final String requestHeader; private final String requestBody; @@ -27,7 +29,7 @@ private static String getRequestHeader(BufferedReader bufferedReader) throws IOE StringBuilder requestHeaderBuilder = new StringBuilder(); String headerLine; while ((headerLine = bufferedReader.readLine()) != null && !headerLine.equals("")) { - requestHeaderBuilder.append(headerLine).append("\r\n"); + requestHeaderBuilder.append(headerLine).append(CRLF); } return requestHeaderBuilder.toString(); } @@ -36,7 +38,7 @@ private static String getRequestBody(BufferedReader bufferedReader) throws IOExc StringBuilder requestBodyBuilder = new StringBuilder(); String bodyLine; while ((bodyLine = bufferedReader.readLine()) != null) { - requestBodyBuilder.append(bodyLine).append("\r\n"); + requestBodyBuilder.append(bodyLine).append(CRLF); } return requestBodyBuilder.toString(); } From 525280ca3c5ed82611894cc1817312f6fcbfff6a Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 14:27:56 +0900 Subject: [PATCH 034/124] feat(HttpRequest): complete static factory method by constructor code --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 70cd323..ae35475 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -18,7 +18,8 @@ private HttpRequest(String requestLine, String requestHeader, String requestBody } public static HttpRequest from(BufferedReader bufferedReader) throws IOException { - + return new HttpRequest(getRequestLine(bufferedReader), getRequestHeader(bufferedReader), + getRequestBody(bufferedReader)); } private static String getRequestLine(BufferedReader bufferedReader) throws IOException { From 6ef3e71889516212cbd8b17e25425af1098a9acc Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 14:28:18 +0900 Subject: [PATCH 035/124] feat(HttpRequest): add HttpRequest class fields --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index ae35475..b537bb3 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -10,6 +10,9 @@ public class HttpRequest { private final String requestLine; private final String requestHeader; private final String requestBody; + private String httpMethod; + private String uri; + private String httpVersion; private HttpRequest(String requestLine, String requestHeader, String requestBody) { this.requestLine = requestLine; From a94e7abd3c36e2aa438d21a1f8724cb2eb523adf Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 15:24:19 +0900 Subject: [PATCH 036/124] refactor(HttpRequest): remove useless class fields --- .../org/apache/coyote/http11/HttpRequest/HttpRequest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index b537bb3..43bf351 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -6,10 +6,6 @@ public class HttpRequest { private static final String CRLF = "\r\n"; - - private final String requestLine; - private final String requestHeader; - private final String requestBody; private String httpMethod; private String uri; private String httpVersion; From 6251ee34737e501c742e1fac8e97fdf1cd05b0b5 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 15:25:24 +0900 Subject: [PATCH 037/124] refactor(HttpRequest): remove initialization of removed class fields --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 43bf351..8f1b909 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -11,9 +11,6 @@ public class HttpRequest { private String httpVersion; private HttpRequest(String requestLine, String requestHeader, String requestBody) { - this.requestLine = requestLine; - this.requestHeader = requestHeader; - this.requestBody = requestBody; } public static HttpRequest from(BufferedReader bufferedReader) throws IOException { From b4af063f9823aa07fa4c9329e43fc610871fb81c Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 15:26:03 +0900 Subject: [PATCH 038/124] refactor(HttpRequest): replace low readability code with constant --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 8f1b909..94a5a96 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -6,6 +6,7 @@ public class HttpRequest { private static final String CRLF = "\r\n"; + private static final String BLANK_SPACE = " "; private String httpMethod; private String uri; private String httpVersion; From 8f570dc5ef0637019b712777ab37be0bedaf0c31 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 16:12:40 +0900 Subject: [PATCH 039/124] feat(HttpRequest): add `requestHeaders` field --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 94a5a96..40a3c6b 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -2,6 +2,7 @@ import java.io.BufferedReader; import java.io.IOException; +import java.util.Map; public class HttpRequest { @@ -10,6 +11,7 @@ public class HttpRequest { private String httpMethod; private String uri; private String httpVersion; + private Map requestHeaders; private HttpRequest(String requestLine, String requestHeader, String requestBody) { } From 98f33820c0621d386ff76c6ecb6a4411f4864dbf Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 16:15:03 +0900 Subject: [PATCH 040/124] feat(HttpRequest): add `parseRequestLine` method --- .../org/apache/coyote/http11/HttpRequest/HttpRequest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 40a3c6b..4337906 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -25,6 +25,13 @@ private static String getRequestLine(BufferedReader bufferedReader) throws IOExc return bufferedReader.readLine(); } + private void parseRequestLine(String requestline) { + String[] splittedRequestLine = requestline.split(BLANK_SPACE); + this.httpMethod = splittedRequestLine[0]; + this.uri = splittedRequestLine[1]; + this.httpVersion = splittedRequestLine[2]; + } + private static String getRequestHeader(BufferedReader bufferedReader) throws IOException { StringBuilder requestHeaderBuilder = new StringBuilder(); String headerLine; From 43a25c7fde7a3c0349c8b457ea0db931d879259f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 8 Nov 2023 18:08:02 +0900 Subject: [PATCH 041/124] feat(HttpRequest): add `parseRequestHeaders` method --- .../apache/coyote/http11/HttpRequest/HttpRequest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 4337906..0cfbb3e 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -41,6 +41,16 @@ private static String getRequestHeader(BufferedReader bufferedReader) throws IOE return requestHeaderBuilder.toString(); } + private void parseRequestHeaders(String requestHeader) { + this.requestHeaders = Arrays.stream(requestHeader.split(REGEX_CRLF)) + .filter(line -> line.contains(":")) + .map(line -> line.split(":", 2)) + .collect(Collectors.toMap( + arr -> arr[0].trim(), + arr -> arr[1].trim(), + (value1, value2) -> value1)); + } + private static String getRequestBody(BufferedReader bufferedReader) throws IOException { StringBuilder requestBodyBuilder = new StringBuilder(); String bodyLine; From 8c1b170e52afc9b0936182427be01c3eceeed816 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Thu, 9 Nov 2023 00:14:24 +0900 Subject: [PATCH 042/124] refactor(HttpRequest): replace low readability code with constant --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 0cfbb3e..ae1ecc3 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -7,8 +7,11 @@ public class HttpRequest { private static final String CRLF = "\r\n"; + private static final String REGEX_CRLF = "\\r?\\n"; private static final String BLANK_SPACE = " "; private String httpMethod; + private static final String CONTENT_LENGTH = "Content-Length"; + private static final String TRANSFER_ENCODING = "Transfer-Encoding"; private String uri; private String httpVersion; private Map requestHeaders; From be057a56f2368308f1368817d538d4e2e0805b38 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Thu, 9 Nov 2023 00:28:29 +0900 Subject: [PATCH 043/124] refactor(HttpRequest): replace `httpMethod` with HttpMethod enum --- .../org/apache/coyote/http11/HttpRequest/HttpRequest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index ae1ecc3..525cd6c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -3,15 +3,16 @@ import java.io.BufferedReader; import java.io.IOException; import java.util.Map; +import org.apache.coyote.http11.HttpMethod; public class HttpRequest { private static final String CRLF = "\r\n"; private static final String REGEX_CRLF = "\\r?\\n"; private static final String BLANK_SPACE = " "; - private String httpMethod; private static final String CONTENT_LENGTH = "Content-Length"; private static final String TRANSFER_ENCODING = "Transfer-Encoding"; + private HttpMethod httpMethod; private String uri; private String httpVersion; private Map requestHeaders; @@ -30,7 +31,7 @@ private static String getRequestLine(BufferedReader bufferedReader) throws IOExc private void parseRequestLine(String requestline) { String[] splittedRequestLine = requestline.split(BLANK_SPACE); - this.httpMethod = splittedRequestLine[0]; + this.httpMethod = HttpMethod.valueOf(splittedRequestLine[0]); this.uri = splittedRequestLine[1]; this.httpVersion = splittedRequestLine[2]; } From dc794bd4d13024b7a54165b52bc97151dacf4e71 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Thu, 9 Nov 2023 00:28:49 +0900 Subject: [PATCH 044/124] feat(HttpRequest): add `requestBody` field --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 525cd6c..3cccc75 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -3,6 +3,8 @@ import java.io.BufferedReader; import java.io.IOException; import java.util.Map; +import java.util.stream.Collectors; + import org.apache.coyote.http11.HttpMethod; public class HttpRequest { @@ -16,6 +18,7 @@ public class HttpRequest { private String uri; private String httpVersion; private Map requestHeaders; + private String requestBody; private HttpRequest(String requestLine, String requestHeader, String requestBody) { } From a2e7c3f20148221a0e255181964897ad8105fc0f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 10:30:25 +0900 Subject: [PATCH 045/124] build(build.gradle): add lombok dependency --- tomcat/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/build.gradle b/tomcat/build.gradle index aad5408..04cc140 100644 --- a/tomcat/build.gradle +++ b/tomcat/build.gradle @@ -17,6 +17,9 @@ dependencies { implementation 'org.apache.commons:commons-lang3:3.12.0' + annotationProcessor 'org.projectlombok:lombok:1.18.20' + compileOnly 'org.projectlombok:lombok:1.18.20' + testImplementation 'org.assertj:assertj-core:3.22.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testImplementation "org.mockito:mockito-core:3.+" From e98a752c6b80dd629108bba15d3a9191a64779de Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 10:33:11 +0900 Subject: [PATCH 046/124] refactor(Http11Processor): extract HTTP request parsing to `HttpRequest` class --- .../apache/coyote/http11/Http11Processor.java | 64 +------------------ 1 file changed, 3 insertions(+), 61 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 33a5e09..4a54e1f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -7,10 +7,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; import org.apache.coyote.Processor; +import org.apache.coyote.http11.HttpRequest.HttpRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,65 +46,8 @@ public void process(final Socket connection) { // HTTP Request BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); - String line = bufferedReader.readLine(); - String[] splittedRequestLine = line.split(BLANK_SPACE); - - HttpMethod httpMethod; - try { - httpMethod = HttpMethod.valueOf(splittedRequestLine[HTTP_METHOD]); - } catch (IllegalArgumentException e) { - httpMethod = null; - } - String uri = splittedRequestLine[HTTP_URI]; - - // if `uri` contains `?` - Map queryParams = new HashMap<>(); - if (uri.contains("?")) { - String[] splittedQuery = uri.split("\\?")[1].split("\\&"); - uri = uri.split("\\?")[0]; - for (int i = 0; i < splittedQuery.length; i++) { - String[] values = splittedQuery[i].split("\\="); - queryParams.put(values[0], values[1]); - } - } - - log.info("queryParams: {}", queryParams); - - String httpVersion = splittedRequestLine[HTTP_VERSION]; - log.info("httpMethod: {}, uri: {}, httpVersion: {}", httpMethod, uri, httpVersion); - - Map requestHeaders = new HashMap<>(); - - line = bufferedReader.readLine(); - while (!line.equals("")) { - String[] splittedHeaderLine = line.split(HEADER_SPLITTER); - requestHeaders.put(splittedHeaderLine[HEADER_KEY], splittedHeaderLine[HEADER_VALUE]); - line = bufferedReader.readLine(); - } - - log.info("requestHeaders: {}", requestHeaders); - - String requestBody; - if (requestHeaders.containsKey("Content-Length")) { - int contentLength = Integer.parseInt(requestHeaders.get("Content-Length")); - char[] bodyChars = new char[contentLength]; - bufferedReader.read(bodyChars, 0, contentLength); - requestBody = new String(bodyChars); - } else if (requestHeaders.containsKey("Transfer-Encoding") && requestHeaders.get("Transfer-Encoding") - .equals("chunked")) { - StringBuilder chunkRequestBody = new StringBuilder(); - while ((line = bufferedReader.readLine()) != null) { - int chunkSize = Integer.parseInt(line, 16); - if (chunkSize == 0) { - break; - } - char[] chunk = new char[chunkSize]; - bufferedReader.read(chunk, 0, chunkSize); - chunkRequestBody.append(chunk); - bufferedReader.readLine(); - } - requestBody = chunkRequestBody.toString(); - } + HttpRequest httpRequest = HttpRequest.from(bufferedReader); + log.info("httpRequest: {}", httpRequest); // HTTP Response HttpStatus httpStatus = null; From 537873f507d22318924440138a4f3618f326cac3 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 10:34:28 +0900 Subject: [PATCH 047/124] feat(HttpRequest): add `@Getter` lombok annotation --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 3cccc75..287baff 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -7,6 +7,9 @@ import org.apache.coyote.http11.HttpMethod; +import lombok.Getter; + +@Getter public class HttpRequest { private static final String CRLF = "\r\n"; From 4a5eacdf2444ecc28baa47c2251c7726b624a765 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 13:24:41 +0900 Subject: [PATCH 048/124] feat(HttpRequest): add parsing method for transfer encoding --- .../coyote/http11/HttpRequest/HttpRequest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 287baff..1b156e7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -69,4 +69,18 @@ private static String getRequestBody(BufferedReader bufferedReader) throws IOExc } return requestBodyBuilder.toString(); } + + private void parseTransferEncodingRequestBody(BufferedReader bufferedReader) throws IOException { + StringBuilder requestBodyBuilder = new StringBuilder(); + String chunkSizeLine; + while (!(chunkSizeLine = bufferedReader.readLine()).equals("0")) { + int chunkSize = Integer.parseInt(chunkSizeLine, 16); + char[] chunkData = new char[chunkSize]; + int bytesRead = bufferedReader.read(chunkData, 0, chunkSize); + requestBodyBuilder.append(chunkData, 0, bytesRead); + bufferedReader.readLine(); + } + bufferedReader.readLine(); + this.requestBody = requestBodyBuilder.toString(); + } } From 5d3ac163764a3d3aae9cc3aee7a11d986687ecf7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 13:38:36 +0900 Subject: [PATCH 049/124] refactor(HttpRequest): update request body parsing method --- .../coyote/http11/HttpRequest/HttpRequest.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 1b156e7..d085f52 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -61,13 +61,11 @@ private void parseRequestHeaders(String requestHeader) { (value1, value2) -> value1)); } - private static String getRequestBody(BufferedReader bufferedReader) throws IOException { - StringBuilder requestBodyBuilder = new StringBuilder(); - String bodyLine; - while ((bodyLine = bufferedReader.readLine()) != null) { - requestBodyBuilder.append(bodyLine).append(CRLF); - } - return requestBodyBuilder.toString(); + private void parseContentLengthRequestBody(BufferedReader bufferedReader) throws IOException { + int contentLength = Integer.parseInt(requestHeaders.get(CONTENT_LENGTH)); + char[] charRequestBody = new char[contentLength]; + int bytesRead = bufferedReader.read(charRequestBody, 0, contentLength); + this.requestBody = new String(charRequestBody, 0, bytesRead); } private void parseTransferEncodingRequestBody(BufferedReader bufferedReader) throws IOException { From 3dc34d9d22fb30e985fbf43154397d7f52c95ade Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 13:40:03 +0900 Subject: [PATCH 050/124] refactor(HttpRequest): update request headers parsing method --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index d085f52..7420ad8 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -51,7 +51,8 @@ private static String getRequestHeader(BufferedReader bufferedReader) throws IOE return requestHeaderBuilder.toString(); } - private void parseRequestHeaders(String requestHeader) { + private void parseRequestHeaders(BufferedReader bufferedReader) throws IOException { + String requestHeader = getRequestHeader(bufferedReader); this.requestHeaders = Arrays.stream(requestHeader.split(REGEX_CRLF)) .filter(line -> line.contains(":")) .map(line -> line.split(":", 2)) From 62340951532c304ed0ddb26aaaec4f9ab6a01e76 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 16:06:47 +0900 Subject: [PATCH 051/124] refactor(HttpRequest): replace low readability code with constant --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 7420ad8..6c8a31c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -17,6 +17,7 @@ public class HttpRequest { private static final String BLANK_SPACE = " "; private static final String CONTENT_LENGTH = "Content-Length"; private static final String TRANSFER_ENCODING = "Transfer-Encoding"; + private static final String CHUNKED = "chunked"; private HttpMethod httpMethod; private String uri; private String httpVersion; From bcf1b1a384c3ea53277ee67c01c338d736a1fb5c Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 16:09:37 +0900 Subject: [PATCH 052/124] refactor(HttpRequest): complete `HttpRequest`constructor to use BufferedReader as parameter --- .../apache/coyote/http11/HttpRequest/HttpRequest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 6c8a31c..bda6274 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -24,7 +24,14 @@ public class HttpRequest { private Map requestHeaders; private String requestBody; - private HttpRequest(String requestLine, String requestHeader, String requestBody) { + private HttpRequest(BufferedReader bufferedReader) throws IOException { + parseRequestLine(bufferedReader); + parseRequestHeaders(bufferedReader); + if (requestHeaders.containsKey(CONTENT_LENGTH)) { + parseContentLengthRequestBody(bufferedReader); + } else if (requestHeaders.containsKey(TRANSFER_ENCODING)) { + parseTransferEncodingRequestBody(bufferedReader); + } } public static HttpRequest from(BufferedReader bufferedReader) throws IOException { From 432e63fda34892ad0f2eb006dc2c58f4aec7e600 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 16:10:41 +0900 Subject: [PATCH 053/124] refactor(HttpRequest): replace low readability code with `isEmpty`method --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index bda6274..07a1223 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -53,7 +53,7 @@ private void parseRequestLine(String requestline) { private static String getRequestHeader(BufferedReader bufferedReader) throws IOException { StringBuilder requestHeaderBuilder = new StringBuilder(); String headerLine; - while ((headerLine = bufferedReader.readLine()) != null && !headerLine.equals("")) { + while ((headerLine = bufferedReader.readLine()) != null && !headerLine.isEmpty()) { requestHeaderBuilder.append(headerLine).append(CRLF); } return requestHeaderBuilder.toString(); From b72c3608b517f64885c2e10e1699ecd5f7c0d640 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 16:11:12 +0900 Subject: [PATCH 054/124] refactor(HttpRequest): Initialize `requestBody` field --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 07a1223..47061f8 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -22,7 +22,7 @@ public class HttpRequest { private String uri; private String httpVersion; private Map requestHeaders; - private String requestBody; + private String requestBody = null; private HttpRequest(BufferedReader bufferedReader) throws IOException { parseRequestLine(bufferedReader); From 1eb9993852673ee33817f0ee207eeea9798212b6 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 16:14:08 +0900 Subject: [PATCH 055/124] refactor(HttpRequest): modify code to pass BufferedReader directly to constructor --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 47061f8..cc155b7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -35,8 +35,7 @@ private HttpRequest(BufferedReader bufferedReader) throws IOException { } public static HttpRequest from(BufferedReader bufferedReader) throws IOException { - return new HttpRequest(getRequestLine(bufferedReader), getRequestHeader(bufferedReader), - getRequestBody(bufferedReader)); + return new HttpRequest(bufferedReader); } private static String getRequestLine(BufferedReader bufferedReader) throws IOException { From 3d903681b5d5bb9590b8adfea0d3aebfbeba1734 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 19:09:48 +0900 Subject: [PATCH 056/124] refactor(HttpRequest): modify `parseRequestLine` method to read request line from BufferedReader --- .../org/apache/coyote/http11/HttpRequest/HttpRequest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index cc155b7..5c998ce 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -42,8 +42,9 @@ private static String getRequestLine(BufferedReader bufferedReader) throws IOExc return bufferedReader.readLine(); } - private void parseRequestLine(String requestline) { - String[] splittedRequestLine = requestline.split(BLANK_SPACE); + private void parseRequestLine(BufferedReader bufferedReader) throws IOException { + String requestLine = getRequestLine(bufferedReader); + String[] splittedRequestLine = requestLine.split(BLANK_SPACE); this.httpMethod = HttpMethod.valueOf(splittedRequestLine[0]); this.uri = splittedRequestLine[1]; this.httpVersion = splittedRequestLine[2]; From fd1dbc855d54a76986ebc5c5d4848b284260162d Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 19:12:17 +0900 Subject: [PATCH 057/124] refactor(HttpRequest): add import for java.util.Arrays --- .../java/org/apache/coyote/http11/HttpRequest/HttpRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java index 5c998ce..904d486 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java @@ -2,6 +2,7 @@ import java.io.BufferedReader; import java.io.IOException; +import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; From e4ddc888d5179023e2fe2fbeda83b330281f2cb5 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 19:15:06 +0900 Subject: [PATCH 058/124] refactor(Http11Processor): remove resource mapping code --- .../apache/coyote/http11/Http11Processor.java | 17 ----------------- 1 file changed, 17 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 4a54e1f..e211c08 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -53,23 +53,6 @@ public void process(final Socket connection) { HttpStatus httpStatus = null; String responseBody = null; - if (httpMethod == null) { - responseBody = "Unsupported Method"; - httpStatus = HttpStatus.BAD_REQUEST; - } else { - if (httpMethod.equals(HttpMethod.GET)) { - String resourceContent = findResources(uri); - log.info("resourceContent: {}", resourceContent); - if (resourceContent != null) { - responseBody = resourceContent; - httpStatus = HttpStatus.OK; - } else { - responseBody = "Resource Not Found"; - httpStatus = HttpStatus.NOT_FOUND; - } - } - } - // creating HTTP Response String response = String.join("\r\n", "HTTP/1.1 " + httpStatus.getCode() + " " + httpStatus.getStatus(), From 70b3bce4fa1de96b22e815138972f803fd4d35d2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 19:15:48 +0900 Subject: [PATCH 059/124] refactor(Http11Processor): modify code to get `uri` from `HttpRequest` --- .../src/main/java/org/apache/coyote/http11/Http11Processor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e211c08..ef59ea0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -56,7 +56,7 @@ public void process(final Socket connection) { // creating HTTP Response String response = String.join("\r\n", "HTTP/1.1 " + httpStatus.getCode() + " " + httpStatus.getStatus(), - "Content-Type: " + ContentType.findByExtension(uri.split("\\.")[1]).getMimeType(), + "Content-Type: " + ContentType.findByExtension(httpRequest.getUri().split("\\.")[1]).getMimeType(), "Content-Length: " + responseBody.getBytes().length, "", responseBody); From 29372f02cb888ea5c4c639e8d2b15c04d6126fb2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 19:16:13 +0900 Subject: [PATCH 060/124] refactor(Http11Processor): add logs to confirm normal operation --- .../java/org/apache/coyote/http11/Http11Processor.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 ef59ea0..33e55bf 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -47,7 +47,12 @@ public void process(final Socket connection) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); HttpRequest httpRequest = HttpRequest.from(bufferedReader); - log.info("httpRequest: {}", httpRequest); + + log.info("httpRequest.getHttpMethod(): {}", httpRequest.getHttpMethod()); + log.info("httpRequest.getUri(): {}", httpRequest.getUri()); + log.info("httpRequest.getHttpVersion(): {}", httpRequest.getHttpVersion()); + log.info("httpRequest.getRequestHeaders(): {}", httpRequest.getRequestHeaders()); + log.info("httpRequest.getRequestBody(): {}", httpRequest.getRequestBody()); // HTTP Response HttpStatus httpStatus = null; From bc515121c635a9058430531710c9de60abdcdfaa Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 19:19:42 +0900 Subject: [PATCH 061/124] feat(HttpResponse): add `HttpResponse` class --- .../org/apache/coyote/http11/HttpResponse/HttpResponse.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java new file mode 100644 index 0000000..a636e14 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java @@ -0,0 +1,5 @@ +package org.apache.coyote.http11.HttpResponse; + +public class HttpResponse { + +} From 12dd7b7fcead5fabcf7907b009fb7b3486ea9d2b Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 10 Nov 2023 19:20:05 +0900 Subject: [PATCH 062/124] feat(HttpResponse): add `@Getter` lombok annotation --- .../org/apache/coyote/http11/HttpResponse/HttpResponse.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java index a636e14..fad6ddd 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java @@ -1,5 +1,8 @@ package org.apache.coyote.http11.HttpResponse; +import lombok.Getter; + +@Getter public class HttpResponse { } From 6d3c6d8e731ba2bd5c06d8b1ca5df37c481b543c Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 14 Nov 2023 15:18:27 +0900 Subject: [PATCH 063/124] feat(RequestMapping): add custom annotation for dynamic controller mapping --- .../org/apache/coyote/http11/RequestMapping.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/RequestMapping.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/RequestMapping.java b/tomcat/src/main/java/org/apache/coyote/http11/RequestMapping.java new file mode 100644 index 0000000..53204b3 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/RequestMapping.java @@ -0,0 +1,12 @@ +package org.apache.coyote.http11; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface RequestMapping { + String value(); +} From 47cc025450f2d748ce9cf2d9f58ee9351b9eb243 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 14 Nov 2023 15:48:27 +0900 Subject: [PATCH 064/124] feat(Controller): add `Controller` interface --- .../java/org/apache/coyote/http11/controller/Controller.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java 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 0000000..d7d34f5 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java @@ -0,0 +1,5 @@ +package org.apache.coyote.http11.controller; + +public interface Controller { + +} From cbb85961be40861808d27746d69dc8478696eb2a Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 14 Nov 2023 15:49:20 +0900 Subject: [PATCH 065/124] feat(Controller): add `handleRequest` method --- .../java/org/apache/coyote/http11/controller/Controller.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java index d7d34f5..0ca536e 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java @@ -1,5 +1,8 @@ package org.apache.coyote.http11.controller; -public interface Controller { +import org.apache.coyote.http11.HttpRequest.HttpRequest; +import org.apache.coyote.http11.HttpResponse.HttpResponse; +public interface Controller { + HttpResponse handleRequest(HttpRequest httpRequest); } From ef99510d4e8b19a59b406f9bff0c6155c58ffd55 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 14 Nov 2023 15:51:17 +0900 Subject: [PATCH 066/124] refactor(RequestMapping): move `RequestMapping` custom annotation to `common` package --- .../org/apache/coyote/http11/{ => common}/RequestMapping.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tomcat/src/main/java/org/apache/coyote/http11/{ => common}/RequestMapping.java (88%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/RequestMapping.java b/tomcat/src/main/java/org/apache/coyote/http11/common/RequestMapping.java similarity index 88% rename from tomcat/src/main/java/org/apache/coyote/http11/RequestMapping.java rename to tomcat/src/main/java/org/apache/coyote/http11/common/RequestMapping.java index 53204b3..7e7e50f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/RequestMapping.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/common/RequestMapping.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11; +package org.apache.coyote.http11.common; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; From 0579ee6156d956c15804cd9cf4ef6f48e9beb4fa Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 14 Nov 2023 16:00:06 +0900 Subject: [PATCH 067/124] feat(ControllerScanner): add `ControllerScanner` class --- .../org/apache/coyote/http11/common/ControllerScanner.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java new file mode 100644 index 0000000..1ab148f --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java @@ -0,0 +1,4 @@ +package org.apache.coyote.http11.common; + +public class ControllerScanner { +} From db09525bceebaba0d2ad2ee795e85c6787daf7fe Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 14 Nov 2023 16:21:47 +0900 Subject: [PATCH 068/124] refactor(Controller): remove `Controller` class --- .../org/apache/coyote/http11/controller/Controller.java | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java 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 deleted file mode 100644 index 0ca536e..0000000 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/Controller.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.apache.coyote.http11.controller; - -import org.apache.coyote.http11.HttpRequest.HttpRequest; -import org.apache.coyote.http11.HttpResponse.HttpResponse; - -public interface Controller { - HttpResponse handleRequest(HttpRequest httpRequest); -} From 897e296a694ac06e5f0f09ca1e9f55cb82193148 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 14 Nov 2023 19:37:57 +0900 Subject: [PATCH 069/124] refactor(ContentType): replace `getMimeType` method with `@Getter` lombok annotation --- .../main/java/org/apache/coyote/http11/ContentType.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java b/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java index 18a21ce..595deff 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java @@ -2,6 +2,8 @@ import java.util.Arrays; +import lombok.Getter; + public enum ContentType { HTML("html", "text/html;charset=utf-8"), @@ -14,6 +16,7 @@ public enum ContentType { DEFAULT("", "text/plain;charset=utf-8"); private final String extension; + @Getter private final String mimeType; ContentType(String extension, String mimeType) { @@ -21,10 +24,6 @@ public enum ContentType { this.mimeType = mimeType; } - public String getMimeType() { - return mimeType; - } - public static ContentType findByExtension(String extension) { return Arrays.stream(values()) .filter(mimeType -> mimeType.extension.equalsIgnoreCase(extension)) From c6878977d53267eba2ea8daa222918488f113eee Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 09:26:40 +0900 Subject: [PATCH 070/124] refactor(Http11Processor): remove unnecessary constants --- .../java/org/apache/coyote/http11/Http11Processor.java | 8 -------- 1 file changed, 8 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 33e55bf..f68e71e 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -17,14 +17,6 @@ public class Http11Processor implements Runnable, Processor { - private static final int HTTP_METHOD = 0; - private static final int HTTP_URI = 1; - private static final int HTTP_VERSION = 2; - private static final int HEADER_KEY = 0; - private static final int HEADER_VALUE = 1; - private static final String BLANK_SPACE = " "; - private static final String HEADER_SPLITTER = ": "; - private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); private final Socket connection; From c4a7b7544d4384b9ef9d29cf2872d1c3566e6958 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 09:27:33 +0900 Subject: [PATCH 071/124] refactor(Http11Processor): remove unnecessary `findResources` method --- .../org/apache/coyote/http11/Http11Processor.java | 15 --------------- 1 file changed, 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 f68e71e..bcfdb72 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -4,9 +4,6 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import org.apache.coyote.Processor; import org.apache.coyote.http11.HttpRequest.HttpRequest; @@ -65,16 +62,4 @@ public void process(final Socket connection) { } } - private String findResources(String uri) { - try { - Path filePath = Paths.get(System.getProperty("user.dir"), "tomcat/src/main/resources/static" + uri); - log.info("filePath: {}", filePath); - if (Files.exists(filePath) && !Files.isDirectory(filePath)) { - return Files.readString(filePath); - } - } catch (IOException e) { - log.error("Error reading resource: " + uri, e); - } - return null; - } } From 9c02586527dd972a5fab12335d6b2ff70d332ae2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 09:32:32 +0900 Subject: [PATCH 072/124] refactor(Http11Processor): remove `response` creating part --- .../java/org/apache/coyote/http11/Http11Processor.java | 10 +--------- 1 file changed, 1 insertion(+), 9 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 bcfdb72..446dd0d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -47,15 +47,7 @@ public void process(final Socket connection) { HttpStatus httpStatus = null; String responseBody = null; - // creating HTTP Response - String response = String.join("\r\n", - "HTTP/1.1 " + httpStatus.getCode() + " " + httpStatus.getStatus(), - "Content-Type: " + ContentType.findByExtension(httpRequest.getUri().split("\\.")[1]).getMimeType(), - "Content-Length: " + responseBody.getBytes().length, - "", - responseBody); - - outputStream.write(response.getBytes()); + outputStream.flush(); } catch (IOException | UncheckedServletException e) { log.error(e.getMessage(), e); From dde757ef3bccf557b039a1ff13ee0ce75768dc9d Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 12:26:59 +0900 Subject: [PATCH 073/124] refactor(Application): replace low readability code with constant --- tomcat/src/main/java/nextstep/Application.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index f3216ae..ecff780 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -6,7 +6,9 @@ public class Application { - private static final Logger log = LoggerFactory.getLogger(Application.class); + private static final String BASE_PACKAGE = "org.apache.coyote.http11.controller"; + + private static final Logger log = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { log.info("web server start."); From c504091013dc4e836be2e82707edc4fd678a60d5 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 12:28:01 +0900 Subject: [PATCH 074/124] feat(Application): add `ControllerScanner` instance to scan `@RequestMapping` annotated methods --- tomcat/src/main/java/nextstep/Application.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index ecff780..9e9ad54 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -1,6 +1,7 @@ package nextstep; import org.apache.catalina.startup.Tomcat; +import org.apache.coyote.http11.common.ControllerScanner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,9 +11,13 @@ public class Application { private static final Logger log = LoggerFactory.getLogger(Application.class); - public static void main(String[] args) { - log.info("web server start."); - final var tomcat = new Tomcat(); - tomcat.start(); - } + public static void main(String[] args) { + log.info("web server start."); + + ControllerScanner controllerScanner = new ControllerScanner(); + controllerScanner.start(BASE_PACKAGE); + + final var tomcat = new Tomcat(); + tomcat.start(); + } } From 2c4679e4c0fe9c7ea0e18a911891a797045bb379 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 12:28:26 +0900 Subject: [PATCH 075/124] refactor(Application): add logs to confirm normal operation --- tomcat/src/main/java/nextstep/Application.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index 9e9ad54..d36fc70 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -16,6 +16,7 @@ public static void main(String[] args) { ControllerScanner controllerScanner = new ControllerScanner(); controllerScanner.start(BASE_PACKAGE); + log.info("controllerScanner: {}", controllerScanner.getUriToMethodMap()); final var tomcat = new Tomcat(); tomcat.start(); From d8e114a1f448b507edf6f66d3300573e934384ce Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 14:35:47 +0900 Subject: [PATCH 076/124] refactor(Application): modify `ControllerScanner` instance creating code --- tomcat/src/main/java/nextstep/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index d36fc70..f30289e 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -14,7 +14,7 @@ public class Application { public static void main(String[] args) { log.info("web server start."); - ControllerScanner controllerScanner = new ControllerScanner(); + ControllerScanner controllerScanner = ControllerScanner.getInstance(); controllerScanner.start(BASE_PACKAGE); log.info("controllerScanner: {}", controllerScanner.getUriToMethodMap()); From e640c6d49b4425cfd4b26856b53869cc74d2e540 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Wed, 15 Nov 2023 14:39:12 +0900 Subject: [PATCH 077/124] refactor(Http11Processor): add singleton `ControllerScanner` instance --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 5 ++--- 1 file changed, 2 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 446dd0d..e4095b0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -7,6 +7,7 @@ import org.apache.coyote.Processor; import org.apache.coyote.http11.HttpRequest.HttpRequest; +import org.apache.coyote.http11.common.ControllerScanner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,9 +44,7 @@ public void process(final Socket connection) { log.info("httpRequest.getRequestHeaders(): {}", httpRequest.getRequestHeaders()); log.info("httpRequest.getRequestBody(): {}", httpRequest.getRequestBody()); - // HTTP Response - HttpStatus httpStatus = null; - String responseBody = null; + ControllerScanner controllerScanner = ControllerScanner.getInstance(); outputStream.flush(); From 857bf75581adef1c870a221242ce6c670941622d Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 12:57:27 +0900 Subject: [PATCH 078/124] refactor(RequestMapping): move `RequestMapping` custom annotation to `annotation` package --- .../coyote/http11/{common => annotation}/RequestMapping.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tomcat/src/main/java/org/apache/coyote/http11/{common => annotation}/RequestMapping.java (86%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/common/RequestMapping.java b/tomcat/src/main/java/org/apache/coyote/http11/annotation/RequestMapping.java similarity index 86% rename from tomcat/src/main/java/org/apache/coyote/http11/common/RequestMapping.java rename to tomcat/src/main/java/org/apache/coyote/http11/annotation/RequestMapping.java index 7e7e50f..d9c53e5 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/common/RequestMapping.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/annotation/RequestMapping.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.common; +package org.apache.coyote.http11.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; From 33442924c17bc8e9fa893b586fba66912ccfd0a7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 13:12:46 +0900 Subject: [PATCH 079/124] feat(Controller): add custom annotation for dynamic controller mapping --- .../apache/coyote/http11/annotation/Controller.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/annotation/Controller.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/annotation/Controller.java b/tomcat/src/main/java/org/apache/coyote/http11/annotation/Controller.java new file mode 100644 index 0000000..a2606f4 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/annotation/Controller.java @@ -0,0 +1,11 @@ +package org.apache.coyote.http11.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Controller { +} From 2a5aff764bec10f15367d16f8889cb682379453d Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 13:16:33 +0900 Subject: [PATCH 080/124] refactor(ControllerScanner): remove unnecessary `ControllerScanner` class --- .../org/apache/coyote/http11/common/ControllerScanner.java | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java deleted file mode 100644 index 1ab148f..0000000 --- a/tomcat/src/main/java/org/apache/coyote/http11/common/ControllerScanner.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.apache.coyote.http11.common; - -public class ControllerScanner { -} From ef2282072f8311d697478fa196682d6f19a96dbd Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 15:12:50 +0900 Subject: [PATCH 081/124] feat(MethodScanner): add `MethodScanner` class to scan custom annotated methods --- .../coyote/http11/scanner/MethodScanner.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java new file mode 100644 index 0000000..6da30e7 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -0,0 +1,41 @@ +package org.apache.coyote.http11.scanner; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import org.apache.coyote.http11.annotation.RequestMapping; + +public class MethodScanner { + + private Map uriToMethodMap; + + private MethodScanner() { + this.uriToMethodMap = new HashMap<>(); + } + + public static MethodScanner getInstance() { + return LazyHolder.INSTANCE; + } + + private static class LazyHolder { + private static final MethodScanner INSTANCE = new MethodScanner(); + } + + public void scan(Set> controllerClasses) { + for (Class controller : controllerClasses) { + for (Method method : controller.getDeclaredMethods()) { + if (method.isAnnotationPresent(RequestMapping.class)) { + RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); + this.uriToMethodMap.put(requestMapping.value(), method); + } + } + } + } + + public Map getUriToMethodMap() { + return uriToMethodMap; + } + +} From 9a47eb64c58970e3402c9a028964b0bda33d67b8 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 15:13:17 +0900 Subject: [PATCH 082/124] feat(ControllerScanner): add `ControllerScanner` class to scan custom annotated controllers --- .../http11/scanner/ControllerScanner.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/scanner/ControllerScanner.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/ControllerScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/ControllerScanner.java new file mode 100644 index 0000000..680d4f9 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/ControllerScanner.java @@ -0,0 +1,19 @@ +package org.apache.coyote.http11.scanner; + +import java.util.Set; + +import org.apache.coyote.http11.annotation.Controller; +import org.reflections.Reflections; + +public class ControllerScanner { + + private final Reflections reflections; + + public ControllerScanner(String basePackage) { + this.reflections = new Reflections(basePackage); + } + + public Set> getControllerClasses() { + return reflections.getTypesAnnotatedWith(Controller.class); + } +} From 7e5fe36add70f4efb2194158816dcf380623333f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 15:18:26 +0900 Subject: [PATCH 083/124] refactor(HttpRequest): rename package to lowercase --- .../coyote/http11/{HttpRequest => httprequest}/HttpRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tomcat/src/main/java/org/apache/coyote/http11/{HttpRequest => httprequest}/HttpRequest.java (98%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/httprequest/HttpRequest.java similarity index 98% rename from tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java rename to tomcat/src/main/java/org/apache/coyote/http11/httprequest/HttpRequest.java index 904d486..879176c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpRequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httprequest/HttpRequest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.HttpRequest; +package org.apache.coyote.http11.httprequest; import java.io.BufferedReader; import java.io.IOException; From 61122e037675316c35ea3ad623c076f131bc2784 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 15:18:42 +0900 Subject: [PATCH 084/124] refactor(HttpResponse): rename package to lowercase --- .../http11/{HttpResponse => httpresponse}/HttpResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tomcat/src/main/java/org/apache/coyote/http11/{HttpResponse => httpresponse}/HttpResponse.java (57%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java similarity index 57% rename from tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java rename to tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java index fad6ddd..052f3f7 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11.HttpResponse; +package org.apache.coyote.http11.httpresponse; import lombok.Getter; From 62db3c99f49b2bf141e9d9c65dff9ca1830a64ab Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 15:20:16 +0900 Subject: [PATCH 085/124] refactor(common): move package --- .../java/org/apache/coyote/http11/{ => common}/ContentType.java | 2 +- .../java/org/apache/coyote/http11/{ => common}/HttpMethod.java | 2 +- .../java/org/apache/coyote/http11/{ => common}/HttpStatus.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename tomcat/src/main/java/org/apache/coyote/http11/{ => common}/ContentType.java (94%) rename tomcat/src/main/java/org/apache/coyote/http11/{ => common}/HttpMethod.java (58%) rename tomcat/src/main/java/org/apache/coyote/http11/{ => common}/HttpStatus.java (92%) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java b/tomcat/src/main/java/org/apache/coyote/http11/common/ContentType.java similarity index 94% rename from tomcat/src/main/java/org/apache/coyote/http11/ContentType.java rename to tomcat/src/main/java/org/apache/coyote/http11/common/ContentType.java index 595deff..cf2a164 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/ContentType.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/common/ContentType.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11; +package org.apache.coyote.http11.common; import java.util.Arrays; diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpMethod.java b/tomcat/src/main/java/org/apache/coyote/http11/common/HttpMethod.java similarity index 58% rename from tomcat/src/main/java/org/apache/coyote/http11/HttpMethod.java rename to tomcat/src/main/java/org/apache/coyote/http11/common/HttpMethod.java index 56ae2ad..872fdca 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpMethod.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/common/HttpMethod.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11; +package org.apache.coyote.http11.common; public enum HttpMethod { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpStatus.java b/tomcat/src/main/java/org/apache/coyote/http11/common/HttpStatus.java similarity index 92% rename from tomcat/src/main/java/org/apache/coyote/http11/HttpStatus.java rename to tomcat/src/main/java/org/apache/coyote/http11/common/HttpStatus.java index 30462a8..01c648d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpStatus.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/common/HttpStatus.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11; +package org.apache.coyote.http11.common; public enum HttpStatus { From 24d59c858ced2c2ebe1df671dfe9945256484fc2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 15:20:57 +0900 Subject: [PATCH 086/124] refactor(HttpRequest): code modified due to package move --- .../java/org/apache/coyote/http11/httprequest/HttpRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/httprequest/HttpRequest.java b/tomcat/src/main/java/org/apache/coyote/http11/httprequest/HttpRequest.java index 879176c..7c475a5 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/httprequest/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httprequest/HttpRequest.java @@ -6,7 +6,7 @@ import java.util.Map; import java.util.stream.Collectors; -import org.apache.coyote.http11.HttpMethod; +import org.apache.coyote.http11.common.HttpMethod; import lombok.Getter; From c5a258accf9cc226ac9d83486b64d53300d87521 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 17:44:57 +0900 Subject: [PATCH 087/124] feat(RequestHandler): add `RequestHandler` to handle parsed HTTP Request --- .../org/apache/coyote/http11/handler/RequestHandler.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java new file mode 100644 index 0000000..b4afe54 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -0,0 +1,5 @@ +package org.apache.coyote.http11.handler; + +public class RequestHandler { + +} From c64688c5238f75ed8b11e7a4ea461d04b5001aa1 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:24:15 +0900 Subject: [PATCH 088/124] feat(Application): initialize `controllerScanner` and `methodScanner` --- tomcat/src/main/java/nextstep/Application.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index f30289e..323df6f 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -1,7 +1,8 @@ package nextstep; import org.apache.catalina.startup.Tomcat; -import org.apache.coyote.http11.common.ControllerScanner; +import org.apache.coyote.http11.scanner.ControllerScanner; +import org.apache.coyote.http11.scanner.MethodScanner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,11 +14,8 @@ public class Application { public static void main(String[] args) { log.info("web server start."); - - ControllerScanner controllerScanner = ControllerScanner.getInstance(); - controllerScanner.start(BASE_PACKAGE); - log.info("controllerScanner: {}", controllerScanner.getUriToMethodMap()); - + ControllerScanner controllerScanner = new ControllerScanner(BASE_PACKAGE); + MethodScanner methodScanner = MethodScanner.getInstance(); final var tomcat = new Tomcat(); tomcat.start(); } From e5ae26596cb0e4c2a66259427bec264159944fe7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:24:46 +0900 Subject: [PATCH 089/124] feat(Application): scan `@RequestMapping` annotated methods in controllers --- tomcat/src/main/java/nextstep/Application.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index 323df6f..4cbed9b 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -16,6 +16,7 @@ public static void main(String[] args) { log.info("web server start."); ControllerScanner controllerScanner = new ControllerScanner(BASE_PACKAGE); MethodScanner methodScanner = MethodScanner.getInstance(); + methodScanner.scan(controllerScanner.getControllerClasses()); final var tomcat = new Tomcat(); tomcat.start(); } From 677aaa8ef71322138337e9ddab60ce7e029214f9 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:24:55 +0900 Subject: [PATCH 090/124] refactor(Application): add logs to confirm normal operation --- tomcat/src/main/java/nextstep/Application.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index 4cbed9b..e7129db 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -17,6 +17,7 @@ public static void main(String[] args) { ControllerScanner controllerScanner = new ControllerScanner(BASE_PACKAGE); MethodScanner methodScanner = MethodScanner.getInstance(); methodScanner.scan(controllerScanner.getControllerClasses()); + log.info("uriToMethodMap: {}", methodScanner.getUriToMethodMap()); final var tomcat = new Tomcat(); tomcat.start(); } From 0d1ba94ada38d9cad3f5d4e06adf4f0499bd806c Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:26:51 +0900 Subject: [PATCH 091/124] feat(Http11Processor): initialize `HttpResponse` --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 e4095b0..5bcbcd4 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -6,8 +6,7 @@ import java.net.Socket; import org.apache.coyote.Processor; -import org.apache.coyote.http11.HttpRequest.HttpRequest; -import org.apache.coyote.http11.common.ControllerScanner; +import org.apache.coyote.http11.httpresponse.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +36,7 @@ public void process(final Socket connection) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); HttpRequest httpRequest = HttpRequest.from(bufferedReader); + HttpResponse httpResponse = new HttpResponse(); log.info("httpRequest.getHttpMethod(): {}", httpRequest.getHttpMethod()); log.info("httpRequest.getUri(): {}", httpRequest.getUri()); From 343ac0a3cd27a034014aaa7aa26cf3e05983e12e Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:27:18 +0900 Subject: [PATCH 092/124] feat(Http11Processor): initialize `RequestHandler` with `httpRequest` and `httpResponse` --- .../java/org/apache/coyote/http11/Http11Processor.java | 10 +++------- 1 file changed, 3 insertions(+), 7 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 5bcbcd4..bb8cd26 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -6,6 +6,8 @@ import java.net.Socket; import org.apache.coyote.Processor; +import org.apache.coyote.http11.handler.RequestHandler; +import org.apache.coyote.http11.httprequest.HttpRequest; import org.apache.coyote.http11.httpresponse.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,13 +40,7 @@ public void process(final Socket connection) { HttpRequest httpRequest = HttpRequest.from(bufferedReader); HttpResponse httpResponse = new HttpResponse(); - log.info("httpRequest.getHttpMethod(): {}", httpRequest.getHttpMethod()); - log.info("httpRequest.getUri(): {}", httpRequest.getUri()); - log.info("httpRequest.getHttpVersion(): {}", httpRequest.getHttpVersion()); - log.info("httpRequest.getRequestHeaders(): {}", httpRequest.getRequestHeaders()); - log.info("httpRequest.getRequestBody(): {}", httpRequest.getRequestBody()); - - ControllerScanner controllerScanner = ControllerScanner.getInstance(); + RequestHandler requestHandler = RequestHandler.of(httpRequest, httpResponse); outputStream.flush(); From 4caf248b592a96629f205a9de57a0e5a20c3d489 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:27:53 +0900 Subject: [PATCH 093/124] feat(HttpResponse): add fields --- .../apache/coyote/http11/httpresponse/HttpResponse.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java index 052f3f7..e67ae10 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java @@ -1,8 +1,17 @@ package org.apache.coyote.http11.httpresponse; +import java.util.Map; + +import org.apache.coyote.http11.common.HttpStatus; + import lombok.Getter; @Getter public class HttpResponse { + private String httpVersion; + private HttpStatus httpStatus; + private Map responseHeaders; + private String responseBody = null; + } From 81624f56a647a25088f4cc3c1900c8dcf8399a81 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:28:31 +0900 Subject: [PATCH 094/124] feat(HttpResponse): declare default constructor --- .../org/apache/coyote/http11/httpresponse/HttpResponse.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java index e67ae10..9967431 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java @@ -14,4 +14,8 @@ public class HttpResponse { private Map responseHeaders; private String responseBody = null; + public HttpResponse() { + + } + } From b63c675e5eae69966a57a0742a026e85538cb1b6 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:28:44 +0900 Subject: [PATCH 095/124] feat(HttpResponse): add `@Builder` lombok annotation --- .../org/apache/coyote/http11/httpresponse/HttpResponse.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java index 9967431..da2963d 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java @@ -4,9 +4,11 @@ import org.apache.coyote.http11.common.HttpStatus; +import lombok.Builder; import lombok.Getter; @Getter +@Builder public class HttpResponse { private String httpVersion; From 2f9f41409e399904cfcdf727b94ea8eeceb7f85d Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:29:56 +0900 Subject: [PATCH 096/124] feat(IndexPageController): add temporary controller class to confirm operation of the logic --- .../http11/controller/IndexPageController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java new file mode 100644 index 0000000..29cb466 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java @@ -0,0 +1,14 @@ +package org.apache.coyote.http11.controller; + +import org.apache.coyote.http11.annotation.Controller; +import org.apache.coyote.http11.annotation.RequestMapping; + +@Controller +public class IndexPageController { + + @RequestMapping("/") + public String showIndexPage() { + return "hello world !!"; + } + +} From ee06c5d8b50a7bb1abcce8277be45be7aff51c57 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:30:55 +0900 Subject: [PATCH 097/124] feat(RequestHandler): add fields --- .../org/apache/coyote/http11/handler/RequestHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index b4afe54..c735aae 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -1,5 +1,12 @@ package org.apache.coyote.http11.handler; +import java.util.Map; +import org.apache.coyote.http11.httprequest.HttpRequest; +import org.apache.coyote.http11.httpresponse.HttpResponse; public class RequestHandler { + private HttpRequest httpRequest; + private HttpResponse httpResponse; + private Map uriToMethodMap; + } From ac20d432e66e587f495639272b716422edb994ca Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Fri, 17 Nov 2023 18:31:08 +0900 Subject: [PATCH 098/124] feat(RequestHandler): add static factory method --- .../coyote/http11/handler/RequestHandler.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index c735aae..c4e155f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -1,12 +1,27 @@ package org.apache.coyote.http11.handler; +import java.lang.reflect.Method; import java.util.Map; + import org.apache.coyote.http11.httprequest.HttpRequest; import org.apache.coyote.http11.httpresponse.HttpResponse; +import org.apache.coyote.http11.scanner.MethodScanner; + public class RequestHandler { private HttpRequest httpRequest; private HttpResponse httpResponse; private Map uriToMethodMap; + private RequestHandler(HttpRequest httpRequest, HttpResponse httpResponse) { + this.httpRequest = httpRequest; + this.httpResponse = httpResponse; + this.uriToMethodMap = MethodScanner.getInstance().getUriToMethodMap(); + } + + public static RequestHandler of(HttpRequest httpRequest, HttpResponse httpResponse) { + return new RequestHandler(httpRequest, httpResponse); + } + + } From cf3f456454d3223539bdf6d0c6ec9a9a5214140f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:03:50 +0900 Subject: [PATCH 099/124] feat(GetMapping): add custom annotation to handle `GET` HTTP method --- .../apache/coyote/http11/annotation/GetMapping.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/annotation/GetMapping.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/annotation/GetMapping.java b/tomcat/src/main/java/org/apache/coyote/http11/annotation/GetMapping.java new file mode 100644 index 0000000..ba42ac9 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/annotation/GetMapping.java @@ -0,0 +1,12 @@ +package org.apache.coyote.http11.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface GetMapping { + String value(); +} From 213559039d28931ec94d4467e2d05fb2d0dcf873 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:04:10 +0900 Subject: [PATCH 100/124] feat(PostMapping): add custom annotation to handle `POST` HTTP method --- .../apache/coyote/http11/annotation/PostMapping.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/http11/annotation/PostMapping.java diff --git a/tomcat/src/main/java/org/apache/coyote/http11/annotation/PostMapping.java b/tomcat/src/main/java/org/apache/coyote/http11/annotation/PostMapping.java new file mode 100644 index 0000000..1582a1b --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/annotation/PostMapping.java @@ -0,0 +1,12 @@ +package org.apache.coyote.http11.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface PostMapping { + String value(); +} From 518702c5a1bb12f96cc460187b25c363353e54d8 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:15:05 +0900 Subject: [PATCH 101/124] feat(MethodScanner): add `@Getter` lombok annotation --- .../java/org/apache/coyote/http11/scanner/MethodScanner.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index 6da30e7..3bbb309 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -7,6 +7,9 @@ import org.apache.coyote.http11.annotation.RequestMapping; +import lombok.Getter; + +@Getter public class MethodScanner { private Map uriToMethodMap; From 906c3f15db765f1f4b318636d438bbdbed49033a Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:25:28 +0900 Subject: [PATCH 102/124] feat(MethodScanner): divide `@RequestMapping` annotation into `@GetMapping` and `@PostMapping` --- .../coyote/http11/scanner/MethodScanner.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index 3bbb309..5e18117 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -5,17 +5,20 @@ import java.util.Map; import java.util.Set; -import org.apache.coyote.http11.annotation.RequestMapping; +import org.apache.coyote.http11.annotation.GetMapping; +import org.apache.coyote.http11.annotation.PostMapping; import lombok.Getter; @Getter public class MethodScanner { - private Map uriToMethodMap; + private Map uriToGetMethodMap; + private Map uriToPostMethodMap; private MethodScanner() { - this.uriToMethodMap = new HashMap<>(); + this.uriToGetMethodMap = new HashMap<>(); + this.uriToPostMethodMap = new HashMap<>(); } public static MethodScanner getInstance() { @@ -26,19 +29,26 @@ private static class LazyHolder { private static final MethodScanner INSTANCE = new MethodScanner(); } - public void scan(Set> controllerClasses) { + private void scanGetMapping(Set> controllerClasses) { for (Class controller : controllerClasses) { for (Method method : controller.getDeclaredMethods()) { - if (method.isAnnotationPresent(RequestMapping.class)) { - RequestMapping requestMapping = method.getAnnotation(RequestMapping.class); - this.uriToMethodMap.put(requestMapping.value(), method); + if (method.isAnnotationPresent(GetMapping.class)) { + GetMapping getMapping = method.getAnnotation(GetMapping.class); + this.uriToGetMethodMap.put(getMapping.value(), method); } } } } - public Map getUriToMethodMap() { - return uriToMethodMap; + private void scanPostMapping(Set> controllerClasses) { + for (Class controller : controllerClasses) { + for (Method method : controller.getDeclaredMethods()) { + if (method.isAnnotationPresent(PostMapping.class)) { + PostMapping postMapping = method.getAnnotation(PostMapping.class); + this.uriToPostMethodMap.put(postMapping.value(), method); + } + } + } } } From 6f22667dbfd851e3aed414e54fe8cd15b53277ff Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:26:41 +0900 Subject: [PATCH 103/124] feat(MethodScanner): add `scanMapping` method to scan annotated methods simultaneously --- .../java/org/apache/coyote/http11/scanner/MethodScanner.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index 5e18117..4dc97ba 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -51,4 +51,9 @@ private void scanPostMapping(Set> controllerClasses) { } } + public void scanMapping(Set> controllerClasses) { + scanGetMapping(controllerClasses); + scanPostMapping(controllerClasses); + } + } From 0e651d601fdbb6c1b875304bf6fb3b913ada76b7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:30:54 +0900 Subject: [PATCH 104/124] refactor(RequestHandler): divide `uriToMethodMap` into `uriToGetMethodMap` and `uriToPostMethodMap` --- .../org/apache/coyote/http11/handler/RequestHandler.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index c4e155f..c858d8c 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -11,17 +11,19 @@ public class RequestHandler { private HttpRequest httpRequest; private HttpResponse httpResponse; - private Map uriToMethodMap; + private Map uriToGetMethodMap; + private Map uriToPostMethodMap; private RequestHandler(HttpRequest httpRequest, HttpResponse httpResponse) { this.httpRequest = httpRequest; this.httpResponse = httpResponse; - this.uriToMethodMap = MethodScanner.getInstance().getUriToMethodMap(); + MethodScanner methodScanner = MethodScanner.getInstance(); + this.uriToGetMethodMap = methodScanner.getUriToGetMethodMap(); + this.uriToPostMethodMap = methodScanner.getUriToPostMethodMap(); } public static RequestHandler of(HttpRequest httpRequest, HttpResponse httpResponse) { return new RequestHandler(httpRequest, httpResponse); } - } From 4b929b6fd33d896e50152b466c470830323bb0f8 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:31:50 +0900 Subject: [PATCH 105/124] refactor(IndexPageController): replace `@RequestMapping` annotation with `@GetMapping` --- .../apache/coyote/http11/controller/IndexPageController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java b/tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java index 29cb466..51da7b5 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/controller/IndexPageController.java @@ -1,12 +1,12 @@ package org.apache.coyote.http11.controller; import org.apache.coyote.http11.annotation.Controller; -import org.apache.coyote.http11.annotation.RequestMapping; +import org.apache.coyote.http11.annotation.GetMapping; @Controller public class IndexPageController { - @RequestMapping("/") + @GetMapping("/") public String showIndexPage() { return "hello world !!"; } From d5258c292b458784ba9af52244a077c0213a75d7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 02:49:03 +0900 Subject: [PATCH 106/124] refactor(Application): modify `scan` method to `scanMapping` --- tomcat/src/main/java/nextstep/Application.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index e7129db..8df2fa1 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -16,8 +16,9 @@ public static void main(String[] args) { log.info("web server start."); ControllerScanner controllerScanner = new ControllerScanner(BASE_PACKAGE); MethodScanner methodScanner = MethodScanner.getInstance(); - methodScanner.scan(controllerScanner.getControllerClasses()); - log.info("uriToMethodMap: {}", methodScanner.getUriToMethodMap()); + methodScanner.scanMapping(controllerScanner.getControllerClasses()); + log.info("uriToGetMethodMap: {}", methodScanner.getUriToGetMethodMap()); + log.info("uriToPostMethodMap: {}", methodScanner.getUriToPostMethodMap()); final var tomcat = new Tomcat(); tomcat.start(); } From b87ba85d4430db3059092bcc651e7ade1ea60218 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sat, 18 Nov 2023 11:36:44 +0900 Subject: [PATCH 107/124] refactor(RequestHandler): separate roles by adding `createMethodMap` method --- .../org/apache/coyote/http11/handler/RequestHandler.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index c858d8c..f56bd7e 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -17,13 +17,15 @@ public class RequestHandler { private RequestHandler(HttpRequest httpRequest, HttpResponse httpResponse) { this.httpRequest = httpRequest; this.httpResponse = httpResponse; - MethodScanner methodScanner = MethodScanner.getInstance(); - this.uriToGetMethodMap = methodScanner.getUriToGetMethodMap(); - this.uriToPostMethodMap = methodScanner.getUriToPostMethodMap(); + createMethodMap(MethodScanner.getInstance()); } public static RequestHandler of(HttpRequest httpRequest, HttpResponse httpResponse) { return new RequestHandler(httpRequest, httpResponse); } + private void createMethodMap(MethodScanner methodScanner) { + this.uriToGetMethodMap = methodScanner.getUriToGetMethodMap(); + this.uriToPostMethodMap = methodScanner.getUriToPostMethodMap(); + } } From 7b14007ed700236083a3780af6c9b72c50c31506 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sun, 19 Nov 2023 00:50:08 +0900 Subject: [PATCH 108/124] refactor(HttpResponse): remove `@Builder` lombok annotation --- .../org/apache/coyote/http11/httpresponse/HttpResponse.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java index da2963d..9967431 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/httpresponse/HttpResponse.java @@ -4,11 +4,9 @@ import org.apache.coyote.http11.common.HttpStatus; -import lombok.Builder; import lombok.Getter; @Getter -@Builder public class HttpResponse { private String httpVersion; From de729e3355b3dd739c4e129581406b7d507b3ec2 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sun, 19 Nov 2023 01:42:11 +0900 Subject: [PATCH 109/124] refactor(Http11Processor): remove unnecessary comment --- .../src/main/java/org/apache/coyote/http11/Http11Processor.java | 1 - 1 file changed, 1 deletion(-) 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 bb8cd26..301c2a4 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -34,7 +34,6 @@ public void process(final Socket connection) { try (final var inputStream = connection.getInputStream(); final var outputStream = connection.getOutputStream()) { - // HTTP Request BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); HttpRequest httpRequest = HttpRequest.from(bufferedReader); From 1300cb6850a8494db44754b39719d5e692b30715 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Sun, 19 Nov 2023 02:00:01 +0900 Subject: [PATCH 110/124] refactor(RequestHandler): remove `httpResponse` field --- .../org/apache/coyote/http11/handler/RequestHandler.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index f56bd7e..f52bcae 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -4,24 +4,21 @@ import java.util.Map; import org.apache.coyote.http11.httprequest.HttpRequest; -import org.apache.coyote.http11.httpresponse.HttpResponse; import org.apache.coyote.http11.scanner.MethodScanner; public class RequestHandler { private HttpRequest httpRequest; - private HttpResponse httpResponse; private Map uriToGetMethodMap; private Map uriToPostMethodMap; - private RequestHandler(HttpRequest httpRequest, HttpResponse httpResponse) { + private RequestHandler(HttpRequest httpRequest) { this.httpRequest = httpRequest; - this.httpResponse = httpResponse; createMethodMap(MethodScanner.getInstance()); } - public static RequestHandler of(HttpRequest httpRequest, HttpResponse httpResponse) { - return new RequestHandler(httpRequest, httpResponse); + public static RequestHandler of(HttpRequest httpRequest) { + return new RequestHandler(httpRequest); } private void createMethodMap(MethodScanner methodScanner) { From af7dae4176b2be17a3c5ba67f4c386fb747f7c2d Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 08:54:30 +0900 Subject: [PATCH 111/124] refactor(Application): modify method name by adding `MethodScanner` internal field and changing method --- tomcat/src/main/java/nextstep/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index 8df2fa1..3d4a32e 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -16,7 +16,7 @@ public static void main(String[] args) { log.info("web server start."); ControllerScanner controllerScanner = new ControllerScanner(BASE_PACKAGE); MethodScanner methodScanner = MethodScanner.getInstance(); - methodScanner.scanMapping(controllerScanner.getControllerClasses()); + methodScanner.createMethodMapByHttpMethod(controllerScanner.getControllerClasses()); log.info("uriToGetMethodMap: {}", methodScanner.getUriToGetMethodMap()); log.info("uriToPostMethodMap: {}", methodScanner.getUriToPostMethodMap()); final var tomcat = new Tomcat(); From a2f7e088162fa00d88aa33c38dd69ef2c496a31a Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 08:54:58 +0900 Subject: [PATCH 112/124] refactor(Application): modify logs --- tomcat/src/main/java/nextstep/Application.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index 3d4a32e..4fca541 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -17,8 +17,7 @@ public static void main(String[] args) { ControllerScanner controllerScanner = new ControllerScanner(BASE_PACKAGE); MethodScanner methodScanner = MethodScanner.getInstance(); methodScanner.createMethodMapByHttpMethod(controllerScanner.getControllerClasses()); - log.info("uriToGetMethodMap: {}", methodScanner.getUriToGetMethodMap()); - log.info("uriToPostMethodMap: {}", methodScanner.getUriToPostMethodMap()); + log.info("methodMapByHttpMethod: {}", methodScanner.getMethodMapByHttpMethod()); final var tomcat = new Tomcat(); tomcat.start(); } From 61667865a688e3e73f287b0ce951d2bff89126c7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 13:22:53 +0900 Subject: [PATCH 113/124] feat(MethodScanner): add `methodMapByHttpMethod` field --- .../java/org/apache/coyote/http11/scanner/MethodScanner.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index 4dc97ba..3627c46 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -7,6 +7,7 @@ import org.apache.coyote.http11.annotation.GetMapping; import org.apache.coyote.http11.annotation.PostMapping; +import org.apache.coyote.http11.common.HttpMethod; import lombok.Getter; @@ -15,6 +16,7 @@ public class MethodScanner { private Map uriToGetMethodMap; private Map uriToPostMethodMap; + private Map> methodMapByHttpMethod; private MethodScanner() { this.uriToGetMethodMap = new HashMap<>(); From fe4aaa38b35cd1bb6ae9dbc007af914a5c67b562 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 13:24:28 +0900 Subject: [PATCH 114/124] feat(MethodScanner): add `methodMapByHttpMethod` field on constructor initialization --- .../java/org/apache/coyote/http11/scanner/MethodScanner.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index 3627c46..c25d852 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -21,6 +21,7 @@ public class MethodScanner { private MethodScanner() { this.uriToGetMethodMap = new HashMap<>(); this.uriToPostMethodMap = new HashMap<>(); + this.methodMapByHttpMethod = new HashMap<>(); } public static MethodScanner getInstance() { From 466db35ceecd80f2d7f9946c10fee220702e9154 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 13:36:17 +0900 Subject: [PATCH 115/124] refactor(MethodScanner): rename `scanMapping` method to `scanMethods` --- .../java/org/apache/coyote/http11/scanner/MethodScanner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index c25d852..4bd3a5f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -54,7 +54,7 @@ private void scanPostMapping(Set> controllerClasses) { } } - public void scanMapping(Set> controllerClasses) { + public void scanMethods(Set> controllerClasses) { scanGetMapping(controllerClasses); scanPostMapping(controllerClasses); } From 0de632c4b2fd7d6d3b7bf8acdfed04859c6c1e6b Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 13:44:01 +0900 Subject: [PATCH 116/124] refactor(MethodScanner): add static import --- .../java/org/apache/coyote/http11/scanner/MethodScanner.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index 4bd3a5f..b95da99 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -1,5 +1,7 @@ package org.apache.coyote.http11.scanner; +import static org.apache.coyote.http11.common.HttpMethod.*; + import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; From fe5a747774dd02a84f57201d5e008ebef2e03839 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 13:44:39 +0900 Subject: [PATCH 117/124] feat(MethodScanner): add `mapMethodsWithHttpMethod` method for mapping --- .../java/org/apache/coyote/http11/scanner/MethodScanner.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java index b95da99..b6bb8e8 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/scanner/MethodScanner.java @@ -61,4 +61,9 @@ public void scanMethods(Set> controllerClasses) { scanPostMapping(controllerClasses); } + public void mapMethodsWithHttpMethod() { + methodMapByHttpMethod.put(GET, uriToGetMethodMap); + methodMapByHttpMethod.put(POST, uriToPostMethodMap); + } + } From bd6f30da625ed84f9b46b832d85d44cbeb3bf58b Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 16:33:12 +0900 Subject: [PATCH 118/124] refactor(RequestHandler): integrate existing fields into `methodMapByHttpMethod` field --- .../org/apache/coyote/http11/handler/RequestHandler.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index f52bcae..4827e15 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -3,18 +3,18 @@ import java.lang.reflect.Method; import java.util.Map; +import org.apache.coyote.http11.common.HttpMethod; import org.apache.coyote.http11.httprequest.HttpRequest; import org.apache.coyote.http11.scanner.MethodScanner; public class RequestHandler { private HttpRequest httpRequest; - private Map uriToGetMethodMap; - private Map uriToPostMethodMap; + private Map> methodMapByHttpMethod; private RequestHandler(HttpRequest httpRequest) { this.httpRequest = httpRequest; - createMethodMap(MethodScanner.getInstance()); + this.methodMapByHttpMethod = MethodScanner.getInstance().getMethodMapByHttpMethod(); } public static RequestHandler of(HttpRequest httpRequest) { From 188b57b243ee1604e19d1cea378ef24c7f85480b Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 16:34:15 +0900 Subject: [PATCH 119/124] refactor(RequestHandler): remove unnecessary `createMethodMap` method --- .../java/org/apache/coyote/http11/handler/RequestHandler.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index 4827e15..9a86954 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -21,8 +21,5 @@ public static RequestHandler of(HttpRequest httpRequest) { return new RequestHandler(httpRequest); } - private void createMethodMap(MethodScanner methodScanner) { - this.uriToGetMethodMap = methodScanner.getUriToGetMethodMap(); - this.uriToPostMethodMap = methodScanner.getUriToPostMethodMap(); } } From f91214ffccc729c343018a640fcf347d867ff87f Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 16:34:39 +0900 Subject: [PATCH 120/124] feat(RequestHandler): add `findMethod` method --- .../org/apache/coyote/http11/handler/RequestHandler.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index 9a86954..069f545 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -21,5 +21,10 @@ public static RequestHandler of(HttpRequest httpRequest) { return new RequestHandler(httpRequest); } + private Method findMethod(HttpRequest httpRequest) { + Map methodsForHttpMethod = methodMapByHttpMethod.get(httpRequest.getHttpMethod()); + return methodsForHttpMethod.get(httpRequest.getUri()); + } + } } From 8cb19f61aa627d3137e1080733049164e53f5fd0 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Tue, 21 Nov 2023 16:34:52 +0900 Subject: [PATCH 121/124] feat(RequestHandler): add `invokeMethod` method --- .../org/apache/coyote/http11/handler/RequestHandler.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index 069f545..8a09eab 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -26,5 +26,10 @@ private Method findMethod(HttpRequest httpRequest) { return methodsForHttpMethod.get(httpRequest.getUri()); } + private void invokeMethod(Method method, HttpRequest httpRequest) throws Exception { + Class controllerClass = method.getDeclaringClass(); + Object controllerInstance = controllerClass.getDeclaredConstructor().newInstance(); + method.invoke(controllerInstance, httpRequest); + } } From 551fcc577887f82507cb207db99965d728ce3eb0 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Thu, 23 Nov 2023 00:19:10 +0900 Subject: [PATCH 122/124] refactor(Application): divide `createMethodMapByHttpMethod` method into `scanMethods` and `mapMethodsWithHttpMethod` --- tomcat/src/main/java/nextstep/Application.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/nextstep/Application.java b/tomcat/src/main/java/nextstep/Application.java index 4fca541..10beb12 100644 --- a/tomcat/src/main/java/nextstep/Application.java +++ b/tomcat/src/main/java/nextstep/Application.java @@ -16,7 +16,8 @@ public static void main(String[] args) { log.info("web server start."); ControllerScanner controllerScanner = new ControllerScanner(BASE_PACKAGE); MethodScanner methodScanner = MethodScanner.getInstance(); - methodScanner.createMethodMapByHttpMethod(controllerScanner.getControllerClasses()); + methodScanner.scanMethods(controllerScanner.getControllerClasses()); + methodScanner.mapMethodsWithHttpMethod(); log.info("methodMapByHttpMethod: {}", methodScanner.getMethodMapByHttpMethod()); final var tomcat = new Tomcat(); tomcat.start(); From c809ee3a9be1fd54f8dce5ff46c500fc29f09ac7 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Thu, 23 Nov 2023 00:19:50 +0900 Subject: [PATCH 123/124] refactor(Http11Processor): create `RequestHandler` instance with static factory method --- .../main/java/org/apache/coyote/http11/Http11Processor.java | 6 +----- 1 file changed, 1 insertion(+), 5 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 301c2a4..50d4800 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -8,7 +8,6 @@ import org.apache.coyote.Processor; import org.apache.coyote.http11.handler.RequestHandler; import org.apache.coyote.http11.httprequest.HttpRequest; -import org.apache.coyote.http11.httpresponse.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,10 +36,7 @@ public void process(final Socket connection) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); HttpRequest httpRequest = HttpRequest.from(bufferedReader); - HttpResponse httpResponse = new HttpResponse(); - - RequestHandler requestHandler = RequestHandler.of(httpRequest, httpResponse); - + RequestHandler requestHandler = RequestHandler.of(httpRequest); outputStream.flush(); } catch (IOException | UncheckedServletException e) { From d6aa72439b8a4c207c7c8c960c1b34e93340c9a0 Mon Sep 17 00:00:00 2001 From: GOMUNGNAM Date: Thu, 23 Nov 2023 00:22:54 +0900 Subject: [PATCH 124/124] refactor(RequestHandler): add declaration of the return value of `invoke` method --- .../java/org/apache/coyote/http11/handler/RequestHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java index 8a09eab..9503a59 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/handler/RequestHandler.java @@ -29,7 +29,7 @@ private Method findMethod(HttpRequest httpRequest) { private void invokeMethod(Method method, HttpRequest httpRequest) throws Exception { Class controllerClass = method.getDeclaringClass(); Object controllerInstance = controllerClass.getDeclaredConstructor().newInstance(); - method.invoke(controllerInstance, httpRequest); + Object invokedMethodResult = method.invoke(controllerInstance, httpRequest); } }