From e2fd801e232e10dcc9c8df4fcb9511cca2c8fb25 Mon Sep 17 00:00:00 2001 From: jeonghoon Date: Sat, 9 Sep 2023 22:53:47 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=A7=80=EC=9B=90=20=ED=95=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=98=88?= =?UTF-8?q?=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 --- .../coyote/controller/AbstractController.java | 26 ++++++++++++ .../apache/coyote/controller/Controller.java | 9 +++++ .../UnsupportedRequestMethodException.java | 8 ++++ .../controller/AbstractControllerTest.java | 40 +++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 tomcat/src/main/java/org/apache/coyote/controller/AbstractController.java create mode 100644 tomcat/src/main/java/org/apache/coyote/controller/Controller.java create mode 100644 tomcat/src/main/java/org/apache/coyote/controller/exception/UnsupportedRequestMethodException.java create mode 100644 tomcat/src/test/java/org/apache/coyote/controller/AbstractControllerTest.java diff --git a/tomcat/src/main/java/org/apache/coyote/controller/AbstractController.java b/tomcat/src/main/java/org/apache/coyote/controller/AbstractController.java new file mode 100644 index 0000000000..bc5424fb88 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/controller/AbstractController.java @@ -0,0 +1,26 @@ +package org.apache.coyote.controller; + +import org.apache.coyote.controller.exception.UnsupportedRequestMethodException; +import org.apache.coyote.httprequest.HttpRequest; +import org.apache.coyote.httprequest.RequestMethod; +import org.apache.coyote.httpresponse.HttpResponse; + +public abstract class AbstractController implements Controller { + + @Override + public void service(final HttpRequest httpRequest, final HttpResponse httpResponse) { + if (httpRequest.isSameRequestMethod(RequestMethod.GET)) { + doGet(httpRequest, httpResponse); + return; + } + if (httpRequest.isSameRequestMethod(RequestMethod.POST)) { + doPost(httpRequest, httpResponse); + return; + } + throw new UnsupportedRequestMethodException(); + } + + protected abstract void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse); + + protected abstract void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse); +} diff --git a/tomcat/src/main/java/org/apache/coyote/controller/Controller.java b/tomcat/src/main/java/org/apache/coyote/controller/Controller.java new file mode 100644 index 0000000000..321696ac06 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/controller/Controller.java @@ -0,0 +1,9 @@ +package org.apache.coyote.controller; + +import org.apache.coyote.httprequest.HttpRequest; +import org.apache.coyote.httpresponse.HttpResponse; + +public interface Controller { + + void service(final HttpRequest httpRequest, final HttpResponse httpResponse); +} diff --git a/tomcat/src/main/java/org/apache/coyote/controller/exception/UnsupportedRequestMethodException.java b/tomcat/src/main/java/org/apache/coyote/controller/exception/UnsupportedRequestMethodException.java new file mode 100644 index 0000000000..30b02f9369 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/controller/exception/UnsupportedRequestMethodException.java @@ -0,0 +1,8 @@ +package org.apache.coyote.controller.exception; + +public class UnsupportedRequestMethodException extends IllegalArgumentException { + + public UnsupportedRequestMethodException() { + super("지원하지 않는 Request Method 입니다."); + } +} diff --git a/tomcat/src/test/java/org/apache/coyote/controller/AbstractControllerTest.java b/tomcat/src/test/java/org/apache/coyote/controller/AbstractControllerTest.java new file mode 100644 index 0000000000..d85a33460d --- /dev/null +++ b/tomcat/src/test/java/org/apache/coyote/controller/AbstractControllerTest.java @@ -0,0 +1,40 @@ +package org.apache.coyote.controller; + +import org.apache.coyote.controller.exception.UnsupportedRequestMethodException; +import org.apache.coyote.httprequest.HttpRequest; +import org.apache.coyote.httpresponse.HttpResponse; +import org.apache.coyote.httpresponse.handler.HandlerTestSupport; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +@SuppressWarnings("NonAsciiCharacters") +class AbstractControllerTest extends HandlerTestSupport { + + @Test + void 지원하지_않는_메소드에_대해_예외를_터트린다() { + // given + final String input = String.join("\r\n", + "DELETE /login HTTP/1.1", + "Host: localhost:8080", + "Connection: keep-alive", + "Accept: */*"); + final HttpRequest httpRequest = super.makeHttpRequest(input); + final HttpResponse httpResponse = HttpResponse.init(httpRequest.getHttpVersion()); + + // when + final AbstractController abstractController = new AbstractController() { + @Override + protected void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse) { + } + + @Override + protected void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse) { + } + }; + + // then + assertThatThrownBy(() -> abstractController.service(httpRequest, httpResponse)) + .isInstanceOf(UnsupportedRequestMethodException.class); + } +}