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); + } +}