From a008e416d8ee03cd20a62578e6e89a6703d0eb5b Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 13 Sep 2024 14:01:29 +0900 Subject: [PATCH 01/49] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20synchronized=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/thread/stage0/SynchronizationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/study/src/test/java/thread/stage0/SynchronizationTest.java b/study/src/test/java/thread/stage0/SynchronizationTest.java index 59afce5646..2961eb7f3a 100644 --- a/study/src/test/java/thread/stage0/SynchronizationTest.java +++ b/study/src/test/java/thread/stage0/SynchronizationTest.java @@ -40,7 +40,7 @@ private static final class SynchronizedMethods { private int sum = 0; - public synchronized void calculate() { + public synchronized void calculate() { setSum(getSum() + 1); } From 4d1ddbae113b1fd628dc137297f2152b49a1642e Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 13 Sep 2024 15:31:20 +0900 Subject: [PATCH 02/49] =?UTF-8?q?refactor:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=EC=9D=98=20=EC=8A=A4=EB=A0=88=EB=93=9C?= =?UTF-8?q?=ED=92=80=EA=B3=BC=20queue=20=EA=B0=AF=EC=88=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/thread/stage0/ThreadPoolsTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/study/src/test/java/thread/stage0/ThreadPoolsTest.java b/study/src/test/java/thread/stage0/ThreadPoolsTest.java index c3ecd5c80c..e52eaefe3f 100644 --- a/study/src/test/java/thread/stage0/ThreadPoolsTest.java +++ b/study/src/test/java/thread/stage0/ThreadPoolsTest.java @@ -30,8 +30,8 @@ void testNewFixedThreadPool() { executor.submit(logWithSleep("hello fixed thread pools")); // 올바른 값으로 바꿔서 테스트를 통과시키자. - final int expectedPoolSize = 2; - final int expectedQueueSize = 1; + final int expectedPoolSize = 2; + final int expectedQueueSize = 1; assertThat(expectedPoolSize).isEqualTo(executor.getPoolSize()); assertThat(expectedQueueSize).isEqualTo(executor.getQueue().size()); @@ -45,8 +45,8 @@ void testNewCachedThreadPool() { executor.submit(logWithSleep("hello cached thread pools")); // 올바른 값으로 바꿔서 테스트를 통과시키자. - final int expectedPoolSize = 3; - final int expectedQueueSize = 0; + final int expectedPoolSize = 3; + final int expectedQueueSize = 0; assertThat(expectedPoolSize).isEqualTo(executor.getPoolSize()); assertThat(expectedQueueSize).isEqualTo(executor.getQueue().size()); From 0c72d8bf6c38b45c07cb76a94507a1c42057c3d8 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 13 Sep 2024 15:31:48 +0900 Subject: [PATCH 03/49] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EC=97=90=20syncronized=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/test/java/thread/stage1/UserServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/study/src/test/java/thread/stage1/UserServlet.java b/study/src/test/java/thread/stage1/UserServlet.java index a78e7b4ad4..8cd395bf1c 100644 --- a/study/src/test/java/thread/stage1/UserServlet.java +++ b/study/src/test/java/thread/stage1/UserServlet.java @@ -11,7 +11,7 @@ public void service(final User user) { join(user); } - private synchronized void join(final User user) { + private synchronized void join(final User user) { if (!users.contains(user)) { users.add(user); } From 0350a5b678d1a07f52a19326af1a5b49b299484c Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 13 Sep 2024 15:32:20 +0900 Subject: [PATCH 04/49] =?UTF-8?q?chore:=20=EB=8B=A4=EC=A4=91=20=EC=8A=A4?= =?UTF-8?q?=EB=A0=88=EB=93=9C=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/study/src/main/resources/application.yml b/study/src/main/resources/application.yml index 8b74bdfd88..9e7edae7af 100644 --- a/study/src/main/resources/application.yml +++ b/study/src/main/resources/application.yml @@ -4,7 +4,7 @@ handlebars: server: tomcat: accept-count: 1 - max-connections: 1 + max-connections: 2 threads: min-spare: 2 max: 2 From a894c8b994c6a18d8a96977982105067c954047c Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 13 Sep 2024 15:32:53 +0900 Subject: [PATCH 05/49] =?UTF-8?q?refactor:=20=EC=BB=A4=EB=B0=8B=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D=EC=9D=84=20=EC=9C=84=ED=95=98=20=EB=84=A3?= =?UTF-8?q?=EC=97=88=EB=8D=98=20=EA=B3=B5=EB=B0=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thread/stage0/SynchronizationTest.java | 20 +++++++----------- .../java/thread/stage0/ThreadPoolsTest.java | 21 ++++++++----------- .../test/java/thread/stage1/UserServlet.java | 2 +- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/study/src/test/java/thread/stage0/SynchronizationTest.java b/study/src/test/java/thread/stage0/SynchronizationTest.java index 2961eb7f3a..6297f3dfdf 100644 --- a/study/src/test/java/thread/stage0/SynchronizationTest.java +++ b/study/src/test/java/thread/stage0/SynchronizationTest.java @@ -8,21 +8,17 @@ import org.junit.jupiter.api.Test; /** - * 다중 스레드 환경에서 두 개 이상의 스레드가 변경 가능한(mutable) 공유 데이터를 동시에 업데이트하면 경쟁 조건(race condition)이 발생한다. - * 자바는 공유 데이터에 대한 스레드 접근을 동기화(synchronization)하여 경쟁 조건을 방지한다. - * 동기화된 블록은 하나의 스레드만 접근하여 실행할 수 있다. - * - * Synchronization - * https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html + * 다중 스레드 환경에서 두 개 이상의 스레드가 변경 가능한(mutable) 공유 데이터를 동시에 업데이트하면 경쟁 조건(race condition)이 발생한다. 자바는 공유 데이터에 대한 스레드 접근을 + * 동기화(synchronization)하여 경쟁 조건을 방지한다. 동기화된 블록은 하나의 스레드만 접근하여 실행할 수 있다. + *

+ * Synchronization https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html */ class SynchronizationTest { /** - * 테스트가 성공하도록 SynchronizedMethods 클래스에 동기화를 적용해보자. - * synchronized 키워드에 대하여 찾아보고 적용하면 된다. - * - * Guide to the Synchronized Keyword in Java - * https://www.baeldung.com/java-synchronized + * 테스트가 성공하도록 SynchronizedMethods 클래스에 동기화를 적용해보자. synchronized 키워드에 대하여 찾아보고 적용하면 된다. + *

+ * Guide to the Synchronized Keyword in Java https://www.baeldung.com/java-synchronized */ @Test void testSynchronized() throws InterruptedException { @@ -40,7 +36,7 @@ private static final class SynchronizedMethods { private int sum = 0; - public synchronized void calculate() { + public synchronized void calculate() { setSum(getSum() + 1); } diff --git a/study/src/test/java/thread/stage0/ThreadPoolsTest.java b/study/src/test/java/thread/stage0/ThreadPoolsTest.java index e52eaefe3f..afe5ff6db2 100644 --- a/study/src/test/java/thread/stage0/ThreadPoolsTest.java +++ b/study/src/test/java/thread/stage0/ThreadPoolsTest.java @@ -9,14 +9,11 @@ import org.slf4j.LoggerFactory; /** - * 스레드 풀은 무엇이고 어떻게 동작할까? - * 테스트를 통과시키고 왜 해당 결과가 나왔는지 생각해보자. - * - * Thread Pools - * https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html - * - * Introduction to Thread Pools in Java - * https://www.baeldung.com/thread-pool-java-and-guava + * 스레드 풀은 무엇이고 어떻게 동작할까? 테스트를 통과시키고 왜 해당 결과가 나왔는지 생각해보자. + *

+ * Thread Pools https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html + *

+ * Introduction to Thread Pools in Java https://www.baeldung.com/thread-pool-java-and-guava */ class ThreadPoolsTest { @@ -30,8 +27,8 @@ void testNewFixedThreadPool() { executor.submit(logWithSleep("hello fixed thread pools")); // 올바른 값으로 바꿔서 테스트를 통과시키자. - final int expectedPoolSize = 2; - final int expectedQueueSize = 1; + final int expectedPoolSize = 2; + final int expectedQueueSize = 1; assertThat(expectedPoolSize).isEqualTo(executor.getPoolSize()); assertThat(expectedQueueSize).isEqualTo(executor.getQueue().size()); @@ -45,8 +42,8 @@ void testNewCachedThreadPool() { executor.submit(logWithSleep("hello cached thread pools")); // 올바른 값으로 바꿔서 테스트를 통과시키자. - final int expectedPoolSize = 3; - final int expectedQueueSize = 0; + final int expectedPoolSize = 3; + final int expectedQueueSize = 0; assertThat(expectedPoolSize).isEqualTo(executor.getPoolSize()); assertThat(expectedQueueSize).isEqualTo(executor.getQueue().size()); diff --git a/study/src/test/java/thread/stage1/UserServlet.java b/study/src/test/java/thread/stage1/UserServlet.java index 8cd395bf1c..a78e7b4ad4 100644 --- a/study/src/test/java/thread/stage1/UserServlet.java +++ b/study/src/test/java/thread/stage1/UserServlet.java @@ -11,7 +11,7 @@ public void service(final User user) { join(user); } - private synchronized void join(final User user) { + private synchronized void join(final User user) { if (!users.contains(user)) { users.add(user); } From f1a4282931a63d8d6d520bab32f35caccba495d6 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 13 Sep 2024 15:59:40 +0900 Subject: [PATCH 06/49] =?UTF-8?q?refactor:=20=EC=93=B0=EB=A0=88=EB=93=9C?= =?UTF-8?q?=ED=92=80=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/coyote/connector/Connector.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/connector/Connector.java b/tomcat/src/main/java/org/apache/coyote/connector/Connector.java index 4a132ed9f9..9d715716a3 100644 --- a/tomcat/src/main/java/org/apache/coyote/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/coyote/connector/Connector.java @@ -1,13 +1,14 @@ package org.apache.coyote.connector; -import org.apache.coyote.processor.Http11Processor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.IOException; import java.io.UncheckedIOException; import java.net.ServerSocket; import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import org.apache.coyote.processor.Http11Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Connector implements Runnable { @@ -15,15 +16,18 @@ public class Connector implements Runnable { private static final int DEFAULT_PORT = 8080; private static final int DEFAULT_ACCEPT_COUNT = 100; + private static final int DEFAULT_THREAD_COUNT = 250; private final ServerSocket serverSocket; private boolean stopped; + private final ExecutorService executorService; public Connector() { - this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT); + this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT, DEFAULT_THREAD_COUNT); } - public Connector(final int port, final int acceptCount) { + public Connector(final int port, final int acceptCount, final int maxThreads) { + this.executorService = Executors.newFixedThreadPool(maxThreads); this.serverSocket = createServerSocket(port, acceptCount); this.stopped = false; } @@ -67,7 +71,7 @@ private void process(final Socket connection) { return; } var processor = new Http11Processor(connection); - new Thread(processor).start(); + executorService.submit(() -> processor.run()); } public void stop() { From 5b0809ff8d62ac0077d2134c10a9843674532d44 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 13 Sep 2024 16:01:56 +0900 Subject: [PATCH 07/49] =?UTF-8?q?refactor:=20=EB=8F=99=EC=8B=9C=EC=84=B1?= =?UTF-8?q?=20=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/coyote/manager/SessionManager.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/manager/SessionManager.java b/tomcat/src/main/java/org/apache/coyote/manager/SessionManager.java index fe0c706c63..2539ff7eb6 100644 --- a/tomcat/src/main/java/org/apache/coyote/manager/SessionManager.java +++ b/tomcat/src/main/java/org/apache/coyote/manager/SessionManager.java @@ -1,12 +1,11 @@ package org.apache.coyote.manager; import com.techcourse.model.User; -import java.util.HashMap; -import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.coyote.session.Session; public class SessionManager implements Manager { - private static final Map SESSIONS = new HashMap<>(); + private static final ConcurrentHashMap SESSIONS = new ConcurrentHashMap<>(); private static SessionManager instance; private SessionManager() { From fb880dd9adc3e54b7c6d3c9da63d1d8c1cfa47f2 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Sun, 15 Sep 2024 16:17:02 +0900 Subject: [PATCH 08/49] =?UTF-8?q?refactor:=20catalina,=20coyote=20?= =?UTF-8?q?=EC=84=B1=EA=B2=A9=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AbstractController.java | 8 ++++---- .../apache/catalina/controller/Controller.java | 9 +++++++++ .../controller/HomeController.java | 8 ++++---- .../controller/LoginController.java | 12 ++++++------ .../controller/RegisterController.java | 12 ++++++------ .../controller/StaticController.java | 8 ++++---- .../coockie/HttpCookie.java | 2 +- .../{coyote => catalina}/http/HeaderName.java | 2 +- .../{coyote => catalina}/http/HttpMethod.java | 2 +- .../{coyote => catalina}/http/StatusCode.java | 2 +- .../http11/Dispatcher.java | 18 +++++++++--------- .../http11/ProtocolVersion.java | 2 +- .../{coyote => catalina}/manager/Manager.java | 4 ++-- .../manager/SessionManager.java | 4 ++-- .../request/HttpRequest.java | 4 ++-- .../request/QueuryParam.java | 2 +- .../request/RequestBody.java | 2 +- .../request/RequestHeader.java | 6 +++--- .../request/RequestLine.java | 4 ++-- .../request/RequestReader.java | 2 +- .../response/HttpResponse.java | 6 +++--- .../response/ResponseBody.java | 2 +- .../response/ResponseHeader.java | 4 ++-- .../response/StatusLine.java | 6 +++--- .../{coyote => catalina}/session/Session.java | 2 +- .../apache/coyote/controller/Controller.java | 9 --------- .../coyote/processor/Http11Processor.java | 8 ++++---- .../apache/coyote/coockie/HttpCookieTest.java | 2 ++ .../apache/coyote/request/QueuryParamTest.java | 2 +- .../apache/coyote/request/RequestBodyTest.java | 2 +- .../coyote/request/RequestHeaderTest.java | 1 + .../apache/coyote/request/RequestLineTest.java | 3 ++- .../coyote/response/HttpResponseTest.java | 5 +++-- .../coyote/response/ResponseBodyTest.java | 1 + .../coyote/response/ResponseHeaderTest.java | 3 ++- .../apache/coyote/response/StatusLineTest.java | 1 + 36 files changed, 89 insertions(+), 81 deletions(-) rename tomcat/src/main/java/org/apache/{coyote => catalina}/controller/AbstractController.java (77%) create mode 100644 tomcat/src/main/java/org/apache/catalina/controller/Controller.java rename tomcat/src/main/java/org/apache/{coyote => catalina}/controller/HomeController.java (56%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/controller/LoginController.java (85%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/controller/RegisterController.java (75%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/controller/StaticController.java (57%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/coockie/HttpCookie.java (97%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/http/HeaderName.java (95%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/http/HttpMethod.java (58%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/http/StatusCode.java (92%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/http11/Dispatcher.java (68%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/http11/ProtocolVersion.java (87%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/manager/Manager.java (95%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/manager/SessionManager.java (92%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/request/HttpRequest.java (95%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/request/QueuryParam.java (97%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/request/RequestBody.java (95%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/request/RequestHeader.java (90%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/request/RequestLine.java (95%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/request/RequestReader.java (97%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/response/HttpResponse.java (89%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/response/ResponseBody.java (96%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/response/ResponseHeader.java (90%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/response/StatusLine.java (83%) rename tomcat/src/main/java/org/apache/{coyote => catalina}/session/Session.java (94%) delete mode 100644 tomcat/src/main/java/org/apache/coyote/controller/Controller.java diff --git a/tomcat/src/main/java/org/apache/coyote/controller/AbstractController.java b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java similarity index 77% rename from tomcat/src/main/java/org/apache/coyote/controller/AbstractController.java rename to tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java index 996689650a..039bc0a7e1 100644 --- a/tomcat/src/main/java/org/apache/coyote/controller/AbstractController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java @@ -1,8 +1,8 @@ -package org.apache.coyote.controller; +package org.apache.catalina.controller; -import org.apache.coyote.http.HttpMethod; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; +import org.apache.catalina.http.HttpMethod; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; public abstract class AbstractController implements Controller { diff --git a/tomcat/src/main/java/org/apache/catalina/controller/Controller.java b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java new file mode 100644 index 0000000000..d783a17e71 --- /dev/null +++ b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java @@ -0,0 +1,9 @@ +package org.apache.catalina.controller; + +import org.apache.catalina.response.HttpResponse; +import org.apache.catalina.request.HttpRequest; + +public interface Controller { + + void service(HttpRequest request, HttpResponse response); +} diff --git a/tomcat/src/main/java/org/apache/coyote/controller/HomeController.java b/tomcat/src/main/java/org/apache/catalina/controller/HomeController.java similarity index 56% rename from tomcat/src/main/java/org/apache/coyote/controller/HomeController.java rename to tomcat/src/main/java/org/apache/catalina/controller/HomeController.java index 7b47ba6fdd..0f2f1b72ae 100644 --- a/tomcat/src/main/java/org/apache/coyote/controller/HomeController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/HomeController.java @@ -1,8 +1,8 @@ -package org.apache.coyote.controller; +package org.apache.catalina.controller; -import org.apache.coyote.http.StatusCode; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; +import org.apache.catalina.http.StatusCode; +import org.apache.catalina.response.HttpResponse; +import org.apache.catalina.request.HttpRequest; public class HomeController extends AbstractController { diff --git a/tomcat/src/main/java/org/apache/coyote/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java similarity index 85% rename from tomcat/src/main/java/org/apache/coyote/controller/LoginController.java rename to tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index 7e84cca85d..6fe9f7ee45 100644 --- a/tomcat/src/main/java/org/apache/coyote/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -1,13 +1,13 @@ -package org.apache.coyote.controller; +package org.apache.catalina.controller; import com.techcourse.db.InMemoryUserRepository; import com.techcourse.model.User; import java.util.Optional; -import org.apache.coyote.http.HeaderName; -import org.apache.coyote.http.StatusCode; -import org.apache.coyote.manager.SessionManager; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; +import org.apache.catalina.http.HeaderName; +import org.apache.catalina.http.StatusCode; +import org.apache.catalina.response.HttpResponse; +import org.apache.catalina.manager.SessionManager; +import org.apache.catalina.request.HttpRequest; public class LoginController extends AbstractController { diff --git a/tomcat/src/main/java/org/apache/coyote/controller/RegisterController.java b/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java similarity index 75% rename from tomcat/src/main/java/org/apache/coyote/controller/RegisterController.java rename to tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java index 79a0b1be5b..fad87b70e7 100644 --- a/tomcat/src/main/java/org/apache/coyote/controller/RegisterController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java @@ -1,12 +1,12 @@ -package org.apache.coyote.controller; +package org.apache.catalina.controller; import com.techcourse.db.InMemoryUserRepository; import com.techcourse.model.User; -import org.apache.coyote.http.HeaderName; -import org.apache.coyote.http.StatusCode; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.request.RequestBody; -import org.apache.coyote.response.HttpResponse; +import org.apache.catalina.http.HeaderName; +import org.apache.catalina.http.StatusCode; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.request.RequestBody; +import org.apache.catalina.response.HttpResponse; public class RegisterController extends AbstractController { diff --git a/tomcat/src/main/java/org/apache/coyote/controller/StaticController.java b/tomcat/src/main/java/org/apache/catalina/controller/StaticController.java similarity index 57% rename from tomcat/src/main/java/org/apache/coyote/controller/StaticController.java rename to tomcat/src/main/java/org/apache/catalina/controller/StaticController.java index 8611504b89..9c132e1b7f 100644 --- a/tomcat/src/main/java/org/apache/coyote/controller/StaticController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/StaticController.java @@ -1,8 +1,8 @@ -package org.apache.coyote.controller; +package org.apache.catalina.controller; -import org.apache.coyote.http.StatusCode; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; +import org.apache.catalina.http.StatusCode; +import org.apache.catalina.response.HttpResponse; +import org.apache.catalina.request.HttpRequest; public class StaticController extends AbstractController { diff --git a/tomcat/src/main/java/org/apache/coyote/coockie/HttpCookie.java b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java similarity index 97% rename from tomcat/src/main/java/org/apache/coyote/coockie/HttpCookie.java rename to tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java index c8f5ccd3b1..d6044defcf 100644 --- a/tomcat/src/main/java/org/apache/coyote/coockie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java @@ -1,4 +1,4 @@ -package org.apache.coyote.coockie; +package org.apache.catalina.coockie; import java.util.HashMap; import java.util.Map; diff --git a/tomcat/src/main/java/org/apache/coyote/http/HeaderName.java b/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java similarity index 95% rename from tomcat/src/main/java/org/apache/coyote/http/HeaderName.java rename to tomcat/src/main/java/org/apache/catalina/http/HeaderName.java index b29f1f2c8c..1fba9334c2 100644 --- a/tomcat/src/main/java/org/apache/coyote/http/HeaderName.java +++ b/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http; +package org.apache.catalina.http; import java.util.Arrays; diff --git a/tomcat/src/main/java/org/apache/coyote/http/HttpMethod.java b/tomcat/src/main/java/org/apache/catalina/http/HttpMethod.java similarity index 58% rename from tomcat/src/main/java/org/apache/coyote/http/HttpMethod.java rename to tomcat/src/main/java/org/apache/catalina/http/HttpMethod.java index ecc69cf8d8..487c55cde3 100644 --- a/tomcat/src/main/java/org/apache/coyote/http/HttpMethod.java +++ b/tomcat/src/main/java/org/apache/catalina/http/HttpMethod.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http; +package org.apache.catalina.http; public enum HttpMethod { GET, diff --git a/tomcat/src/main/java/org/apache/coyote/http/StatusCode.java b/tomcat/src/main/java/org/apache/catalina/http/StatusCode.java similarity index 92% rename from tomcat/src/main/java/org/apache/coyote/http/StatusCode.java rename to tomcat/src/main/java/org/apache/catalina/http/StatusCode.java index d521fda212..77cc8eaa8f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http/StatusCode.java +++ b/tomcat/src/main/java/org/apache/catalina/http/StatusCode.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http; +package org.apache.catalina.http; public enum StatusCode { OK(200, "OK"), diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Dispatcher.java b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java similarity index 68% rename from tomcat/src/main/java/org/apache/coyote/http11/Dispatcher.java rename to tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java index ee0807aef8..8eec4b57f0 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Dispatcher.java +++ b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java @@ -1,14 +1,14 @@ -package org.apache.coyote.http11; +package org.apache.catalina.http11; import java.util.Map; -import org.apache.coyote.controller.Controller; -import org.apache.coyote.controller.HomeController; -import org.apache.coyote.controller.LoginController; -import org.apache.coyote.controller.RegisterController; -import org.apache.coyote.controller.StaticController; -import org.apache.coyote.http.HeaderName; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; +import org.apache.catalina.controller.Controller; +import org.apache.catalina.controller.HomeController; +import org.apache.catalina.controller.LoginController; +import org.apache.catalina.controller.RegisterController; +import org.apache.catalina.controller.StaticController; +import org.apache.catalina.http.HeaderName; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; public class Dispatcher { diff --git a/tomcat/src/main/java/org/apache/coyote/http11/ProtocolVersion.java b/tomcat/src/main/java/org/apache/catalina/http11/ProtocolVersion.java similarity index 87% rename from tomcat/src/main/java/org/apache/coyote/http11/ProtocolVersion.java rename to tomcat/src/main/java/org/apache/catalina/http11/ProtocolVersion.java index 1955a3942c..04b05f3ae5 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/ProtocolVersion.java +++ b/tomcat/src/main/java/org/apache/catalina/http11/ProtocolVersion.java @@ -1,4 +1,4 @@ -package org.apache.coyote.http11; +package org.apache.catalina.http11; public enum ProtocolVersion { HTTP1_1("HTTP/1.1"), diff --git a/tomcat/src/main/java/org/apache/coyote/manager/Manager.java b/tomcat/src/main/java/org/apache/catalina/manager/Manager.java similarity index 95% rename from tomcat/src/main/java/org/apache/coyote/manager/Manager.java rename to tomcat/src/main/java/org/apache/catalina/manager/Manager.java index 9d87f2970a..71459eb82b 100644 --- a/tomcat/src/main/java/org/apache/coyote/manager/Manager.java +++ b/tomcat/src/main/java/org/apache/catalina/manager/Manager.java @@ -1,7 +1,7 @@ -package org.apache.coyote.manager; +package org.apache.catalina.manager; import java.io.IOException; -import org.apache.coyote.session.Session; +import org.apache.catalina.session.Session; /** * A Manager manages the pool of Sessions that are associated with a diff --git a/tomcat/src/main/java/org/apache/coyote/manager/SessionManager.java b/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java similarity index 92% rename from tomcat/src/main/java/org/apache/coyote/manager/SessionManager.java rename to tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java index 2539ff7eb6..0778c67c1d 100644 --- a/tomcat/src/main/java/org/apache/coyote/manager/SessionManager.java +++ b/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java @@ -1,8 +1,8 @@ -package org.apache.coyote.manager; +package org.apache.catalina.manager; import com.techcourse.model.User; import java.util.concurrent.ConcurrentHashMap; -import org.apache.coyote.session.Session; +import org.apache.catalina.session.Session; public class SessionManager implements Manager { private static final ConcurrentHashMap SESSIONS = new ConcurrentHashMap<>(); diff --git a/tomcat/src/main/java/org/apache/coyote/request/HttpRequest.java b/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java similarity index 95% rename from tomcat/src/main/java/org/apache/coyote/request/HttpRequest.java rename to tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java index e0c25a843f..1c5a157f4c 100644 --- a/tomcat/src/main/java/org/apache/coyote/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java @@ -1,7 +1,7 @@ -package org.apache.coyote.request; +package org.apache.catalina.request; import java.util.List; -import org.apache.coyote.http.HttpMethod; +import org.apache.catalina.http.HttpMethod; public class HttpRequest { diff --git a/tomcat/src/main/java/org/apache/coyote/request/QueuryParam.java b/tomcat/src/main/java/org/apache/catalina/request/QueuryParam.java similarity index 97% rename from tomcat/src/main/java/org/apache/coyote/request/QueuryParam.java rename to tomcat/src/main/java/org/apache/catalina/request/QueuryParam.java index 063ee3b15c..4d6b67c29e 100644 --- a/tomcat/src/main/java/org/apache/coyote/request/QueuryParam.java +++ b/tomcat/src/main/java/org/apache/catalina/request/QueuryParam.java @@ -1,4 +1,4 @@ -package org.apache.coyote.request; +package org.apache.catalina.request; import java.util.HashMap; import java.util.Map; diff --git a/tomcat/src/main/java/org/apache/coyote/request/RequestBody.java b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java similarity index 95% rename from tomcat/src/main/java/org/apache/coyote/request/RequestBody.java rename to tomcat/src/main/java/org/apache/catalina/request/RequestBody.java index 75827379bd..ab91e37e97 100644 --- a/tomcat/src/main/java/org/apache/coyote/request/RequestBody.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java @@ -1,4 +1,4 @@ -package org.apache.coyote.request; +package org.apache.catalina.request; import java.util.HashMap; import java.util.Map; diff --git a/tomcat/src/main/java/org/apache/coyote/request/RequestHeader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java similarity index 90% rename from tomcat/src/main/java/org/apache/coyote/request/RequestHeader.java rename to tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java index 1b478cd98b..4ed84a4917 100644 --- a/tomcat/src/main/java/org/apache/coyote/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java @@ -1,10 +1,10 @@ -package org.apache.coyote.request; +package org.apache.catalina.request; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.coyote.coockie.HttpCookie; -import org.apache.coyote.http.HeaderName; +import org.apache.catalina.coockie.HttpCookie; +import org.apache.catalina.http.HeaderName; public class RequestHeader { diff --git a/tomcat/src/main/java/org/apache/coyote/request/RequestLine.java b/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java similarity index 95% rename from tomcat/src/main/java/org/apache/coyote/request/RequestLine.java rename to tomcat/src/main/java/org/apache/catalina/request/RequestLine.java index 350fa4d465..60e25cda66 100644 --- a/tomcat/src/main/java/org/apache/coyote/request/RequestLine.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java @@ -1,10 +1,10 @@ -package org.apache.coyote.request; +package org.apache.catalina.request; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import org.apache.coyote.http.HttpMethod; +import org.apache.catalina.http.HttpMethod; public class RequestLine { diff --git a/tomcat/src/main/java/org/apache/coyote/request/RequestReader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestReader.java similarity index 97% rename from tomcat/src/main/java/org/apache/coyote/request/RequestReader.java rename to tomcat/src/main/java/org/apache/catalina/request/RequestReader.java index 6925b67851..420b4116e0 100644 --- a/tomcat/src/main/java/org/apache/coyote/request/RequestReader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestReader.java @@ -1,4 +1,4 @@ -package org.apache.coyote.request; +package org.apache.catalina.request; import java.io.BufferedReader; import java.io.IOException; diff --git a/tomcat/src/main/java/org/apache/coyote/response/HttpResponse.java b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java similarity index 89% rename from tomcat/src/main/java/org/apache/coyote/response/HttpResponse.java rename to tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java index 05c460a468..7565e6a588 100644 --- a/tomcat/src/main/java/org/apache/coyote/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java @@ -1,7 +1,7 @@ -package org.apache.coyote.response; +package org.apache.catalina.response; -import org.apache.coyote.http.HeaderName; -import org.apache.coyote.http.StatusCode; +import org.apache.catalina.http.HeaderName; +import org.apache.catalina.http.StatusCode; public class HttpResponse { diff --git a/tomcat/src/main/java/org/apache/coyote/response/ResponseBody.java b/tomcat/src/main/java/org/apache/catalina/response/ResponseBody.java similarity index 96% rename from tomcat/src/main/java/org/apache/coyote/response/ResponseBody.java rename to tomcat/src/main/java/org/apache/catalina/response/ResponseBody.java index 105921ce7b..a805d1815d 100644 --- a/tomcat/src/main/java/org/apache/coyote/response/ResponseBody.java +++ b/tomcat/src/main/java/org/apache/catalina/response/ResponseBody.java @@ -1,4 +1,4 @@ -package org.apache.coyote.response; +package org.apache.catalina.response; import java.io.IOException; import java.nio.file.Files; diff --git a/tomcat/src/main/java/org/apache/coyote/response/ResponseHeader.java b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java similarity index 90% rename from tomcat/src/main/java/org/apache/coyote/response/ResponseHeader.java rename to tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java index 9079199079..8341f599cf 100644 --- a/tomcat/src/main/java/org/apache/coyote/response/ResponseHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java @@ -1,9 +1,9 @@ -package org.apache.coyote.response; +package org.apache.catalina.response; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import org.apache.coyote.http.HeaderName; +import org.apache.catalina.http.HeaderName; public class ResponseHeader { diff --git a/tomcat/src/main/java/org/apache/coyote/response/StatusLine.java b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java similarity index 83% rename from tomcat/src/main/java/org/apache/coyote/response/StatusLine.java rename to tomcat/src/main/java/org/apache/catalina/response/StatusLine.java index 189b283e71..4c92344a83 100644 --- a/tomcat/src/main/java/org/apache/coyote/response/StatusLine.java +++ b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java @@ -1,7 +1,7 @@ -package org.apache.coyote.response; +package org.apache.catalina.response; -import org.apache.coyote.http.StatusCode; -import org.apache.coyote.http11.ProtocolVersion; +import org.apache.catalina.http11.ProtocolVersion; +import org.apache.catalina.http.StatusCode; public class StatusLine { diff --git a/tomcat/src/main/java/org/apache/coyote/session/Session.java b/tomcat/src/main/java/org/apache/catalina/session/Session.java similarity index 94% rename from tomcat/src/main/java/org/apache/coyote/session/Session.java rename to tomcat/src/main/java/org/apache/catalina/session/Session.java index 71b179e577..ecc62c36a4 100644 --- a/tomcat/src/main/java/org/apache/coyote/session/Session.java +++ b/tomcat/src/main/java/org/apache/catalina/session/Session.java @@ -1,4 +1,4 @@ -package org.apache.coyote.session; +package org.apache.catalina.session; import com.techcourse.model.User; import java.util.HashMap; diff --git a/tomcat/src/main/java/org/apache/coyote/controller/Controller.java b/tomcat/src/main/java/org/apache/coyote/controller/Controller.java deleted file mode 100644 index d97ddb99bb..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/controller/Controller.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.apache.coyote.controller; - -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public interface Controller { - - void service(HttpRequest request, HttpResponse response); -} diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index c7260d3a59..40fe3e53df 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -4,10 +4,10 @@ import java.io.IOException; import java.net.Socket; import org.apache.coyote.Processor; -import org.apache.coyote.http11.Dispatcher; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.request.RequestReader; -import org.apache.coyote.response.HttpResponse; +import org.apache.catalina.http11.Dispatcher; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.request.RequestReader; +import org.apache.catalina.response.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/tomcat/src/test/java/org/apache/coyote/coockie/HttpCookieTest.java b/tomcat/src/test/java/org/apache/coyote/coockie/HttpCookieTest.java index 101a9a1f94..9ad599f31b 100644 --- a/tomcat/src/test/java/org/apache/coyote/coockie/HttpCookieTest.java +++ b/tomcat/src/test/java/org/apache/coyote/coockie/HttpCookieTest.java @@ -1,6 +1,8 @@ package org.apache.coyote.coockie; import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.catalina.coockie.HttpCookie; import org.junit.jupiter.api.Test; class HttpCookieTest { diff --git a/tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java b/tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java index 835a948993..50d8838fc2 100644 --- a/tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java +++ b/tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java @@ -1,8 +1,8 @@ package org.apache.coyote.request; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import org.apache.catalina.request.QueuryParam; import org.junit.jupiter.api.Test; class QueuryParamTest { diff --git a/tomcat/src/test/java/org/apache/coyote/request/RequestBodyTest.java b/tomcat/src/test/java/org/apache/coyote/request/RequestBodyTest.java index 756c4c534e..5446928d66 100644 --- a/tomcat/src/test/java/org/apache/coyote/request/RequestBodyTest.java +++ b/tomcat/src/test/java/org/apache/coyote/request/RequestBodyTest.java @@ -1,8 +1,8 @@ package org.apache.coyote.request; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import org.apache.catalina.request.RequestBody; import org.junit.jupiter.api.Test; class RequestBodyTest { diff --git a/tomcat/src/test/java/org/apache/coyote/request/RequestHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/request/RequestHeaderTest.java index 1f982c12bf..d725afb904 100644 --- a/tomcat/src/test/java/org/apache/coyote/request/RequestHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/request/RequestHeaderTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; +import org.apache.catalina.request.RequestHeader; import org.junit.jupiter.api.Test; class RequestHeaderTest { diff --git a/tomcat/src/test/java/org/apache/coyote/request/RequestLineTest.java b/tomcat/src/test/java/org/apache/coyote/request/RequestLineTest.java index fea726836e..819c2f4e58 100644 --- a/tomcat/src/test/java/org/apache/coyote/request/RequestLineTest.java +++ b/tomcat/src/test/java/org/apache/coyote/request/RequestLineTest.java @@ -2,7 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.coyote.http.HttpMethod; +import org.apache.catalina.http.HttpMethod; +import org.apache.catalina.request.RequestLine; import org.junit.jupiter.api.Test; class RequestLineTest { diff --git a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java index 32a627ed7e..cfbfb32693 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java @@ -2,8 +2,9 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.coyote.http.HeaderName; -import org.apache.coyote.http.StatusCode; +import org.apache.catalina.http.HeaderName; +import org.apache.catalina.http.StatusCode; +import org.apache.catalina.response.HttpResponse; import org.junit.jupiter.api.Test; class HttpResponseTest { diff --git a/tomcat/src/test/java/org/apache/coyote/response/ResponseBodyTest.java b/tomcat/src/test/java/org/apache/coyote/response/ResponseBodyTest.java index 9f16c17bd0..5eef1c223b 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/ResponseBodyTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/ResponseBodyTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import org.apache.catalina.response.ResponseBody; import org.junit.jupiter.api.Test; class ResponseBodyTest { diff --git a/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java index 3f575452d4..d1688ac1f7 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java @@ -2,7 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.coyote.http.HeaderName; +import org.apache.catalina.http.HeaderName; +import org.apache.catalina.response.ResponseHeader; import org.junit.jupiter.api.Test; class ResponseHeaderTest { diff --git a/tomcat/src/test/java/org/apache/coyote/response/StatusLineTest.java b/tomcat/src/test/java/org/apache/coyote/response/StatusLineTest.java index cd06411390..cd55a078de 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/StatusLineTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/StatusLineTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; +import org.apache.catalina.response.StatusLine; import org.junit.jupiter.api.Test; class StatusLineTest { From cd1fc33fef5ef88415f859e3277a10ddafe4495d Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 20:45:07 +0900 Subject: [PATCH 09/49] =?UTF-8?q?refactor:=20catalina,=20coyote=20?= =?UTF-8?q?=EC=84=B1=EA=B2=A9=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tomcat/src/main/java/com/techcourse/Application.java | 2 +- .../main/java/org/apache/catalina/{http => }/HeaderName.java | 2 +- .../java/org/apache/catalina/{http11 => }/ProtocolVersion.java | 2 +- .../src/main/java/org/apache/catalina/http11/Dispatcher.java | 2 +- .../main/java/org/apache/catalina/request/RequestHeader.java | 2 +- .../main/java/org/apache/catalina/response/HttpResponse.java | 2 +- .../main/java/org/apache/catalina/response/ResponseHeader.java | 2 +- .../src/main/java/org/apache/catalina/response/StatusLine.java | 2 +- .../{catalina/request => coyote/connector}/RequestReader.java | 3 ++- .../main/java/org/apache/coyote/processor/Http11Processor.java | 2 +- .../java/org/apache/{catalina => coyote}/startup/Tomcat.java | 2 +- .../test/java/org/apache/coyote/response/HttpResponseTest.java | 2 +- .../java/org/apache/coyote/response/ResponseHeaderTest.java | 2 +- 13 files changed, 14 insertions(+), 13 deletions(-) rename tomcat/src/main/java/org/apache/catalina/{http => }/HeaderName.java (95%) rename tomcat/src/main/java/org/apache/catalina/{http11 => }/ProtocolVersion.java (87%) rename tomcat/src/main/java/org/apache/{catalina/request => coyote/connector}/RequestReader.java (95%) rename tomcat/src/main/java/org/apache/{catalina => coyote}/startup/Tomcat.java (94%) diff --git a/tomcat/src/main/java/com/techcourse/Application.java b/tomcat/src/main/java/com/techcourse/Application.java index 6dc0e04e1d..dd81f6f6a0 100644 --- a/tomcat/src/main/java/com/techcourse/Application.java +++ b/tomcat/src/main/java/com/techcourse/Application.java @@ -1,6 +1,6 @@ package com.techcourse; -import org.apache.catalina.startup.Tomcat; +import org.apache.coyote.startup.Tomcat; public class Application { diff --git a/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java b/tomcat/src/main/java/org/apache/catalina/HeaderName.java similarity index 95% rename from tomcat/src/main/java/org/apache/catalina/http/HeaderName.java rename to tomcat/src/main/java/org/apache/catalina/HeaderName.java index 1fba9334c2..cb87269ad2 100644 --- a/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java +++ b/tomcat/src/main/java/org/apache/catalina/HeaderName.java @@ -1,4 +1,4 @@ -package org.apache.catalina.http; +package org.apache.catalina; import java.util.Arrays; diff --git a/tomcat/src/main/java/org/apache/catalina/http11/ProtocolVersion.java b/tomcat/src/main/java/org/apache/catalina/ProtocolVersion.java similarity index 87% rename from tomcat/src/main/java/org/apache/catalina/http11/ProtocolVersion.java rename to tomcat/src/main/java/org/apache/catalina/ProtocolVersion.java index 04b05f3ae5..146563025a 100644 --- a/tomcat/src/main/java/org/apache/catalina/http11/ProtocolVersion.java +++ b/tomcat/src/main/java/org/apache/catalina/ProtocolVersion.java @@ -1,4 +1,4 @@ -package org.apache.catalina.http11; +package org.apache.catalina; public enum ProtocolVersion { HTTP1_1("HTTP/1.1"), diff --git a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java index 8eec4b57f0..ffd25cfcd5 100644 --- a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java +++ b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java @@ -6,7 +6,7 @@ import org.apache.catalina.controller.LoginController; import org.apache.catalina.controller.RegisterController; import org.apache.catalina.controller.StaticController; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java index 4ed84a4917..8ef5cea2af 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; import org.apache.catalina.coockie.HttpCookie; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; public class RequestHeader { diff --git a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java index 7565e6a588..ace904131d 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java @@ -1,6 +1,6 @@ package org.apache.catalina.response; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; import org.apache.catalina.http.StatusCode; public class HttpResponse { diff --git a/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java index 8341f599cf..fb3c093c8c 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; public class ResponseHeader { diff --git a/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java index 4c92344a83..1b1cac2d9e 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java +++ b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java @@ -1,6 +1,6 @@ package org.apache.catalina.response; -import org.apache.catalina.http11.ProtocolVersion; +import org.apache.catalina.ProtocolVersion; import org.apache.catalina.http.StatusCode; public class StatusLine { diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestReader.java b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java similarity index 95% rename from tomcat/src/main/java/org/apache/catalina/request/RequestReader.java rename to tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java index 420b4116e0..6415b141fb 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestReader.java +++ b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java @@ -1,4 +1,4 @@ -package org.apache.catalina.request; +package org.apache.coyote.connector; import java.io.BufferedReader; import java.io.IOException; @@ -6,6 +6,7 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; +import org.apache.catalina.request.HttpRequest; public class RequestReader { diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 40fe3e53df..a94d62f9c4 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -6,7 +6,7 @@ import org.apache.coyote.Processor; import org.apache.catalina.http11.Dispatcher; import org.apache.catalina.request.HttpRequest; -import org.apache.catalina.request.RequestReader; +import org.apache.coyote.connector.RequestReader; import org.apache.catalina.response.HttpResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/tomcat/src/main/java/org/apache/catalina/startup/Tomcat.java b/tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java similarity index 94% rename from tomcat/src/main/java/org/apache/catalina/startup/Tomcat.java rename to tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java index 3027877bc6..15af5a6531 100644 --- a/tomcat/src/main/java/org/apache/catalina/startup/Tomcat.java +++ b/tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java @@ -1,4 +1,4 @@ -package org.apache.catalina.startup; +package org.apache.coyote.startup; import org.apache.coyote.connector.Connector; import org.slf4j.Logger; diff --git a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java index cfbfb32693..800605f182 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; import org.apache.catalina.http.StatusCode; import org.apache.catalina.response.HttpResponse; import org.junit.jupiter.api.Test; diff --git a/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java index d1688ac1f7..777a4b6b43 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; import org.apache.catalina.response.ResponseHeader; import org.junit.jupiter.api.Test; From 7259fc032cd67b4d4ea63abd3de2863873945fe7 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 20:45:27 +0900 Subject: [PATCH 10/49] =?UTF-8?q?refactor:=20request=20body=EC=9D=98=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=EB=A5=BC=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/catalina/controller/LoginController.java | 6 +++--- .../apache/catalina/controller/RegisterController.java | 10 ++++------ .../java/org/apache/catalina/request/HttpRequest.java | 8 ++++---- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index 6fe9f7ee45..01210c5061 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -3,7 +3,7 @@ import com.techcourse.db.InMemoryUserRepository; import com.techcourse.model.User; import java.util.Optional; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; import org.apache.catalina.http.StatusCode; import org.apache.catalina.response.HttpResponse; import org.apache.catalina.manager.SessionManager; @@ -19,8 +19,8 @@ public LoginController() { @Override protected void doPost(HttpRequest request, HttpResponse response) { - String account = request.getBody("account"); - String password = request.getBody("password"); + String account = request.getBodyParam("account"); + String password = request.getBodyParam("password"); Optional user = InMemoryUserRepository.findByAccount(account); if (user.isEmpty() || !user.get().checkPassword(password)) { diff --git a/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java b/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java index fad87b70e7..a9c510b652 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java @@ -2,20 +2,18 @@ import com.techcourse.db.InMemoryUserRepository; import com.techcourse.model.User; -import org.apache.catalina.http.HeaderName; +import org.apache.catalina.HeaderName; import org.apache.catalina.http.StatusCode; import org.apache.catalina.request.HttpRequest; -import org.apache.catalina.request.RequestBody; import org.apache.catalina.response.HttpResponse; public class RegisterController extends AbstractController { @Override protected void doPost(HttpRequest request, HttpResponse response) { - RequestBody requestBody = request.getBody(); - String account = requestBody.get("account"); - String password = requestBody.get("password"); - String email = requestBody.get("email"); + String account = request.getBodyParam("account"); + String password = request.getBodyParam("password"); + String email = request.getBodyParam("email"); InMemoryUserRepository.save(new User(account, password, email)); response.setStatusCode(StatusCode.FOUND); diff --git a/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java b/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java index 1c5a157f4c..cd332fe9ab 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java @@ -58,11 +58,11 @@ public boolean hasSession() { return header.hasSession(); } - public RequestBody getBody() { - return body; + public String getBodyParam(String parameter) { + return body.get(parameter); } - public String getBody(String parameter) { - return body.get(parameter); + public RequestBody getBody() { + return body; } } From 0f111affdd3ab2f07fd40f19e92acfbb630a39e8 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 20:53:45 +0900 Subject: [PATCH 11/49] =?UTF-8?q?refactor:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/catalina/controller/LoginController.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index 01210c5061..c2be46d15a 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -5,9 +5,9 @@ import java.util.Optional; import org.apache.catalina.HeaderName; import org.apache.catalina.http.StatusCode; -import org.apache.catalina.response.HttpResponse; import org.apache.catalina.manager.SessionManager; import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; public class LoginController extends AbstractController { @@ -22,7 +22,6 @@ protected void doPost(HttpRequest request, HttpResponse response) { String account = request.getBodyParam("account"); String password = request.getBodyParam("password"); Optional user = InMemoryUserRepository.findByAccount(account); - if (user.isEmpty() || !user.get().checkPassword(password)) { response.setStatusCode(StatusCode.UNAUTHORIZED); response.setBody("/401.html"); @@ -30,12 +29,15 @@ protected void doPost(HttpRequest request, HttpResponse response) { if (user.isPresent() && user.get().checkPassword(password)) { response.setStatusCode(StatusCode.FOUND); response.setBody("/index.html"); - - String sessionId = sessionManager.generateSession(user.get()); - response.addHeader(HeaderName.SET_COOKIE, "JSESSIONID=" + sessionId); + login(response, user.get()); } } + private void login(HttpResponse response, User user) { + String sessionId = sessionManager.generateSession(user); + response.addHeader(HeaderName.SET_COOKIE, "JSESSIONID=" + sessionId); + } + @Override protected void doGet(HttpRequest request, HttpResponse response) { if (request.hasSession() && sessionManager.isSessionExist(request.getSessionId())) { From b195f6ac624b8b9ddd9c5cd642822df82884d031 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 20:54:12 +0900 Subject: [PATCH 12/49] =?UTF-8?q?refactor:=20=EC=BF=A0=ED=82=A4=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/catalina/coockie/HttpCookie.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java index d6044defcf..29b972c659 100644 --- a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java @@ -7,6 +7,8 @@ public class HttpCookie { private static final String JSESSIONID_VALUE = "JSESSIONID"; + public static final String COOKIE_DELIMITER = "; "; + public static final String COOKIE_VALUE_DELIMITER = "="; private final Map cookies; @@ -19,15 +21,16 @@ public HttpCookie(String rawCookies) { } private static Map mapCookies(String rawCookies) { - Map cookieGroup = new HashMap<>(); + if (rawCookies == null || rawCookies.isBlank()) { + return Map.of(); + } - if (rawCookies != null && !rawCookies.isBlank()) { - String[] cookiesElements = rawCookies.split("; "); - for (int i = 0; i < cookiesElements.length; i++) { - String[] cookiePair = cookiesElements[i].split("="); - if (cookiePair.length > 1) { - cookieGroup.put(cookiePair[0], cookiePair[1]); - } + Map cookieGroup = new HashMap<>(); + String[] cookiesElements = rawCookies.split(COOKIE_DELIMITER); + for (String cookiesElement : cookiesElements) { + String[] cookiePair = cookiesElement.split(COOKIE_VALUE_DELIMITER); + if (cookiePair.length == 2) { + cookieGroup.put(cookiePair[0], cookiePair[1]); } } return cookieGroup; @@ -49,7 +52,7 @@ public String getResponse() { StringBuilder response = new StringBuilder(); for (Entry stringStringEntry : cookies.entrySet()) { response.append(stringStringEntry.getKey()) - .append("=") + .append(COOKIE_VALUE_DELIMITER) .append(stringStringEntry.getValue()) .append(";"); } From 4adda667f9d5202ae14de2d36413fc51f8dfde97 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 21:01:30 +0900 Subject: [PATCH 13/49] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EC=BF=A0=ED=82=A4=EA=B0=80=20=EC=9E=88=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=EB=A7=8C=20=EC=BF=A0=ED=82=A4=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/coockie/HttpCookie.java | 4 ++++ .../org/apache/catalina/http11/Dispatcher.java | 14 ++++++++------ .../org/apache/catalina/request/HttpRequest.java | 8 ++++---- .../org/apache/catalina/request/RequestHeader.java | 4 ++++ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java index 29b972c659..5c933498f7 100644 --- a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java @@ -44,6 +44,10 @@ public String getSessionId() { return cookies.get(JSESSIONID_VALUE); } + public boolean hasCookie() { + return !cookies.isEmpty(); + } + public String getResponse() { if (cookies.isEmpty()) { return ""; diff --git a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java index ffd25cfcd5..52e95d1256 100644 --- a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java +++ b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java @@ -1,12 +1,12 @@ package org.apache.catalina.http11; import java.util.Map; +import org.apache.catalina.HeaderName; import org.apache.catalina.controller.Controller; import org.apache.catalina.controller.HomeController; import org.apache.catalina.controller.LoginController; import org.apache.catalina.controller.RegisterController; import org.apache.catalina.controller.StaticController; -import org.apache.catalina.HeaderName; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; @@ -26,14 +26,16 @@ public Dispatcher() { public void run(HttpRequest httpRequest, HttpResponse httpResponse) { httpResponse.addHeader(HeaderName.CONTENT_TYPE, httpRequest.getContentType()); - httpResponse.addHeader(HeaderName.SET_COOKIE, httpRequest.getHttpCookie()); + if (httpRequest.hasCookie()) { + httpResponse.addHeader(HeaderName.SET_COOKIE, httpRequest.getHttpCookie()); + } if (httpRequest.isStaticRequest()) { staticController.service(httpRequest, httpResponse); + return; } - if (!httpRequest.isStaticRequest()) { - Controller controller = controllers.get(httpRequest.getPath()); - controller.service(httpRequest, httpResponse); - } + + Controller controller = controllers.get(httpRequest.getPath()); + controller.service(httpRequest, httpResponse); } } diff --git a/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java b/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java index cd332fe9ab..f5f0ecb5e5 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java +++ b/tomcat/src/main/java/org/apache/catalina/request/HttpRequest.java @@ -42,6 +42,10 @@ public String getHttpCookie() { return header.getHttpCookie(); } + public boolean hasCookie() { + return header.hasCookie(); + } + public boolean isMethod(HttpMethod httpMethod) { return requestLine.isMethod(httpMethod); } @@ -50,10 +54,6 @@ public boolean isStaticRequest() { return requestLine.isStaticRequest(); } - public boolean hasQueryParam() { - return requestLine.hasQueryParam(); - } - public boolean hasSession() { return header.hasSession(); } diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java index 8ef5cea2af..7feb144e6a 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java @@ -44,4 +44,8 @@ public String getSessionId() { public String getHttpCookie() { return httpCookie.getResponse(); } + + public boolean hasCookie() { + return httpCookie.hasCookie(); + } } From cfdbbca31b94d486e66e43b163f864cc7977e786 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 21:02:02 +0900 Subject: [PATCH 14/49] =?UTF-8?q?fix:=20=EC=8B=B1=EA=B8=80=ED=86=A4=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/catalina/manager/SessionManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java b/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java index 0778c67c1d..1252cba15b 100644 --- a/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java +++ b/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java @@ -13,7 +13,7 @@ private SessionManager() { public static SessionManager getInstance() { if (instance == null) { - return new SessionManager(); + instance = new SessionManager(); } return instance; } From 301298ba1cefdca20790c71e230d30158b11d230 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 21:02:59 +0900 Subject: [PATCH 15/49] =?UTF-8?q?refactor:=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{QueuryParam.java => QueuyParam.java} | 4 ++-- .../apache/catalina/request/RequestLine.java | 4 ++-- .../coyote/request/QueuryParamTest.java | 21 ------------------- .../apache/coyote/request/QueuyParamTest.java | 21 +++++++++++++++++++ 4 files changed, 25 insertions(+), 25 deletions(-) rename tomcat/src/main/java/org/apache/catalina/request/{QueuryParam.java => QueuyParam.java} (94%) delete mode 100644 tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java create mode 100644 tomcat/src/test/java/org/apache/coyote/request/QueuyParamTest.java diff --git a/tomcat/src/main/java/org/apache/catalina/request/QueuryParam.java b/tomcat/src/main/java/org/apache/catalina/request/QueuyParam.java similarity index 94% rename from tomcat/src/main/java/org/apache/catalina/request/QueuryParam.java rename to tomcat/src/main/java/org/apache/catalina/request/QueuyParam.java index 4d6b67c29e..70054f2422 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/QueuryParam.java +++ b/tomcat/src/main/java/org/apache/catalina/request/QueuyParam.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; -public class QueuryParam { +public class QueuyParam { public static final String QUERY_INDICATOR = "?"; public static final String QUERY_COMPONENT_DELIMITER = "&"; @@ -11,7 +11,7 @@ public class QueuryParam { private final Map params; - public QueuryParam(String requestLineEntry) { + public QueuyParam(String requestLineEntry) { this.params = mapQueryParam(requestLineEntry); } diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java b/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java index 60e25cda66..9703ad6952 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java @@ -11,13 +11,13 @@ public class RequestLine { private final HttpMethod httpMethod; private final String path; private final String versionOfProtocol; - private final QueuryParam queryParams; + private final QueuyParam queryParams; public RequestLine(String headerLines) { String[] requestLineEntries = headerLines.split(" "); this.httpMethod = HttpMethod.valueOf(requestLineEntries[0]); - this.queryParams = new QueuryParam(requestLineEntries[1]); + this.queryParams = new QueuyParam(requestLineEntries[1]); this.path = mapPath(requestLineEntries[1]); this.versionOfProtocol = requestLineEntries[2]; } diff --git a/tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java b/tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java deleted file mode 100644 index 50d8838fc2..0000000000 --- a/tomcat/src/test/java/org/apache/coyote/request/QueuryParamTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.apache.coyote.request; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.apache.catalina.request.QueuryParam; -import org.junit.jupiter.api.Test; - -class QueuryParamTest { - - @Test - void hasQueryParam() { - QueuryParam queuryParam = new QueuryParam("GET /index.html?name=kirby&part=backend HTTP/1.1"); - assertThat(queuryParam.hasQueryParam()).isTrue(); - } - - @Test - void getQueryParam() { - QueuryParam queuryParam = new QueuryParam("GET /index.html?name=kirby&part=backend HTTP/1.1"); - assertThat(queuryParam.getQueryParam("name")).isEqualTo("kirby"); - } -} diff --git a/tomcat/src/test/java/org/apache/coyote/request/QueuyParamTest.java b/tomcat/src/test/java/org/apache/coyote/request/QueuyParamTest.java new file mode 100644 index 0000000000..3b0447e52e --- /dev/null +++ b/tomcat/src/test/java/org/apache/coyote/request/QueuyParamTest.java @@ -0,0 +1,21 @@ +package org.apache.coyote.request; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.catalina.request.QueuyParam; +import org.junit.jupiter.api.Test; + +class QueuyParamTest { + + @Test + void hasQueryParam() { + QueuyParam queuyParam = new QueuyParam("GET /index.html?name=kirby&part=backend HTTP/1.1"); + assertThat(queuyParam.hasQueryParam()).isTrue(); + } + + @Test + void getQueryParam() { + QueuyParam queuyParam = new QueuyParam("GET /index.html?name=kirby&part=backend HTTP/1.1"); + assertThat(queuyParam.getQueryParam("name")).isEqualTo("kirby"); + } +} From cb46cc3ccccf5696d89acf5f2e6cb70078fbe32a Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 21:15:58 +0900 Subject: [PATCH 16/49] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=ED=99=94?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/catalina/request/QueuyParam.java | 12 +++++++----- .../apache/catalina/request/RequestBody.java | 11 ++++++++--- .../apache/catalina/request/RequestHeader.java | 10 ++++++++-- .../apache/catalina/request/RequestLine.java | 18 ++++++++++++------ 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/request/QueuyParam.java b/tomcat/src/main/java/org/apache/catalina/request/QueuyParam.java index 70054f2422..4b27665b13 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/QueuyParam.java +++ b/tomcat/src/main/java/org/apache/catalina/request/QueuyParam.java @@ -6,8 +6,10 @@ public class QueuyParam { public static final String QUERY_INDICATOR = "?"; - public static final String QUERY_COMPONENT_DELIMITER = "&"; - public static final String QUERY_COMPONENT_VALUE_DELIMITER = "="; + public static final String COMPONENT_DELIMITER = "&"; + public static final String COMPONENT_VALUE_DELIMITER = "="; + public static final int KEY_INDEX = 0; + public static final int VALUE_INDEX = 1; private final Map params; @@ -23,12 +25,12 @@ private Map mapQueryParam(String requestLineEntry) { int queryParamIndex = requestLineEntry.indexOf(QUERY_INDICATOR); String queryString = requestLineEntry.substring(queryParamIndex + 1); - String[] splittedQueryString = queryString.split(QUERY_COMPONENT_DELIMITER); + String[] splittedQueryString = queryString.split(COMPONENT_DELIMITER); for (String queryParamEntry : splittedQueryString) { mappedQueryParams.put( - queryParamEntry.split(QUERY_COMPONENT_VALUE_DELIMITER)[0], - queryParamEntry.split(QUERY_COMPONENT_VALUE_DELIMITER)[1] + queryParamEntry.split(COMPONENT_VALUE_DELIMITER)[KEY_INDEX], + queryParamEntry.split(COMPONENT_VALUE_DELIMITER)[VALUE_INDEX] ); } return mappedQueryParams; diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java index ab91e37e97..f97ce75992 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java @@ -5,6 +5,11 @@ public class RequestBody { + public static final String COMPONENT_DELIMITER = "&"; + public static final String COMPONENT_VALUE_DELIMITER = "="; + public static final int KEY_INDEX = 0; + public static final int VALUE_INDEX = 1; + private final Map body; public RequestBody() { @@ -18,10 +23,10 @@ public RequestBody(String bodyLine) { private Map mapBody(String bodyLine) { Map rawBody = new HashMap<>(); - String[] bodyElements = bodyLine.split("&"); + String[] bodyElements = bodyLine.split(COMPONENT_DELIMITER); for (int i = 0; i < bodyElements.length; i++) { - String[] info = bodyElements[i].split("="); - rawBody.put(info[0], info[1]); + String[] info = bodyElements[i].split(COMPONENT_VALUE_DELIMITER); + rawBody.put(info[KEY_INDEX], info[VALUE_INDEX]); } return rawBody; } diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java index 7feb144e6a..ef06837886 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java @@ -8,6 +8,12 @@ public class RequestHeader { + public static final String NAME_VALUE_DELIMITER = ": "; + public static final int NAME_VALUE_COUNT = 2; + public static final int NAME_INDEX = 0; + public static final int VALUE_INDEX = 1; + + private final Map header; private final HttpCookie httpCookie; @@ -27,8 +33,8 @@ private Map mapHeader(List headerLines) { Map rawHeader = new HashMap<>(); for (String line : headerLines) { - String[] headerEntry = line.split(": ", 2); - rawHeader.put(headerEntry[0], headerEntry[1]); + String[] headerEntry = line.split(NAME_VALUE_DELIMITER, NAME_VALUE_COUNT); + rawHeader.put(headerEntry[NAME_INDEX], headerEntry[VALUE_INDEX]); } return rawHeader; } diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java b/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java index 9703ad6952..913136674c 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestLine.java @@ -8,24 +8,30 @@ public class RequestLine { + public static final String COMPONENT_DELIMITER = " "; + public static final String PATH_INDICATOR = "?"; + public static final int METHOD_INDEX = 0; + public static final int PATH_INDEX = 1; + public static final int VERSION_OF_PROTOCOL_INDEX = 2; + private final HttpMethod httpMethod; private final String path; private final String versionOfProtocol; private final QueuyParam queryParams; public RequestLine(String headerLines) { - String[] requestLineEntries = headerLines.split(" "); + String[] requestLineEntries = headerLines.split(COMPONENT_DELIMITER); - this.httpMethod = HttpMethod.valueOf(requestLineEntries[0]); - this.queryParams = new QueuyParam(requestLineEntries[1]); - this.path = mapPath(requestLineEntries[1]); - this.versionOfProtocol = requestLineEntries[2]; + this.httpMethod = HttpMethod.valueOf(requestLineEntries[METHOD_INDEX]); + this.queryParams = new QueuyParam(requestLineEntries[PATH_INDEX]); + this.path = mapPath(requestLineEntries[PATH_INDEX]); + this.versionOfProtocol = requestLineEntries[VERSION_OF_PROTOCOL_INDEX]; } private String mapPath(String path) { if (queryParams.hasQueryParam()) { - int queryStringIndex = path.indexOf("?"); + int queryStringIndex = path.indexOf(PATH_INDICATOR); return path.substring(0, queryStringIndex); } return path; From 9f2d58e79163564d7f2ddbb2f052192a09d718ea Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 21:23:42 +0900 Subject: [PATCH 17/49] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/controller/LoginController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index c2be46d15a..672bc41ae4 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -40,13 +40,17 @@ private void login(HttpResponse response, User user) { @Override protected void doGet(HttpRequest request, HttpResponse response) { - if (request.hasSession() && sessionManager.isSessionExist(request.getSessionId())) { + if (hasLogined(request)) { response.setStatusCode(StatusCode.FOUND); // response.addHeader(HeaderName.LOCATION, "/index.html"); } - if (!request.hasSession() || !sessionManager.isSessionExist(request.getSessionId())) { + if (!hasLogined(request)) { response.setStatusCode(StatusCode.OK); response.setBody("/login.html"); } } + + private boolean hasLogined(HttpRequest request) { + return request.hasSession() && sessionManager.isSessionExist(request.getSessionId()); + } } From 6a82dec8d5d3506834f727f643e87b3f2e5898e5 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 21:28:47 +0900 Subject: [PATCH 18/49] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/controller/LoginController.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index 672bc41ae4..c49a04ee4b 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -22,17 +22,21 @@ protected void doPost(HttpRequest request, HttpResponse response) { String account = request.getBodyParam("account"); String password = request.getBodyParam("password"); Optional user = InMemoryUserRepository.findByAccount(account); - if (user.isEmpty() || !user.get().checkPassword(password)) { + if (!isMember(user, password)) { response.setStatusCode(StatusCode.UNAUTHORIZED); response.setBody("/401.html"); } - if (user.isPresent() && user.get().checkPassword(password)) { + if (isMember(user, password)) { response.setStatusCode(StatusCode.FOUND); response.setBody("/index.html"); login(response, user.get()); } } + private boolean isMember(Optional user, String password) { + return user.isPresent() && user.get().checkPassword(password); + } + private void login(HttpResponse response, User user) { String sessionId = sessionManager.generateSession(user); response.addHeader(HeaderName.SET_COOKIE, "JSESSIONID=" + sessionId); From 467d2f11f7a33d9877a17c33e29baf74985782fe Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Mon, 16 Sep 2024 21:52:09 +0900 Subject: [PATCH 19/49] =?UTF-8?q?refactor:=20=EB=AC=B8=EC=9E=90=EC=97=B4?= =?UTF-8?q?=20=EA=B2=B0=ED=95=A9=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/response/StatusLine.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java index 1b1cac2d9e..90f83d0469 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java +++ b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java @@ -14,13 +14,7 @@ public StatusLine() { } public String getResponse() { - StringBuilder response = new StringBuilder(); - response.append(versionOfProtocol.getValue()) - .append(" ") - .append(statusCode.getCode()) - .append(" ") - .append(statusCode.getMessage()); - return String.valueOf(response); + return "%s %s %s".formatted(versionOfProtocol.getValue(), statusCode.getCode(), statusCode.getMessage()); } public void setStatusCode(StatusCode statusCode) { From 79452b057656b40740eca993dc360fec25819a0c Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 07:51:19 +0900 Subject: [PATCH 20/49] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/connector/RequestReader.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java index 6415b141fb..76f344b09b 100644 --- a/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java +++ b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java @@ -10,38 +10,44 @@ public class RequestReader { - public static HttpRequest readRequest(InputStream inputStream) { + private RequestReader() { + } + + public static HttpRequest readRequest(InputStream inputStream) throws IOException { InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - List headerLines = new ArrayList<>(); String rawLine; - String contentLengthHeader = ""; - try { - while ((rawLine = bufferedReader.readLine()) != null && !rawLine.isEmpty()) { - headerLines.add(rawLine); + String contentLengthHeader = null; - if (rawLine.startsWith("Content-Length")) { - contentLengthHeader = rawLine.split(": ")[1]; - } - } - - String bodyLine = ""; - if (!contentLengthHeader.isEmpty()) { - bodyLine = readBody(bufferedReader, contentLengthHeader); - } + while ((rawLine = bufferedReader.readLine()) != null && !rawLine.isEmpty()) { + headerLines.add(rawLine); + contentLengthHeader = getContentLength(rawLine); + } + String bodyLine = readBody(bufferedReader, contentLengthHeader); - return new HttpRequest(headerLines, bodyLine); + return new HttpRequest(headerLines, bodyLine); + } - } catch (IOException e) { - throw new IllegalStateException("Error reading input stream", e); + private static String getContentLength(String rawLine) { + if (rawLine.toLowerCase().startsWith("content-length:")) { + return rawLine.split(":")[1].trim(); } + return null; } private static String readBody(BufferedReader bufferedReader, String contentLengthHeader) throws IOException { + if (contentLengthHeader == null) { + return ""; + } + if (!contentLengthHeader.matches("\\d+")) { + throw new IllegalArgumentException("Invalid Content-Length header: " + contentLengthHeader); + } int contentLength = Integer.parseInt(contentLengthHeader); + char[] buffer = new char[contentLength]; - bufferedReader.read(buffer, 0, contentLength); // 본문을 버퍼로 읽어들임 - return new String(buffer); // 읽은 버퍼를 문자열로 변환 + bufferedReader.read(buffer, 0, contentLength); + return new String(buffer); } } + From efa49b5510f52c614d81383c7a462b990ed318cf Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 08:33:01 +0900 Subject: [PATCH 21/49] =?UTF-8?q?refactor:=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=EC=BB=A8=ED=85=90=EC=B8=A0=20=EC=B2=98=EB=A6=AC=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=EC=9D=84=20processor=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catalina/controller/StaticController.java | 14 -------------- .../org/apache/catalina/http11/Dispatcher.java | 8 -------- .../apache/coyote/processor/Http11Processor.java | 11 +++++++++-- 3 files changed, 9 insertions(+), 24 deletions(-) delete mode 100644 tomcat/src/main/java/org/apache/catalina/controller/StaticController.java diff --git a/tomcat/src/main/java/org/apache/catalina/controller/StaticController.java b/tomcat/src/main/java/org/apache/catalina/controller/StaticController.java deleted file mode 100644 index 9c132e1b7f..0000000000 --- a/tomcat/src/main/java/org/apache/catalina/controller/StaticController.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.apache.catalina.controller; - -import org.apache.catalina.http.StatusCode; -import org.apache.catalina.response.HttpResponse; -import org.apache.catalina.request.HttpRequest; - -public class StaticController extends AbstractController { - - @Override - protected void doGet(HttpRequest request, HttpResponse response) { - response.setStatusCode(StatusCode.OK); - response.setBody(request.getPath()); - } -} diff --git a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java index 52e95d1256..890eebbed3 100644 --- a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java +++ b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java @@ -6,14 +6,12 @@ import org.apache.catalina.controller.HomeController; import org.apache.catalina.controller.LoginController; import org.apache.catalina.controller.RegisterController; -import org.apache.catalina.controller.StaticController; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; public class Dispatcher { private final Map controllers; - private final Controller staticController; public Dispatcher() { this.controllers = Map.of( @@ -21,7 +19,6 @@ public Dispatcher() { "/register", new RegisterController(), "/", new HomeController() ); - this.staticController = new StaticController(); } public void run(HttpRequest httpRequest, HttpResponse httpResponse) { @@ -30,11 +27,6 @@ public void run(HttpRequest httpRequest, HttpResponse httpResponse) { httpResponse.addHeader(HeaderName.SET_COOKIE, httpRequest.getHttpCookie()); } - if (httpRequest.isStaticRequest()) { - staticController.service(httpRequest, httpResponse); - return; - } - Controller controller = controllers.get(httpRequest.getPath()); controller.service(httpRequest, httpResponse); } diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index a94d62f9c4..909f497e97 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -3,6 +3,7 @@ import com.techcourse.exception.UncheckedServletException; import java.io.IOException; import java.net.Socket; +import org.apache.catalina.http.StatusCode; import org.apache.coyote.Processor; import org.apache.catalina.http11.Dispatcher; import org.apache.catalina.request.HttpRequest; @@ -35,8 +36,14 @@ public void process(final Socket connection) { HttpRequest httpRequest = RequestReader.readRequest(inputStream); HttpResponse httpResponse = new HttpResponse(); - Dispatcher dispatcher = new Dispatcher(); - dispatcher.run(httpRequest, httpResponse); + if (httpRequest.isStaticRequest()) { + httpResponse.setStatusCode(StatusCode.OK); + httpResponse.setBody(httpRequest.getPath()); + } + if (!httpRequest.isStaticRequest()) { + Dispatcher dispatcher = new Dispatcher(); + dispatcher.run(httpRequest, httpResponse); + } outputStream.write(httpResponse.getReponse().getBytes()); outputStream.flush(); From 30371c1722cc6c110cbba1d6992da73bb39d18d6 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 08:35:52 +0900 Subject: [PATCH 22/49] =?UTF-8?q?refactor:=20import=20=EC=88=9C=EC=84=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/controller/HomeController.java | 2 +- .../main/java/org/apache/catalina/request/RequestHeader.java | 2 +- .../java/org/apache/coyote/processor/Http11Processor.java | 4 ++-- tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java | 3 +-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/HomeController.java b/tomcat/src/main/java/org/apache/catalina/controller/HomeController.java index 0f2f1b72ae..51ccda8134 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/HomeController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/HomeController.java @@ -1,8 +1,8 @@ package org.apache.catalina.controller; import org.apache.catalina.http.StatusCode; -import org.apache.catalina.response.HttpResponse; import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; public class HomeController extends AbstractController { diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java index ef06837886..602d05fdb3 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java @@ -3,8 +3,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.catalina.coockie.HttpCookie; import org.apache.catalina.HeaderName; +import org.apache.catalina.coockie.HttpCookie; public class RequestHeader { diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 909f497e97..967e25ed0e 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -4,11 +4,11 @@ import java.io.IOException; import java.net.Socket; import org.apache.catalina.http.StatusCode; -import org.apache.coyote.Processor; import org.apache.catalina.http11.Dispatcher; import org.apache.catalina.request.HttpRequest; -import org.apache.coyote.connector.RequestReader; import org.apache.catalina.response.HttpResponse; +import org.apache.coyote.Processor; +import org.apache.coyote.connector.RequestReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java b/tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java index 15af5a6531..508e3cc910 100644 --- a/tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java +++ b/tomcat/src/main/java/org/apache/coyote/startup/Tomcat.java @@ -1,11 +1,10 @@ package org.apache.coyote.startup; +import java.io.IOException; import org.apache.coyote.connector.Connector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; - public class Tomcat { private static final Logger log = LoggerFactory.getLogger(Tomcat.class); From b00cb3f82c32adbcbbecdbcab899faece4e2ca38 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 08:45:15 +0900 Subject: [PATCH 23/49] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/controller/LoginController.java | 2 +- .../org/apache/catalina/controller/RegisterController.java | 2 +- .../apache/catalina}/exception/UncheckedServletException.java | 4 ++-- .../main/java/org/apache/catalina/{ => http}/HeaderName.java | 2 +- .../java/org/apache/catalina/{ => http}/ProtocolVersion.java | 2 +- .../src/main/java/org/apache/catalina/http11/Dispatcher.java | 2 +- .../main/java/org/apache/catalina/request/RequestHeader.java | 2 +- .../main/java/org/apache/catalina/response/HttpResponse.java | 2 +- .../java/org/apache/catalina/response/ResponseHeader.java | 2 +- .../main/java/org/apache/catalina/response/StatusLine.java | 2 +- .../java/org/apache/coyote/processor/Http11Processor.java | 3 +-- .../java/org/apache/coyote/{ => processor}/Processor.java | 2 +- .../java/org/apache/coyote/response/HttpResponseTest.java | 2 +- .../java/org/apache/coyote/response/ResponseHeaderTest.java | 2 +- 14 files changed, 15 insertions(+), 16 deletions(-) rename tomcat/src/main/java/{com/techcourse => org/apache/catalina}/exception/UncheckedServletException.java (57%) rename tomcat/src/main/java/org/apache/catalina/{ => http}/HeaderName.java (95%) rename tomcat/src/main/java/org/apache/catalina/{ => http}/ProtocolVersion.java (87%) rename tomcat/src/main/java/org/apache/coyote/{ => processor}/Processor.java (96%) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index c49a04ee4b..be4eaf838c 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -3,7 +3,7 @@ import com.techcourse.db.InMemoryUserRepository; import com.techcourse.model.User; import java.util.Optional; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; import org.apache.catalina.manager.SessionManager; import org.apache.catalina.request.HttpRequest; diff --git a/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java b/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java index a9c510b652..eb5fd26f23 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/RegisterController.java @@ -2,7 +2,7 @@ import com.techcourse.db.InMemoryUserRepository; import com.techcourse.model.User; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; diff --git a/tomcat/src/main/java/com/techcourse/exception/UncheckedServletException.java b/tomcat/src/main/java/org/apache/catalina/exception/UncheckedServletException.java similarity index 57% rename from tomcat/src/main/java/com/techcourse/exception/UncheckedServletException.java rename to tomcat/src/main/java/org/apache/catalina/exception/UncheckedServletException.java index 64466b42de..549a48bcb3 100644 --- a/tomcat/src/main/java/com/techcourse/exception/UncheckedServletException.java +++ b/tomcat/src/main/java/org/apache/catalina/exception/UncheckedServletException.java @@ -1,8 +1,8 @@ -package com.techcourse.exception; +package org.apache.catalina.exception; public class UncheckedServletException extends RuntimeException { public UncheckedServletException(Exception e) { - super(e); + super("UncheckedServletException occured", e); } } diff --git a/tomcat/src/main/java/org/apache/catalina/HeaderName.java b/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java similarity index 95% rename from tomcat/src/main/java/org/apache/catalina/HeaderName.java rename to tomcat/src/main/java/org/apache/catalina/http/HeaderName.java index cb87269ad2..1fba9334c2 100644 --- a/tomcat/src/main/java/org/apache/catalina/HeaderName.java +++ b/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java @@ -1,4 +1,4 @@ -package org.apache.catalina; +package org.apache.catalina.http; import java.util.Arrays; diff --git a/tomcat/src/main/java/org/apache/catalina/ProtocolVersion.java b/tomcat/src/main/java/org/apache/catalina/http/ProtocolVersion.java similarity index 87% rename from tomcat/src/main/java/org/apache/catalina/ProtocolVersion.java rename to tomcat/src/main/java/org/apache/catalina/http/ProtocolVersion.java index 146563025a..238be35385 100644 --- a/tomcat/src/main/java/org/apache/catalina/ProtocolVersion.java +++ b/tomcat/src/main/java/org/apache/catalina/http/ProtocolVersion.java @@ -1,4 +1,4 @@ -package org.apache.catalina; +package org.apache.catalina.http; public enum ProtocolVersion { HTTP1_1("HTTP/1.1"), diff --git a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java index 890eebbed3..bf695779d4 100644 --- a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java +++ b/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java @@ -1,7 +1,7 @@ package org.apache.catalina.http11; import java.util.Map; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.controller.Controller; import org.apache.catalina.controller.HomeController; import org.apache.catalina.controller.LoginController; diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java index 602d05fdb3..eaf79d2057 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.coockie.HttpCookie; public class RequestHeader { diff --git a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java index ace904131d..7565e6a588 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java @@ -1,6 +1,6 @@ package org.apache.catalina.response; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; public class HttpResponse { diff --git a/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java index fb3c093c8c..8341f599cf 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java @@ -3,7 +3,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; public class ResponseHeader { diff --git a/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java index 90f83d0469..029ccd60d0 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java +++ b/tomcat/src/main/java/org/apache/catalina/response/StatusLine.java @@ -1,6 +1,6 @@ package org.apache.catalina.response; -import org.apache.catalina.ProtocolVersion; +import org.apache.catalina.http.ProtocolVersion; import org.apache.catalina.http.StatusCode; public class StatusLine { diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 967e25ed0e..d86ecc6274 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -1,13 +1,12 @@ package org.apache.coyote.processor; -import com.techcourse.exception.UncheckedServletException; +import org.apache.catalina.exception.UncheckedServletException; import java.io.IOException; import java.net.Socket; import org.apache.catalina.http.StatusCode; import org.apache.catalina.http11.Dispatcher; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; -import org.apache.coyote.Processor; import org.apache.coyote.connector.RequestReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/tomcat/src/main/java/org/apache/coyote/Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Processor.java similarity index 96% rename from tomcat/src/main/java/org/apache/coyote/Processor.java rename to tomcat/src/main/java/org/apache/coyote/processor/Processor.java index 6604ab83de..6d8113ee09 100644 --- a/tomcat/src/main/java/org/apache/coyote/Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Processor.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.coyote; +package org.apache.coyote.processor; import java.net.Socket; diff --git a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java index 800605f182..cfbfb32693 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; import org.apache.catalina.response.HttpResponse; import org.junit.jupiter.api.Test; diff --git a/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java b/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java index 777a4b6b43..d1688ac1f7 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/ResponseHeaderTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.apache.catalina.HeaderName; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.response.ResponseHeader; import org.junit.jupiter.api.Test; From 5f9029f92504bc18155ce8c0c10f05caa0134dd4 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 08:49:40 +0900 Subject: [PATCH 24/49] =?UTF-8?q?refactor:=20request=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=B1=85=EC=9E=84=EC=9D=84=20processor?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/processor/Http11Processor.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index d86ecc6274..e9de82ffcf 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -1,10 +1,11 @@ package org.apache.coyote.processor; -import org.apache.catalina.exception.UncheckedServletException; import java.io.IOException; import java.net.Socket; +import org.apache.catalina.exception.UncheckedServletException; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; -import org.apache.catalina.http11.Dispatcher; +import org.apache.catalina.http11.ServletContainer; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; import org.apache.coyote.connector.RequestReader; @@ -34,14 +35,15 @@ public void process(final Socket connection) { HttpRequest httpRequest = RequestReader.readRequest(inputStream); HttpResponse httpResponse = new HttpResponse(); + setBasicHeader(httpResponse, httpRequest); if (httpRequest.isStaticRequest()) { httpResponse.setStatusCode(StatusCode.OK); httpResponse.setBody(httpRequest.getPath()); } if (!httpRequest.isStaticRequest()) { - Dispatcher dispatcher = new Dispatcher(); - dispatcher.run(httpRequest, httpResponse); + ServletContainer servletContainer = new ServletContainer(); + servletContainer.run(httpRequest, httpResponse); } outputStream.write(httpResponse.getReponse().getBytes()); @@ -50,4 +52,11 @@ public void process(final Socket connection) { log.error(e.getMessage(), e); } } + + private static void setBasicHeader(HttpResponse httpResponse, HttpRequest httpRequest) { + httpResponse.addHeader(HeaderName.CONTENT_TYPE, httpRequest.getContentType()); + if (httpRequest.hasCookie()) { + httpResponse.addHeader(HeaderName.SET_COOKIE, httpRequest.getHttpCookie()); + } + } } From da88afdd516f681d534a24e85600b93aa22d682e Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 08:50:01 +0900 Subject: [PATCH 25/49] =?UTF-8?q?refactor:=20dispatcher=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=EC=9D=84=20=EC=97=AD=ED=95=A0=EC=97=90=20?= =?UTF-8?q?=EB=A7=9E=EA=B2=8C=20ServletContainer=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dispatcher.java => ServletContainer.java} | 12 +++--------- .../org/apache/coyote/processor/Http11Processor.java | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) rename tomcat/src/main/java/org/apache/catalina/{http11/Dispatcher.java => ServletContainer.java} (69%) diff --git a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java similarity index 69% rename from tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java rename to tomcat/src/main/java/org/apache/catalina/ServletContainer.java index bf695779d4..04a1060dc4 100644 --- a/tomcat/src/main/java/org/apache/catalina/http11/Dispatcher.java +++ b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java @@ -1,7 +1,6 @@ -package org.apache.catalina.http11; +package org.apache.catalina; import java.util.Map; -import org.apache.catalina.http.HeaderName; import org.apache.catalina.controller.Controller; import org.apache.catalina.controller.HomeController; import org.apache.catalina.controller.LoginController; @@ -9,11 +8,11 @@ import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; -public class Dispatcher { +public class ServletContainer { private final Map controllers; - public Dispatcher() { + public ServletContainer() { this.controllers = Map.of( "/login", new LoginController(), "/register", new RegisterController(), @@ -22,11 +21,6 @@ public Dispatcher() { } public void run(HttpRequest httpRequest, HttpResponse httpResponse) { - httpResponse.addHeader(HeaderName.CONTENT_TYPE, httpRequest.getContentType()); - if (httpRequest.hasCookie()) { - httpResponse.addHeader(HeaderName.SET_COOKIE, httpRequest.getHttpCookie()); - } - Controller controller = controllers.get(httpRequest.getPath()); controller.service(httpRequest, httpResponse); } diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index e9de82ffcf..9a42030bef 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -5,7 +5,7 @@ import org.apache.catalina.exception.UncheckedServletException; import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; -import org.apache.catalina.http11.ServletContainer; +import org.apache.catalina.ServletContainer; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; import org.apache.coyote.connector.RequestReader; From a14e45e346a2de1baf2578cdd84ad305ee4496c4 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 09:17:54 +0900 Subject: [PATCH 26/49] =?UTF-8?q?refactor:=20sevletContainer=EA=B0=80=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=20=EC=83=9D=EC=84=B1=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/ServletContainer.java | 17 +++++------------ .../coyote/processor/Http11Processor.java | 4 +++- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/ServletContainer.java b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java index 04a1060dc4..ae74f93aaa 100644 --- a/tomcat/src/main/java/org/apache/catalina/ServletContainer.java +++ b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java @@ -1,27 +1,20 @@ package org.apache.catalina; -import java.util.Map; import org.apache.catalina.controller.Controller; -import org.apache.catalina.controller.HomeController; -import org.apache.catalina.controller.LoginController; -import org.apache.catalina.controller.RegisterController; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; +import org.apache.coyote.processor.ControllerMapper; public class ServletContainer { - private final Map controllers; + private final ControllerMapper controllerMapper; - public ServletContainer() { - this.controllers = Map.of( - "/login", new LoginController(), - "/register", new RegisterController(), - "/", new HomeController() - ); + public ServletContainer(ControllerMapper controllerMapper) { + this.controllerMapper = controllerMapper; } public void run(HttpRequest httpRequest, HttpResponse httpResponse) { - Controller controller = controllers.get(httpRequest.getPath()); + Controller controller = controllerMapper.getController(httpRequest.getPath()); controller.service(httpRequest, httpResponse); } } diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 9a42030bef..3e6a22bd2d 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -17,9 +17,11 @@ public class Http11Processor implements Runnable, Processor { private static final Logger log = LoggerFactory.getLogger(Http11Processor.class); private final Socket connection; + private final ServletContainer servletContainer; public Http11Processor(final Socket connection) { this.connection = connection; + this.servletContainer = new ServletContainer(new ControllerMapper()); } @Override @@ -42,7 +44,7 @@ public void process(final Socket connection) { httpResponse.setBody(httpRequest.getPath()); } if (!httpRequest.isStaticRequest()) { - ServletContainer servletContainer = new ServletContainer(); +// ServletContainer servletContainer = new ServletContainer(); servletContainer.run(httpRequest, httpResponse); } From 065d170023be337a316225ce7bdb2ca2f6502806 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 09:18:07 +0900 Subject: [PATCH 27/49] =?UTF-8?q?refactor:=20body=EA=B0=80=20=EB=B9=88?= =?UTF-8?q?=EA=B0=92=EC=9D=BC=20=EB=95=8C=20=EC=B2=98=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/catalina/request/RequestBody.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java index f97ce75992..0cc54c9b17 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java @@ -21,8 +21,11 @@ public RequestBody(String bodyLine) { } private Map mapBody(String bodyLine) { - Map rawBody = new HashMap<>(); + if (bodyLine == null || bodyLine.isEmpty()) { + return Map.of(); + } + Map rawBody = new HashMap<>(); String[] bodyElements = bodyLine.split(COMPONENT_DELIMITER); for (int i = 0; i < bodyElements.length; i++) { String[] info = bodyElements[i].split(COMPONENT_VALUE_DELIMITER); From 12cbfa34c6eef096e4fd0fb395010e5d67e77094 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 10:02:44 +0900 Subject: [PATCH 28/49] =?UTF-8?q?test:=20=EB=B6=80=EC=A1=B1=ED=95=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../techcourse/db/InMemoryUserRepository.java | 9 +- .../apache/coyote/connector/Connector.java | 2 +- .../coyote/processor/ControllerMapper.java | 24 ++++ .../coyote/processor/Http11Processor.java | 1 - .../controller/AbstractControllerTest.java | 40 ++++++ .../controller/HomeControllerTest.java | 29 +++++ .../controller/LoginControllerTest.java | 115 ++++++++++++++++++ .../controller/RegisterControllerTest.java | 52 ++++++++ .../catalina/controller/TestController.java | 17 +++ .../processor/ControllerMapperTest.java | 22 ++++ 10 files changed, 304 insertions(+), 7 deletions(-) create mode 100644 tomcat/src/main/java/org/apache/coyote/processor/ControllerMapper.java create mode 100644 tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java create mode 100644 tomcat/src/test/java/org/apache/catalina/controller/HomeControllerTest.java create mode 100644 tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java create mode 100644 tomcat/src/test/java/org/apache/catalina/controller/RegisterControllerTest.java create mode 100644 tomcat/src/test/java/org/apache/catalina/controller/TestController.java create mode 100644 tomcat/src/test/java/org/apache/coyote/processor/ControllerMapperTest.java diff --git a/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java b/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java index d3fa57feeb..78926d52d0 100644 --- a/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java +++ b/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java @@ -10,11 +10,6 @@ public class InMemoryUserRepository { private static final Map database = new ConcurrentHashMap<>(); - static { - final User user = new User(1L, "gugu", "password", "hkkang@woowahan.com"); - database.put(user.getAccount(), user); - } - public static void save(User user) { database.put(user.getAccount(), user); } @@ -24,4 +19,8 @@ public static Optional findByAccount(String account) { } private InMemoryUserRepository() {} + + public static void reset() { + database.clear(); + } } diff --git a/tomcat/src/main/java/org/apache/coyote/connector/Connector.java b/tomcat/src/main/java/org/apache/coyote/connector/Connector.java index 9d715716a3..4fc85222a5 100644 --- a/tomcat/src/main/java/org/apache/coyote/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/coyote/connector/Connector.java @@ -14,7 +14,7 @@ public class Connector implements Runnable { private static final Logger log = LoggerFactory.getLogger(Connector.class); - private static final int DEFAULT_PORT = 8080; + private static final int DEFAULT_PORT = 8083; private static final int DEFAULT_ACCEPT_COUNT = 100; private static final int DEFAULT_THREAD_COUNT = 250; diff --git a/tomcat/src/main/java/org/apache/coyote/processor/ControllerMapper.java b/tomcat/src/main/java/org/apache/coyote/processor/ControllerMapper.java new file mode 100644 index 0000000000..5312674743 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/processor/ControllerMapper.java @@ -0,0 +1,24 @@ +package org.apache.coyote.processor; + +import java.util.Map; +import org.apache.catalina.controller.Controller; +import org.apache.catalina.controller.HomeController; +import org.apache.catalina.controller.LoginController; +import org.apache.catalina.controller.RegisterController; + +public class ControllerMapper { + + private final Map controllers; + + public ControllerMapper() { + this.controllers = Map.of( + "/login", new LoginController(), + "/register", new RegisterController(), + "/", new HomeController() + ); + } + + public Controller getController(String path) { + return controllers.get(path); + } +} diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 3e6a22bd2d..f6fda56932 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -44,7 +44,6 @@ public void process(final Socket connection) { httpResponse.setBody(httpRequest.getPath()); } if (!httpRequest.isStaticRequest()) { -// ServletContainer servletContainer = new ServletContainer(); servletContainer.run(httpRequest, httpResponse); } diff --git a/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java b/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java new file mode 100644 index 0000000000..55e19fa3d2 --- /dev/null +++ b/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java @@ -0,0 +1,40 @@ +package org.apache.catalina.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; +import org.junit.jupiter.api.Test; + +class AbstractControllerTest { + + @Test + void doGet() { + // given + AbstractController abstractController = new TestController(); + HttpRequest request = new HttpRequest(List.of("GET / HTTP/1.1"), ""); + HttpResponse response = new HttpResponse(); + + // when + abstractController.service(request, response); + + // then + assertThat(response.getReponse()).contains("Content-Length: 1"); + } + + @Test + void doPost() { + // given + AbstractController abstractController = new TestController(); + HttpRequest request = new HttpRequest(List.of("POST / HTTP/1.1"), ""); + HttpResponse response = new HttpResponse(); + + // when + abstractController.service(request, response); + + // then + assertThat(response.getReponse()).contains("Content-Length: 0"); + } +} diff --git a/tomcat/src/test/java/org/apache/catalina/controller/HomeControllerTest.java b/tomcat/src/test/java/org/apache/catalina/controller/HomeControllerTest.java new file mode 100644 index 0000000000..9d6426c191 --- /dev/null +++ b/tomcat/src/test/java/org/apache/catalina/controller/HomeControllerTest.java @@ -0,0 +1,29 @@ +package org.apache.catalina.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.util.List; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; +import org.junit.jupiter.api.Test; + +class HomeControllerTest { + + @Test + void doGet() { + // given + HomeController homeController = new HomeController(); + HttpRequest request = new HttpRequest(List.of("GET / HTTP/1.1"), ""); + HttpResponse response = new HttpResponse(); + + // when + homeController.doGet(request, response); + + // then + assertAll( + () -> assertThat(response.getReponse()).contains("200 OK"), + () -> assertThat(response.getReponse()).contains("대시보드") + ); + } +} diff --git a/tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java b/tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java new file mode 100644 index 0000000000..f450a88adc --- /dev/null +++ b/tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java @@ -0,0 +1,115 @@ +package org.apache.catalina.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.techcourse.db.InMemoryUserRepository; +import com.techcourse.model.User; +import java.util.List; +import org.apache.catalina.manager.SessionManager; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; +import org.apache.catalina.session.Session; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class LoginControllerTest { + + private final SessionManager sessionManager; + + public LoginControllerTest() { + this.sessionManager = SessionManager.getInstance(); + } + + @BeforeEach + void initializeDatabase() { + InMemoryUserRepository.reset(); + } + + @Test + void doPost_로그인성공() { + // given + LoginController loginController = new LoginController(); + String account = "account"; + String password = "password"; + String email = "email"; + InMemoryUserRepository.save(new User(account, password, email)); + + HttpRequest request = new HttpRequest( + List.of("POST / HTTP/1.1"), + "account=" + account + "&password=" + password + "&email=" + email + ); + HttpResponse response = new HttpResponse(); + + // when + loginController.doPost(request, response); + + // then + assertAll( + () -> assertThat(response.getReponse()).contains("302 FOUND"), + () -> assertThat(response.getReponse()).contains("대시보드") + ); + } + + @Test + void doPost_로그인실패() { + // given + LoginController loginController = new LoginController(); + String account = "account"; + String password = "password"; + String email = "email"; + HttpRequest request = new HttpRequest( + List.of("POST / HTTP/1.1"), + "account=" + account + "&password=" + password + "&email=" + email + ); + HttpResponse response = new HttpResponse(); + + // when + loginController.doPost(request, response); + + // then + assertAll( + () -> assertThat(response.getReponse()).contains("401 UNAUTHORIZED"), + () -> assertThat(response.getReponse()).contains("404 Error - SB Admin") + ); + } + + @Test + void doGet_로그인_안한_상태() { + // given + LoginController loginController = new LoginController(); + HttpRequest request = new HttpRequest(List.of("GET / HTTP/1.1"), ""); + HttpResponse response = new HttpResponse(); + + // when + loginController.doGet(request, response); + + // then + assertAll( + () -> assertThat(response.getReponse()).contains("200 OK"), + () -> assertThat(response.getReponse()).contains("로그인") + ); + } + + @Test + void doGet_로그인_한_상태() { + // given + LoginController loginController = new LoginController(); + Session session = new Session(new User("account", "password", "email")); + sessionManager.add(session); + HttpRequest request = new HttpRequest(List.of( + "GET / HTTP/1.1", + "Cookie: JSESSIONID=" + session.getId() + "; " + ), ""); + HttpResponse response = new HttpResponse(); + + // when + loginController.doGet(request, response); + + // then + assertAll( + () -> assertThat(response.getReponse()).contains("302 FOUND"), + () -> assertThat(response.getReponse()).contains("Location: /index.html") + ); + } +} diff --git a/tomcat/src/test/java/org/apache/catalina/controller/RegisterControllerTest.java b/tomcat/src/test/java/org/apache/catalina/controller/RegisterControllerTest.java new file mode 100644 index 0000000000..86e72076aa --- /dev/null +++ b/tomcat/src/test/java/org/apache/catalina/controller/RegisterControllerTest.java @@ -0,0 +1,52 @@ +package org.apache.catalina.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.util.List; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; +import org.junit.jupiter.api.Test; + +class RegisterControllerTest { + @Test + void doPost() { + // given + RegisterController registerController = new RegisterController(); + String account = "account"; + String password = "password"; + String email = "email"; + + HttpRequest request = new HttpRequest( + List.of("POST / HTTP/1.1"), + "account=" + account + "&password=" + password + "&email=" + email + ); + HttpResponse response = new HttpResponse(); + + // when + registerController.doPost(request, response); + + // then + assertAll( + () -> assertThat(response.getReponse()).contains("302 FOUND"), + () -> assertThat(response.getReponse()).contains("Location: /index.html") + ); + } + + @Test + void doGet() { + // given + RegisterController registerController = new RegisterController(); + HttpRequest request = new HttpRequest(List.of("GET / HTTP/1.1"), ""); + HttpResponse response = new HttpResponse(); + + // when + registerController.doGet(request, response); + + // then + assertAll( + () -> assertThat(response.getReponse()).contains("200 OK"), + () -> assertThat(response.getReponse()).contains("회원가입") + ); + } +} diff --git a/tomcat/src/test/java/org/apache/catalina/controller/TestController.java b/tomcat/src/test/java/org/apache/catalina/controller/TestController.java new file mode 100644 index 0000000000..dea486a4d2 --- /dev/null +++ b/tomcat/src/test/java/org/apache/catalina/controller/TestController.java @@ -0,0 +1,17 @@ +package org.apache.catalina.controller; + +import org.apache.catalina.http.HeaderName; +import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; + +public class TestController extends AbstractController { + @Override + protected void doPost(HttpRequest request, HttpResponse response) { + response.addHeader(HeaderName.CONTENT_LENGTH, "0"); + } + + @Override + protected void doGet(HttpRequest request, HttpResponse response) { + response.addHeader(HeaderName.CONTENT_LENGTH, "1"); + } +} diff --git a/tomcat/src/test/java/org/apache/coyote/processor/ControllerMapperTest.java b/tomcat/src/test/java/org/apache/coyote/processor/ControllerMapperTest.java new file mode 100644 index 0000000000..50dad28f14 --- /dev/null +++ b/tomcat/src/test/java/org/apache/coyote/processor/ControllerMapperTest.java @@ -0,0 +1,22 @@ +package org.apache.coyote.processor; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.apache.catalina.controller.Controller; +import org.apache.catalina.controller.HomeController; +import org.junit.jupiter.api.Test; + +class ControllerMapperTest { + + @Test + void getController() { + // given + ControllerMapper controllerMapper = new ControllerMapper(); + + // when + Controller controller = controllerMapper.getController("/"); + + // then + assertThat(controller.getClass()).isEqualTo(HomeController.class); + } +} From a1c6664521bb72047fcc2931530ba3307964ea2b Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Tue, 17 Sep 2024 11:09:59 +0900 Subject: [PATCH 29/49] =?UTF-8?q?refac=EC=A0=95or:=20=ED=8F=AC=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tomcat/src/main/java/org/apache/coyote/connector/Connector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/coyote/connector/Connector.java b/tomcat/src/main/java/org/apache/coyote/connector/Connector.java index 4fc85222a5..9d715716a3 100644 --- a/tomcat/src/main/java/org/apache/coyote/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/coyote/connector/Connector.java @@ -14,7 +14,7 @@ public class Connector implements Runnable { private static final Logger log = LoggerFactory.getLogger(Connector.class); - private static final int DEFAULT_PORT = 8083; + private static final int DEFAULT_PORT = 8080; private static final int DEFAULT_ACCEPT_COUNT = 100; private static final int DEFAULT_THREAD_COUNT = 250; From 4abdea0c9e5e9ad293482cda12ff107c9faad171 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 21:41:18 +0900 Subject: [PATCH 30/49] =?UTF-8?q?refactor:=20=EC=84=A0=EC=96=B8=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20httpMethod=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EC=9D=B4=20=EB=93=A4=EC=96=B4=EC=99=94=EC=9D=84=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/ServletContainer.java | 2 +- .../apache/catalina/controller/AbstractController.java | 10 +++++++--- .../org/apache/catalina/controller/Controller.java | 2 +- .../org/apache/coyote/processor/Http11Processor.java | 4 ++-- .../catalina/controller/AbstractControllerTest.java | 5 ++--- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/ServletContainer.java b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java index ae74f93aaa..23c6324fa4 100644 --- a/tomcat/src/main/java/org/apache/catalina/ServletContainer.java +++ b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java @@ -13,7 +13,7 @@ public ServletContainer(ControllerMapper controllerMapper) { this.controllerMapper = controllerMapper; } - public void run(HttpRequest httpRequest, HttpResponse httpResponse) { + public void run(HttpRequest httpRequest, HttpResponse httpResponse) throws NoSuchMethodException { Controller controller = controllerMapper.getController(httpRequest.getPath()); controller.service(httpRequest, httpResponse); } diff --git a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java index 039bc0a7e1..9bea62cf62 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java @@ -7,7 +7,7 @@ public abstract class AbstractController implements Controller { @Override - public void service(HttpRequest request, HttpResponse response) { + public void service(HttpRequest request, HttpResponse response) throws NoSuchMethodException { if (request.isMethod(HttpMethod.GET)) { doGet(request, response); return; @@ -19,8 +19,12 @@ public void service(HttpRequest request, HttpResponse response) { throw new IllegalArgumentException("HttpMethod not found"); } - protected void doPost(HttpRequest request, HttpResponse response) { /* NOOP */ } + protected void doPost(HttpRequest request, HttpResponse response) throws NoSuchMethodException { + throw new NoSuchMethodException("HttpMethod not found"); + } - protected void doGet(HttpRequest request, HttpResponse response) { /* NOOP */ } + protected void doGet(HttpRequest request, HttpResponse response) throws NoSuchMethodException { + throw new NoSuchMethodException("HttpMethod not found"); + } } diff --git a/tomcat/src/main/java/org/apache/catalina/controller/Controller.java b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java index d783a17e71..5551abf822 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/Controller.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java @@ -5,5 +5,5 @@ public interface Controller { - void service(HttpRequest request, HttpResponse response); + void service(HttpRequest request, HttpResponse response) throws NoSuchMethodException; } diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index f6fda56932..52d20ba883 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -2,10 +2,10 @@ import java.io.IOException; import java.net.Socket; +import org.apache.catalina.ServletContainer; import org.apache.catalina.exception.UncheckedServletException; import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; -import org.apache.catalina.ServletContainer; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; import org.apache.coyote.connector.RequestReader; @@ -49,7 +49,7 @@ public void process(final Socket connection) { outputStream.write(httpResponse.getReponse().getBytes()); outputStream.flush(); - } catch (IOException | UncheckedServletException e) { + } catch (IOException | UncheckedServletException | NoSuchMethodException e) { log.error(e.getMessage(), e); } } diff --git a/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java b/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java index 55e19fa3d2..1648f7c030 100644 --- a/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java +++ b/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java @@ -1,7 +1,6 @@ package org.apache.catalina.controller; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import java.util.List; import org.apache.catalina.request.HttpRequest; @@ -11,7 +10,7 @@ class AbstractControllerTest { @Test - void doGet() { + void doGet() throws NoSuchMethodException { // given AbstractController abstractController = new TestController(); HttpRequest request = new HttpRequest(List.of("GET / HTTP/1.1"), ""); @@ -25,7 +24,7 @@ void doGet() { } @Test - void doPost() { + void doPost() throws NoSuchMethodException { // given AbstractController abstractController = new TestController(); HttpRequest request = new HttpRequest(List.of("POST / HTTP/1.1"), ""); From 5c8196ed65eec493a4e2e4c63112e8406ab03fdb Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 21:53:39 +0900 Subject: [PATCH 31/49] =?UTF-8?q?refactor:=20=EC=9E=90=EB=8F=99=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=84=A4=EC=A0=95=EB=90=98=EB=8A=94=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EC=BD=94=EB=93=9C=20=EB=A1=9C=EC=A7=81=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/controller/LoginController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index be4eaf838c..b11e03cfb4 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -45,7 +45,6 @@ private void login(HttpResponse response, User user) { @Override protected void doGet(HttpRequest request, HttpResponse response) { if (hasLogined(request)) { - response.setStatusCode(StatusCode.FOUND); // response.addHeader(HeaderName.LOCATION, "/index.html"); } if (!hasLogined(request)) { From 476b3ba5e8ca0e05a1326ad733b2468c0f72f18c Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 21:54:50 +0900 Subject: [PATCH 32/49] =?UTF-8?q?refactor:=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=B6=94=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/catalina/manager/SessionManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java b/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java index 1252cba15b..c0e8ab79c8 100644 --- a/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java +++ b/tomcat/src/main/java/org/apache/catalina/manager/SessionManager.java @@ -1,11 +1,12 @@ package org.apache.catalina.manager; import com.techcourse.model.User; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.catalina.session.Session; public class SessionManager implements Manager { - private static final ConcurrentHashMap SESSIONS = new ConcurrentHashMap<>(); + private static final Map SESSIONS = new ConcurrentHashMap<>(); private static SessionManager instance; private SessionManager() { From c4876a02b991020a0279caeee0cfa5e7077f4fa0 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 22:01:48 +0900 Subject: [PATCH 33/49] =?UTF-8?q?refactor:=20=EA=B3=B5=EB=B0=B1=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/techcourse/db/InMemoryUserRepository.java | 4 ++-- .../main/java/org/apache/catalina/request/RequestHeader.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java b/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java index 78926d52d0..f1c4a0567a 100644 --- a/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java +++ b/tomcat/src/main/java/com/techcourse/db/InMemoryUserRepository.java @@ -10,6 +10,8 @@ public class InMemoryUserRepository { private static final Map database = new ConcurrentHashMap<>(); + private InMemoryUserRepository() {} + public static void save(User user) { database.put(user.getAccount(), user); } @@ -18,8 +20,6 @@ public static Optional findByAccount(String account) { return Optional.ofNullable(database.get(account)); } - private InMemoryUserRepository() {} - public static void reset() { database.clear(); } diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java index eaf79d2057..dc49643d8d 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestHeader.java @@ -13,7 +13,6 @@ public class RequestHeader { public static final int NAME_INDEX = 0; public static final int VALUE_INDEX = 1; - private final Map header; private final HttpCookie httpCookie; From f3cdd17427c1d6bbfbbb90bd17a6a98ff6fdd5cc Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 22:08:44 +0900 Subject: [PATCH 34/49] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/connector/RequestReader.java | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java index 76f344b09b..377d3161df 100644 --- a/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java +++ b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java @@ -14,19 +14,29 @@ private RequestReader() { } public static HttpRequest readRequest(InputStream inputStream) throws IOException { - InputStreamReader inputStreamReader = new InputStreamReader(inputStream); - BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); List headerLines = new ArrayList<>(); + + String contentLengthHeader = readHeader(bufferedReader, headerLines); + String bodyLine = readBody(bufferedReader, contentLengthHeader); + return new HttpRequest(headerLines, bodyLine); + } + + private static String readHeader(BufferedReader bufferedReader, List headerLines) throws IOException { String rawLine; String contentLengthHeader = null; - while ((rawLine = bufferedReader.readLine()) != null && !rawLine.isEmpty()) { headerLines.add(rawLine); contentLengthHeader = getContentLength(rawLine); } - String bodyLine = readBody(bufferedReader, contentLengthHeader); - return new HttpRequest(headerLines, bodyLine); + if (contentLengthHeader == null) { + return ""; + } + if (!contentLengthHeader.matches("\\d+")) { + throw new IllegalArgumentException("Invalid Content-Length header: " + contentLengthHeader); + } + return contentLengthHeader; } private static String getContentLength(String rawLine) { @@ -37,14 +47,7 @@ private static String getContentLength(String rawLine) { } private static String readBody(BufferedReader bufferedReader, String contentLengthHeader) throws IOException { - if (contentLengthHeader == null) { - return ""; - } - if (!contentLengthHeader.matches("\\d+")) { - throw new IllegalArgumentException("Invalid Content-Length header: " + contentLengthHeader); - } int contentLength = Integer.parseInt(contentLengthHeader); - char[] buffer = new char[contentLength]; bufferedReader.read(buffer, 0, contentLength); return new String(buffer); From 36617932b4b172bb167509e5eb78ea74a2a8cb0c Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 22:12:34 +0900 Subject: [PATCH 35/49] =?UTF-8?q?refactor:=20=ED=97=A4=EB=8D=94=EC=97=90?= =?UTF-8?q?=20=EC=84=B8=EC=85=98=20=EC=B6=94=EA=B0=80=20=EC=B1=85=EC=9E=84?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/controller/LoginController.java | 2 +- .../java/org/apache/catalina/response/HttpResponse.java | 4 ++++ .../java/org/apache/catalina/response/ResponseHeader.java | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index b11e03cfb4..7c57232dbe 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -39,7 +39,7 @@ private boolean isMember(Optional user, String password) { private void login(HttpResponse response, User user) { String sessionId = sessionManager.generateSession(user); - response.addHeader(HeaderName.SET_COOKIE, "JSESSIONID=" + sessionId); + response.addSession(sessionId); } @Override diff --git a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java index 7565e6a588..8f6219b0cb 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java @@ -38,4 +38,8 @@ public void setBody(String resource) { body.setBody(resource); header.addHeader(HeaderName.CONTENT_LENGTH, String.valueOf(body.getLength())); } + + public void addSession(String sessionId) { + header.addSession(sessionId); + } } diff --git a/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java index 8341f599cf..05ffde41a7 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java +++ b/tomcat/src/main/java/org/apache/catalina/response/ResponseHeader.java @@ -7,6 +7,8 @@ public class ResponseHeader { + public static final String SESSION_KEY = "JSESSIONID"; + public static final String SESSION_DELIMITER = "="; private final Map header; public ResponseHeader() { @@ -28,4 +30,8 @@ public String getResponse() { } return String.valueOf(response); } + + public void addSession(String sessionId) { + addHeader(HeaderName.SET_COOKIE, SESSION_KEY + SESSION_DELIMITER + sessionId); + } } From ab53d08f658645b00cd75f2b43df8649b15fd99b Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 22:15:21 +0900 Subject: [PATCH 36/49] =?UTF-8?q?refactor:=20=EB=B0=94=EB=94=94=EC=9D=98?= =?UTF-8?q?=20parameter=20=EC=98=88=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/apache/catalina/request/RequestBody.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java index 0cc54c9b17..2542050c33 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java @@ -35,6 +35,9 @@ private Map mapBody(String bodyLine) { } public String get(String key) { + if (!body.containsKey(key)) { + throw new IllegalArgumentException("Body parameter not found"); + } return body.get(key); } } From 73a926c30125625c35d7d229f67949da32ca8e97 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 22:18:39 +0900 Subject: [PATCH 37/49] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=ED=99=94?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/coockie/HttpCookie.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java index 5c933498f7..8cdbd98ca0 100644 --- a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java @@ -6,9 +6,12 @@ public class HttpCookie { - private static final String JSESSIONID_VALUE = "JSESSIONID"; public static final String COOKIE_DELIMITER = "; "; public static final String COOKIE_VALUE_DELIMITER = "="; + public static final int KEY_INDEX = 0; + public static final int VALUE_INDEX = 1; + public static final int KEY_VALUE_COUNT = 2; + private static final String JSESSIONID_VALUE = "JSESSIONID"; private final Map cookies; @@ -29,8 +32,8 @@ private static Map mapCookies(String rawCookies) { String[] cookiesElements = rawCookies.split(COOKIE_DELIMITER); for (String cookiesElement : cookiesElements) { String[] cookiePair = cookiesElement.split(COOKIE_VALUE_DELIMITER); - if (cookiePair.length == 2) { - cookieGroup.put(cookiePair[0], cookiePair[1]); + if (cookiePair.length == KEY_VALUE_COUNT) { + cookieGroup.put(cookiePair[KEY_INDEX], cookiePair[VALUE_INDEX]); } } return cookieGroup; From d37c00fdc362327f69ea3ddb834de00837695802 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 22:50:00 +0900 Subject: [PATCH 38/49] =?UTF-8?q?refactor:=20post=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coyote/connector/RequestReader.java | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java index 377d3161df..7ade67b6a5 100644 --- a/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java +++ b/tomcat/src/main/java/org/apache/coyote/connector/RequestReader.java @@ -27,26 +27,17 @@ private static String readHeader(BufferedReader bufferedReader, List hea String contentLengthHeader = null; while ((rawLine = bufferedReader.readLine()) != null && !rawLine.isEmpty()) { headerLines.add(rawLine); - contentLengthHeader = getContentLength(rawLine); - } - - if (contentLengthHeader == null) { - return ""; - } - if (!contentLengthHeader.matches("\\d+")) { - throw new IllegalArgumentException("Invalid Content-Length header: " + contentLengthHeader); + if (rawLine.startsWith("Content-Length")) { + contentLengthHeader = rawLine.split(": ")[1]; + } } return contentLengthHeader; } - private static String getContentLength(String rawLine) { - if (rawLine.toLowerCase().startsWith("content-length:")) { - return rawLine.split(":")[1].trim(); - } - return null; - } - private static String readBody(BufferedReader bufferedReader, String contentLengthHeader) throws IOException { + if (contentLengthHeader == null) { + return ""; + } int contentLength = Integer.parseInt(contentLengthHeader); char[] buffer = new char[contentLength]; bufferedReader.read(buffer, 0, contentLength); From 125313291bde5ec43fe50325f445da5c3eef959b Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Thu, 19 Sep 2024 22:55:11 +0900 Subject: [PATCH 39/49] =?UTF-8?q?refactor:=20=EB=A6=AC=EB=8B=A4=EC=9D=B4?= =?UTF-8?q?=EB=A0=89=EC=85=98=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/controller/LoginController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index 7c57232dbe..0ec6bd9614 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -28,7 +28,7 @@ protected void doPost(HttpRequest request, HttpResponse response) { } if (isMember(user, password)) { response.setStatusCode(StatusCode.FOUND); - response.setBody("/index.html"); + response.addHeader(HeaderName.LOCATION, "/index.html"); login(response, user.get()); } } @@ -45,6 +45,7 @@ private void login(HttpResponse response, User user) { @Override protected void doGet(HttpRequest request, HttpResponse response) { if (hasLogined(request)) { + response.setStatusCode(StatusCode.FOUND); response.addHeader(HeaderName.LOCATION, "/index.html"); } if (!hasLogined(request)) { From 026883b0bb2660cd5e4539ce88efe86b9eccc06b Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 20 Sep 2024 19:29:44 +0900 Subject: [PATCH 40/49] =?UTF-8?q?refactor:=20unchecked=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/ServletContainer.java | 2 +- .../apache/catalina/controller/AbstractController.java | 10 +++++----- .../org/apache/catalina/controller/Controller.java | 4 ++-- .../org/apache/coyote/processor/Http11Processor.java | 2 +- .../catalina/controller/AbstractControllerTest.java | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/ServletContainer.java b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java index 23c6324fa4..ae74f93aaa 100644 --- a/tomcat/src/main/java/org/apache/catalina/ServletContainer.java +++ b/tomcat/src/main/java/org/apache/catalina/ServletContainer.java @@ -13,7 +13,7 @@ public ServletContainer(ControllerMapper controllerMapper) { this.controllerMapper = controllerMapper; } - public void run(HttpRequest httpRequest, HttpResponse httpResponse) throws NoSuchMethodException { + public void run(HttpRequest httpRequest, HttpResponse httpResponse) { Controller controller = controllerMapper.getController(httpRequest.getPath()); controller.service(httpRequest, httpResponse); } diff --git a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java index 9bea62cf62..4b55259a8f 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java @@ -7,7 +7,7 @@ public abstract class AbstractController implements Controller { @Override - public void service(HttpRequest request, HttpResponse response) throws NoSuchMethodException { + public void service(HttpRequest request, HttpResponse response) { if (request.isMethod(HttpMethod.GET)) { doGet(request, response); return; @@ -19,12 +19,12 @@ public void service(HttpRequest request, HttpResponse response) throws NoSuchMet throw new IllegalArgumentException("HttpMethod not found"); } - protected void doPost(HttpRequest request, HttpResponse response) throws NoSuchMethodException { - throw new NoSuchMethodException("HttpMethod not found"); + protected void doPost(HttpRequest request, HttpResponse response) { + throw new UnsupportedOperationException("HttpMethod unsupported"); } - protected void doGet(HttpRequest request, HttpResponse response) throws NoSuchMethodException { - throw new NoSuchMethodException("HttpMethod not found"); + protected void doGet(HttpRequest request, HttpResponse response) { + throw new UnsupportedOperationException("HttpMethod unsupported"); } } diff --git a/tomcat/src/main/java/org/apache/catalina/controller/Controller.java b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java index 5551abf822..7ca917421c 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/Controller.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/Controller.java @@ -1,9 +1,9 @@ package org.apache.catalina.controller; -import org.apache.catalina.response.HttpResponse; import org.apache.catalina.request.HttpRequest; +import org.apache.catalina.response.HttpResponse; public interface Controller { - void service(HttpRequest request, HttpResponse response) throws NoSuchMethodException; + void service(HttpRequest request, HttpResponse response); } diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 52d20ba883..97dea823c8 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -49,7 +49,7 @@ public void process(final Socket connection) { outputStream.write(httpResponse.getReponse().getBytes()); outputStream.flush(); - } catch (IOException | UncheckedServletException | NoSuchMethodException e) { + } catch (IOException | UncheckedServletException e) { log.error(e.getMessage(), e); } } diff --git a/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java b/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java index 1648f7c030..712280fd27 100644 --- a/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java +++ b/tomcat/src/test/java/org/apache/catalina/controller/AbstractControllerTest.java @@ -10,7 +10,7 @@ class AbstractControllerTest { @Test - void doGet() throws NoSuchMethodException { + void doGet() { // given AbstractController abstractController = new TestController(); HttpRequest request = new HttpRequest(List.of("GET / HTTP/1.1"), ""); @@ -24,7 +24,7 @@ void doGet() throws NoSuchMethodException { } @Test - void doPost() throws NoSuchMethodException { + void doPost() { // given AbstractController abstractController = new TestController(); HttpRequest request = new HttpRequest(List.of("POST / HTTP/1.1"), ""); From ca007e7043fbd7fd01095d0283b0eab8dd0545ec Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 20 Sep 2024 19:36:23 +0900 Subject: [PATCH 41/49] =?UTF-8?q?refactor:=20redirection=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/catalina/controller/LoginController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java index 0ec6bd9614..6ee925abcd 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/LoginController.java @@ -23,8 +23,9 @@ protected void doPost(HttpRequest request, HttpResponse response) { String password = request.getBodyParam("password"); Optional user = InMemoryUserRepository.findByAccount(account); if (!isMember(user, password)) { - response.setStatusCode(StatusCode.UNAUTHORIZED); - response.setBody("/401.html"); + response.setStatusCode(StatusCode.FOUND); + response.addHeader(HeaderName.LOCATION, "/401.html"); + } if (isMember(user, password)) { response.setStatusCode(StatusCode.FOUND); From 35480686d11be06e2a1fc2a789b87e67bdf5c02a Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 20 Sep 2024 19:43:13 +0900 Subject: [PATCH 42/49] =?UTF-8?q?refactor:=20redirection=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/controller/LoginControllerTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java b/tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java index f450a88adc..950cb015a0 100644 --- a/tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java +++ b/tomcat/src/test/java/org/apache/catalina/controller/LoginControllerTest.java @@ -47,7 +47,7 @@ void initializeDatabase() { // then assertAll( () -> assertThat(response.getReponse()).contains("302 FOUND"), - () -> assertThat(response.getReponse()).contains("대시보드") + () -> assertThat(response.getReponse()).contains("Location: /index.html") ); } @@ -69,8 +69,8 @@ void initializeDatabase() { // then assertAll( - () -> assertThat(response.getReponse()).contains("401 UNAUTHORIZED"), - () -> assertThat(response.getReponse()).contains("404 Error - SB Admin") + () -> assertThat(response.getReponse()).contains("302 FOUND"), + () -> assertThat(response.getReponse()).contains("Location: /401.html") ); } From a4b2479235223d0a77866a6ccdb381f9086fceee Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 20 Sep 2024 19:43:29 +0900 Subject: [PATCH 43/49] =?UTF-8?q?refactor:=20stream=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/coockie/HttpCookie.java | 15 ++++++--------- .../org/apache/catalina/request/RequestBody.java | 14 +++++++------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java index 8cdbd98ca0..1532757c62 100644 --- a/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java +++ b/tomcat/src/main/java/org/apache/catalina/coockie/HttpCookie.java @@ -1,8 +1,10 @@ package org.apache.catalina.coockie; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.stream.Collectors; public class HttpCookie { @@ -28,15 +30,10 @@ private static Map mapCookies(String rawCookies) { return Map.of(); } - Map cookieGroup = new HashMap<>(); - String[] cookiesElements = rawCookies.split(COOKIE_DELIMITER); - for (String cookiesElement : cookiesElements) { - String[] cookiePair = cookiesElement.split(COOKIE_VALUE_DELIMITER); - if (cookiePair.length == KEY_VALUE_COUNT) { - cookieGroup.put(cookiePair[KEY_INDEX], cookiePair[VALUE_INDEX]); - } - } - return cookieGroup; + return Arrays.stream(rawCookies.split(COOKIE_DELIMITER)) + .map(cookie -> cookie.split(COOKIE_VALUE_DELIMITER)) + .filter(cookiePair -> cookiePair.length == KEY_VALUE_COUNT) + .collect(Collectors.toMap(cookiePair -> cookiePair[KEY_INDEX], cookiePair -> cookiePair[VALUE_INDEX])); } public boolean hasSessionId() { diff --git a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java index 2542050c33..59d5312027 100644 --- a/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java +++ b/tomcat/src/main/java/org/apache/catalina/request/RequestBody.java @@ -1,7 +1,9 @@ package org.apache.catalina.request; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.stream.Collectors; public class RequestBody { @@ -25,13 +27,11 @@ private Map mapBody(String bodyLine) { return Map.of(); } - Map rawBody = new HashMap<>(); - String[] bodyElements = bodyLine.split(COMPONENT_DELIMITER); - for (int i = 0; i < bodyElements.length; i++) { - String[] info = bodyElements[i].split(COMPONENT_VALUE_DELIMITER); - rawBody.put(info[KEY_INDEX], info[VALUE_INDEX]); - } - return rawBody; + return Arrays.stream(bodyLine.split(COMPONENT_DELIMITER)) + .map(bodyElement -> bodyElement.split(COMPONENT_VALUE_DELIMITER)) + .filter(bodyElements -> bodyElements.length == 2) + .collect(Collectors.toMap(bodyElements -> bodyElements[KEY_INDEX], + bodyElements -> bodyElements[VALUE_INDEX])); } public String get(String key) { From 1399174d65d2bf5917d77fbc92e68fca0e3de17b Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 20 Sep 2024 20:21:46 +0900 Subject: [PATCH 44/49] =?UTF-8?q?refactor:=20=EC=98=88=EC=99=B8=EC=9D=B8?= =?UTF-8?q?=20=EA=B2=BD=EC=9A=B0=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=A6=AC?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EB=A0=89=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AbstractController.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java index 4b55259a8f..fc99718cf4 100644 --- a/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java +++ b/tomcat/src/main/java/org/apache/catalina/controller/AbstractController.java @@ -1,6 +1,8 @@ package org.apache.catalina.controller; +import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.HttpMethod; +import org.apache.catalina.http.StatusCode; import org.apache.catalina.request.HttpRequest; import org.apache.catalina.response.HttpResponse; @@ -8,23 +10,28 @@ public abstract class AbstractController implements Controller { @Override public void service(HttpRequest request, HttpResponse response) { - if (request.isMethod(HttpMethod.GET)) { - doGet(request, response); - return; + try { + if (request.isMethod(HttpMethod.GET)) { + doGet(request, response); + return; + } + if (request.isMethod(HttpMethod.POST)) { + doPost(request, response); + return; + } + throw new IllegalArgumentException("HttpMethod not found"); + } catch (IllegalArgumentException e) { + response.setStatusCode(StatusCode.FOUND); + response.addHeader(HeaderName.LOCATION, "/500.html"); } - if (request.isMethod(HttpMethod.POST)) { - doPost(request, response); - return; - } - throw new IllegalArgumentException("HttpMethod not found"); } protected void doPost(HttpRequest request, HttpResponse response) { - throw new UnsupportedOperationException("HttpMethod unsupported"); + throw new IllegalArgumentException("HttpMethod unsupported"); } protected void doGet(HttpRequest request, HttpResponse response) { - throw new UnsupportedOperationException("HttpMethod unsupported"); + throw new IllegalArgumentException("HttpMethod unsupported"); } } From fc50aae1fc840b51571f330bfed2f7270aae070f Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 20 Sep 2024 20:41:22 +0900 Subject: [PATCH 45/49] =?UTF-8?q?test:=20body=EC=9D=98=20content=20length?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=86=8D=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/org/apache/coyote/response/HttpResponseTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java index cfbfb32693..413c6d4fa0 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java @@ -44,5 +44,6 @@ class HttpResponseTest { // then assertThat(response.getReponse()).contains("대시보드"); + assertThat(response.getReponse()).contains("Content-Length: 5624"); } } From 310a6b82b4912c5c8ace735403dc750c7338a9d8 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Fri, 20 Sep 2024 21:51:52 +0900 Subject: [PATCH 46/49] =?UTF-8?q?refactor:=20content=20type=20=EC=A7=80?= =?UTF-8?q?=EC=A0=95=20=EC=B1=85=EC=9E=84=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/apache/catalina/http/HeaderName.java | 9 --------- .../apache/catalina/response/HttpResponse.java | 16 ++++++++++++++++ .../apache/coyote/processor/Http11Processor.java | 4 ++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java b/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java index 1fba9334c2..fec3ad723c 100644 --- a/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java +++ b/tomcat/src/main/java/org/apache/catalina/http/HeaderName.java @@ -1,7 +1,5 @@ package org.apache.catalina.http; -import java.util.Arrays; - public enum HeaderName { CONTENT_LENGTH("Content-Length"), COOKIE("Cookie"), @@ -17,13 +15,6 @@ public enum HeaderName { this.value = value; } - public static HeaderName findByName(String name) { - return Arrays.stream(values()) - .filter(headerName -> headerName.value.equals(name)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException("HeaderName not found")); - } - public String getValue() { return value; } diff --git a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java index 8f6219b0cb..6dbd62aba2 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/catalina/response/HttpResponse.java @@ -1,5 +1,8 @@ package org.apache.catalina.response; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import org.apache.catalina.http.HeaderName; import org.apache.catalina.http.StatusCode; @@ -34,9 +37,22 @@ public void addHeader(HeaderName headerName, String value) { header.addHeader(headerName, value); } + public void setBody(String path, String contentType) { + body.setBody(path); + header.addHeader(HeaderName.CONTENT_LENGTH, String.valueOf(body.getLength())); + header.addHeader(HeaderName.CONTENT_TYPE, contentType); + } + public void setBody(String resource) { body.setBody(resource); header.addHeader(HeaderName.CONTENT_LENGTH, String.valueOf(body.getLength())); + String contentType; + try { + contentType = Files.probeContentType(new File(resource).toPath()); + } catch (IOException e) { + throw new IllegalArgumentException("Not found path"); + } + header.addHeader(HeaderName.CONTENT_TYPE, contentType); } public void addSession(String sessionId) { diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 97dea823c8..80ea78510e 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -40,8 +40,9 @@ public void process(final Socket connection) { setBasicHeader(httpResponse, httpRequest); if (httpRequest.isStaticRequest()) { + httpResponse.addHeader(HeaderName.CONTENT_TYPE, httpRequest.getContentType()); httpResponse.setStatusCode(StatusCode.OK); - httpResponse.setBody(httpRequest.getPath()); + httpResponse.setBody(httpRequest.getPath(), httpRequest.getContentType()); } if (!httpRequest.isStaticRequest()) { servletContainer.run(httpRequest, httpResponse); @@ -55,7 +56,6 @@ public void process(final Socket connection) { } private static void setBasicHeader(HttpResponse httpResponse, HttpRequest httpRequest) { - httpResponse.addHeader(HeaderName.CONTENT_TYPE, httpRequest.getContentType()); if (httpRequest.hasCookie()) { httpResponse.addHeader(HeaderName.SET_COOKIE, httpRequest.getHttpCookie()); } From 0d76ecae265369c8edf221aff94004af693dc1a3 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Sat, 21 Sep 2024 10:29:36 +0900 Subject: [PATCH 47/49] =?UTF-8?q?fix:=20content=20length=EB=A5=BC=20byte?= =?UTF-8?q?=20=EB=8B=A8=EC=9C=84=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/apache/catalina/response/ResponseBody.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tomcat/src/main/java/org/apache/catalina/response/ResponseBody.java b/tomcat/src/main/java/org/apache/catalina/response/ResponseBody.java index a805d1815d..9834397160 100644 --- a/tomcat/src/main/java/org/apache/catalina/response/ResponseBody.java +++ b/tomcat/src/main/java/org/apache/catalina/response/ResponseBody.java @@ -1,6 +1,7 @@ package org.apache.catalina.response; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -32,7 +33,7 @@ public void setBody(String resource) { } public int getLength() { - return content.length(); + return content.getBytes(StandardCharsets.UTF_8).length; } public String getContent() { From 5dd2132c2c2f13da7b841708a7ca22c72db690b0 Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Sat, 21 Sep 2024 10:30:04 +0900 Subject: [PATCH 48/49] =?UTF-8?q?fix:=20=EC=BF=A0=ED=82=A4=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=82=BD=EC=9E=85=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/apache/coyote/processor/Http11Processor.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java index 80ea78510e..8b22a4463d 100644 --- a/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/processor/Http11Processor.java @@ -37,7 +37,6 @@ public void process(final Socket connection) { HttpRequest httpRequest = RequestReader.readRequest(inputStream); HttpResponse httpResponse = new HttpResponse(); - setBasicHeader(httpResponse, httpRequest); if (httpRequest.isStaticRequest()) { httpResponse.addHeader(HeaderName.CONTENT_TYPE, httpRequest.getContentType()); @@ -54,10 +53,4 @@ public void process(final Socket connection) { log.error(e.getMessage(), e); } } - - private static void setBasicHeader(HttpResponse httpResponse, HttpRequest httpRequest) { - if (httpRequest.hasCookie()) { - httpResponse.addHeader(HeaderName.SET_COOKIE, httpRequest.getHttpCookie()); - } - } } From 2b4b5ed660c7e22a8305f90df6c60893051dc2af Mon Sep 17 00:00:00 2001 From: hyeonjilee Date: Sat, 21 Sep 2024 10:34:27 +0900 Subject: [PATCH 49/49] =?UTF-8?q?test:=20content=20length=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/org/apache/coyote/response/HttpResponseTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java index 413c6d4fa0..b768f3c6d2 100644 --- a/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java +++ b/tomcat/src/test/java/org/apache/coyote/response/HttpResponseTest.java @@ -44,6 +44,6 @@ class HttpResponseTest { // then assertThat(response.getReponse()).contains("대시보드"); - assertThat(response.getReponse()).contains("Content-Length: 5624"); + assertThat(response.getReponse()).contains("Content-Length: 5670"); } }