diff --git a/tomcat/src/main/java/nextstep/jwp/controller/AbstractController.java b/tomcat/src/main/java/nextstep/jwp/controller/AbstractController.java new file mode 100644 index 0000000000..f548ea69da --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/AbstractController.java @@ -0,0 +1,27 @@ +package nextstep.jwp.controller; + +import nextstep.jwp.handle.ViewResolver; +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.common.HttpStatus; +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public abstract class AbstractController implements Controller { + + @Override + public void service(final HttpRequest request, final HttpResponse response) throws Exception { + if (request.getHttpMethod() == HttpMethod.GET) { + doGet(request, response); + return; + } + if (request.getHttpMethod() == HttpMethod.POST) { + doPost(request, response); + return; + } + ViewResolver.renderPage(response, HttpStatus.NOT_FOUND, "404.html"); + } + + protected abstract void doPost(final HttpRequest request, final HttpResponse response) throws Exception; + + protected abstract void doGet(final HttpRequest request, final HttpResponse response) throws Exception; +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/Controller.java b/tomcat/src/main/java/nextstep/jwp/controller/Controller.java new file mode 100644 index 0000000000..bbd63f9e2e --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/Controller.java @@ -0,0 +1,9 @@ +package nextstep.jwp.controller; + +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public interface Controller { + + void service(final HttpRequest request, final HttpResponse response) throws Exception; +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/FileController.java b/tomcat/src/main/java/nextstep/jwp/controller/FileController.java new file mode 100644 index 0000000000..7e3087c459 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/FileController.java @@ -0,0 +1,27 @@ +package nextstep.jwp.controller; + +import nextstep.jwp.handle.ViewResolver; +import org.apache.coyote.common.HttpStatus; +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public class FileController extends AbstractController { + + private static final FileController fileController = new FileController(); + + private FileController() { + } + + public static FileController getInstance() { + return fileController; + } + + @Override + public void doGet(final HttpRequest request, final HttpResponse response) throws Exception { + ViewResolver.renderPage(response, HttpStatus.OK, request.getUriPath().substring(1)); + } + + @Override + public void doPost(final HttpRequest request, final HttpResponse response) throws Exception { + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/controller/HelloWorldController.java b/tomcat/src/main/java/nextstep/jwp/controller/HelloWorldController.java new file mode 100644 index 0000000000..31287ffc44 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/controller/HelloWorldController.java @@ -0,0 +1,30 @@ +package nextstep.jwp.controller; + +import org.apache.coyote.common.ContentType; +import org.apache.coyote.common.HttpStatus; +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public class HelloWorldController extends AbstractController { + + private static final String BODY = "Hello world!"; + private static final HelloWorldController helloWorldController = new HelloWorldController(); + + private HelloWorldController() { + } + + public static HelloWorldController getInstance() { + return helloWorldController; + } + + @Override + public void doGet(final HttpRequest request, final HttpResponse response) throws Exception { + response.setStatus(HttpStatus.OK); + response.setContentType(ContentType.TEXT_HTML.getType()); + response.setContent(BODY); + } + + @Override + public void doPost(final HttpRequest request, final HttpResponse response) throws Exception { + } +} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/handler/LoginHandler.java b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java similarity index 57% rename from tomcat/src/main/java/org/apache/coyote/handle/handler/LoginHandler.java rename to tomcat/src/main/java/nextstep/jwp/controller/LoginController.java index 8707f9b7f3..74ce45c301 100644 --- a/tomcat/src/main/java/org/apache/coyote/handle/handler/LoginHandler.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/LoginController.java @@ -1,11 +1,11 @@ -package org.apache.coyote.handle.handler; +package nextstep.jwp.controller; import java.io.File; -import java.io.IOException; import java.util.Map; import java.util.Optional; import java.util.UUID; import nextstep.jwp.db.InMemoryUserRepository; +import nextstep.jwp.handle.ViewResolver; import nextstep.jwp.model.User; import org.apache.coyote.common.ContentType; import org.apache.coyote.common.HttpStatus; @@ -17,9 +17,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class LoginHandler implements Handler { +public class LoginController extends AbstractController { - private static final Logger log = LoggerFactory.getLogger(LoginHandler.class); + private static final Logger log = LoggerFactory.getLogger(LoginController.class); private static final String SLASH = File.separator; private static final String LOGIN_PAGE = "login.html"; private static final String LOGIN_SUCCESS_PAGE = "index.html"; @@ -27,47 +27,55 @@ public class LoginHandler implements Handler { private static final String ACCOUNT = "account"; private static final String PASSWORD = "password"; private static final String JSESSIONID = "JSESSIONID"; + private static final LoginController loginController = new LoginController(); + + private LoginController() { + } + + public static LoginController getInstance() { + return loginController; + } @Override - public void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - final HttpCookie httpCookie = httpRequest.getCookie(); + public void doGet(final HttpRequest request, final HttpResponse response) throws Exception { + final HttpCookie httpCookie = request.getCookie(); final String cookie = httpCookie.getCookie(JSESSIONID); if (cookie == null || SessionManager.findSession(cookie) == null) { - viewResolver.renderPage(httpResponse, HttpStatus.OK, LOGIN_PAGE); + ViewResolver.renderPage(response, HttpStatus.OK, LOGIN_PAGE); return; } - httpResponse.setStatus(HttpStatus.FOUND); - httpResponse.setLocation(SLASH + LOGIN_SUCCESS_PAGE); + response.setStatus(HttpStatus.FOUND); + response.setLocation(SLASH + LOGIN_SUCCESS_PAGE); } @Override - public void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - final Map body = httpRequest.getBody(ContentType.APPLICATION_JSON); + public void doPost(final HttpRequest request, final HttpResponse response) throws Exception { + final Map body = request.getBody(ContentType.APPLICATION_JSON); final String account = body.get(ACCOUNT); final String password = body.get(PASSWORD); if (account == null || password == null) { log.warn("Account Or Password Not Exist"); - httpResponse.setStatus(HttpStatus.FOUND); - httpResponse.setLocation(SLASH + LOGIN_FAIL_PAGE); + response.setStatus(HttpStatus.FOUND); + response.setLocation(SLASH + LOGIN_FAIL_PAGE); return; } final Optional findUser = InMemoryUserRepository.findByAccount(account); if (findUser.isEmpty() || !findUser.get().checkPassword(password)) { log.warn("Login Fail"); - httpResponse.setStatus(HttpStatus.FOUND); - httpResponse.setLocation(SLASH + LOGIN_FAIL_PAGE); + response.setStatus(HttpStatus.FOUND); + response.setLocation(SLASH + LOGIN_FAIL_PAGE); return; } - loginSuccess(httpResponse, findUser.get()); + loginSuccess(response, findUser.get()); } - private void loginSuccess(final HttpResponse httpResponse, final User user) { + private void loginSuccess(final HttpResponse response, final User user) { final Session session = new Session(UUID.randomUUID().toString()); session.setAttribute("user", user); SessionManager.add(session); - httpResponse.addCookie(JSESSIONID, session.getId()); - httpResponse.setStatus(HttpStatus.FOUND); - httpResponse.setLocation(SLASH + LOGIN_SUCCESS_PAGE); + response.addCookie(JSESSIONID, session.getId()); + response.setStatus(HttpStatus.FOUND); + response.setLocation(SLASH + LOGIN_SUCCESS_PAGE); } } diff --git a/tomcat/src/main/java/org/apache/coyote/handle/handler/RegisterHandler.java b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java similarity index 59% rename from tomcat/src/main/java/org/apache/coyote/handle/handler/RegisterHandler.java rename to tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java index 3b4853b515..3721be400b 100644 --- a/tomcat/src/main/java/org/apache/coyote/handle/handler/RegisterHandler.java +++ b/tomcat/src/main/java/nextstep/jwp/controller/RegisterController.java @@ -1,11 +1,11 @@ -package org.apache.coyote.handle.handler; +package nextstep.jwp.controller; import java.io.File; -import java.io.IOException; import java.util.Map; import java.util.Optional; import java.util.UUID; import nextstep.jwp.db.InMemoryUserRepository; +import nextstep.jwp.handle.ViewResolver; import nextstep.jwp.model.User; import org.apache.coyote.common.ContentType; import org.apache.coyote.common.HttpStatus; @@ -16,9 +16,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class RegisterHandler implements Handler { +public class RegisterController extends AbstractController { - private static final Logger log = LoggerFactory.getLogger(RegisterHandler.class); + private static final Logger log = LoggerFactory.getLogger(RegisterController.class); private static final String SLASH = File.separator; private static final String REGISTER_PAGE = "register.html"; private static final String REGISTER_SUCCESS_PAGE = "index.html"; @@ -27,43 +27,51 @@ public class RegisterHandler implements Handler { private static final String PASSWORD = "password"; private static final String EMAIL = "email"; private static final String JSESSIONID = "JSESSIONID"; + private static final RegisterController registerController = new RegisterController(); + + private RegisterController() { + } + + public static RegisterController getInstance() { + return registerController; + } @Override - public void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - viewResolver.renderPage(httpResponse, HttpStatus.OK, REGISTER_PAGE); + public void doGet(final HttpRequest request, final HttpResponse response) throws Exception { + ViewResolver.renderPage(response, HttpStatus.OK, REGISTER_PAGE); } @Override - public void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - final Map body = httpRequest.getBody(ContentType.APPLICATION_JSON); + public void doPost(final HttpRequest request, final HttpResponse response) throws Exception { + final Map body = request.getBody(ContentType.APPLICATION_JSON); final String account = body.get(ACCOUNT); final String password = body.get(PASSWORD); final String email = body.get(EMAIL); if (account == null || password == null || email == null) { log.warn("Account Or Password Or Email Not Exist"); - httpResponse.setStatus(HttpStatus.FOUND); - httpResponse.setLocation(SLASH + REGISTER_FAIL_PAGE); + response.setStatus(HttpStatus.FOUND); + response.setLocation(SLASH + REGISTER_FAIL_PAGE); return; } final Optional findUser = InMemoryUserRepository.findByAccount(body.get(ACCOUNT)); if (findUser.isPresent()) { log.warn("Registered Account"); - httpResponse.setStatus(HttpStatus.FOUND); - httpResponse.setLocation(SLASH + REGISTER_FAIL_PAGE); + response.setStatus(HttpStatus.FOUND); + response.setLocation(SLASH + REGISTER_FAIL_PAGE); return; } final User user = new User(account, password, email); - registerSuccess(httpResponse, user); + registerSuccess(response, user); } - private void registerSuccess(final HttpResponse httpResponse, final User user) { + private void registerSuccess(final HttpResponse response, final User user) { InMemoryUserRepository.save(user); final Session session = new Session(UUID.randomUUID().toString()); session.setAttribute("user", user); SessionManager.add(session); - httpResponse.addCookie(JSESSIONID, session.getId()); - httpResponse.setStatus(HttpStatus.FOUND); - httpResponse.setLocation(SLASH + REGISTER_SUCCESS_PAGE); + response.addCookie(JSESSIONID, session.getId()); + response.setStatus(HttpStatus.FOUND); + response.setLocation(SLASH + REGISTER_SUCCESS_PAGE); } } diff --git a/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java b/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java index 1ca30e8383..d043a8f1f2 100644 --- a/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java +++ b/tomcat/src/main/java/nextstep/jwp/db/InMemoryUserRepository.java @@ -1,27 +1,35 @@ package nextstep.jwp.db; -import nextstep.jwp.model.User; - import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; +import nextstep.jwp.model.User; public class InMemoryUserRepository { private static final Map database = new ConcurrentHashMap<>(); + private static final AtomicLong auto_increment = new AtomicLong(1); static { - final User user = new User(1L, "gugu", "password", "hkkang@woowahan.com"); + final User user = new User(auto_increment.getAndIncrement(), "gugu", "password", "hkkang@woowahan.com"); database.put(user.getAccount(), user); } public static void save(User user) { - database.put(user.getAccount(), user); + final User saveUser = new User( + auto_increment.getAndIncrement(), + user.getAccount(), + user.getPassword(), + user.getEmail() + ); + database.put(saveUser.getAccount(), saveUser); } public static Optional findByAccount(String account) { return Optional.ofNullable(database.get(account)); } - private InMemoryUserRepository() {} + private InMemoryUserRepository() { + } } diff --git a/tomcat/src/main/java/nextstep/jwp/exception/HandlerMappingException.java b/tomcat/src/main/java/nextstep/jwp/exception/HandlerMappingException.java new file mode 100644 index 0000000000..357e6c6149 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/exception/HandlerMappingException.java @@ -0,0 +1,8 @@ +package nextstep.jwp.exception; + +public class HandlerMappingException extends RuntimeException { + + public HandlerMappingException() { + super("Handler Mapping Fail"); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/exception/NotFoundHandlerException.java b/tomcat/src/main/java/nextstep/jwp/exception/NotFoundHandlerException.java new file mode 100644 index 0000000000..7b7613873f --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/exception/NotFoundHandlerException.java @@ -0,0 +1,8 @@ +package nextstep.jwp.exception; + +public class NotFoundHandlerException extends RuntimeException { + + public NotFoundHandlerException() { + super("Match Handler Not Found"); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/HandlerMapping.java b/tomcat/src/main/java/nextstep/jwp/handle/HandlerMapping.java new file mode 100644 index 0000000000..a363c75fdf --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/HandlerMapping.java @@ -0,0 +1,28 @@ +package nextstep.jwp.handle; + +import java.util.HashMap; +import java.util.Map; +import nextstep.jwp.exception.NotFoundHandlerException; +import nextstep.jwp.handle.mapping.MappingInfo; +import org.apache.coyote.request.HttpRequest; + +public class HandlerMapping { + + private final Map handlerMapping = new HashMap<>(); + + public HandlerMapping() { + } + + public void addMappingInfo(final MappingInfo mappingInfo, final HandlerMethod handlerMethod) { + handlerMapping.put(mappingInfo, handlerMethod); + } + + public HandlerMethod getHandlerMethod(final HttpRequest request) { + return handlerMapping.keySet() + .stream() + .filter(mappingInfo -> mappingInfo.support(request)) + .findFirst() + .map(handlerMapping::get) + .orElseThrow(NotFoundHandlerException::new); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/HandlerMethod.java b/tomcat/src/main/java/nextstep/jwp/handle/HandlerMethod.java new file mode 100644 index 0000000000..90477af4be --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/HandlerMethod.java @@ -0,0 +1,23 @@ +package nextstep.jwp.handle; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import nextstep.jwp.controller.Controller; +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public class HandlerMethod { + + private final Controller controller; + private final Method method; + + public HandlerMethod(final Controller controller, final Method method) { + this.controller = controller; + this.method = method; + } + + public void invokeMethod(final HttpRequest request, final HttpResponse response) + throws InvocationTargetException, IllegalAccessException { + method.invoke(controller, request, response); + } +} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/ViewResolver.java b/tomcat/src/main/java/nextstep/jwp/handle/ViewResolver.java similarity index 57% rename from tomcat/src/main/java/org/apache/coyote/handle/ViewResolver.java rename to tomcat/src/main/java/nextstep/jwp/handle/ViewResolver.java index ec4bd9113c..72337b572f 100644 --- a/tomcat/src/main/java/org/apache/coyote/handle/ViewResolver.java +++ b/tomcat/src/main/java/nextstep/jwp/handle/ViewResolver.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle; +package nextstep.jwp.handle; import java.io.File; import java.io.IOException; @@ -13,35 +13,30 @@ public class ViewResolver { private static final String STATIC_DIRECTORY = "static"; private static final String SLASH = File.separator; private static final String NOT_FOUND = "404.html"; - private static final ViewResolver VIEW_RESOLVER = new ViewResolver(); private ViewResolver() { } - public static ViewResolver getInstance() { - return VIEW_RESOLVER; - } - - public void renderPage(final HttpResponse httpResponse, final HttpStatus httpStatus, final String page) + public static void renderPage(final HttpResponse response, final HttpStatus httpStatus, final String page) throws IOException { try { - httpResponse.setStatus(httpStatus); - httpResponse.setContentType(getContentType(page)); - httpResponse.setContent(getBody(page)); + response.setStatus(httpStatus); + response.setContentType(getContentType(page)); + response.setContent(getBody(page)); } catch (NullPointerException e) { - httpResponse.setStatus(HttpStatus.NOT_FOUND); - httpResponse.setContentType(ContentType.TEXT_HTML.getType()); - httpResponse.setContent(getBody(NOT_FOUND)); + response.setStatus(HttpStatus.NOT_FOUND); + response.setContentType(ContentType.TEXT_HTML.getType()); + response.setContent(getBody(NOT_FOUND)); } } - private String getContentType(final String page) { + private static String getContentType(final String page) { final String extension = page.substring(page.lastIndexOf(".") + 1); String contentType = ContentType.getTypeFrom(extension); return contentType == null ? ContentType.APPLICATION_OCTET_STREAM.getType() : contentType; } - private String getBody(final String page) throws IOException { + private static String getBody(final String page) throws IOException { final URL resource = ClassLoader.getSystemClassLoader().getResource(STATIC_DIRECTORY + SLASH + page); final File file = new File(resource.getFile()); return new String(Files.readAllBytes(file.toPath())); diff --git a/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetFileMappingInfo.java b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetFileMappingInfo.java new file mode 100644 index 0000000000..b194f34090 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetFileMappingInfo.java @@ -0,0 +1,20 @@ +package nextstep.jwp.handle.mapping; + +import java.util.regex.Pattern; +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.request.HttpRequest; + +public class GetFileMappingInfo extends MappingInfo { + + private static final String FILE_PATTERN = "/[^.]*\\.[^.]*$"; + private static final Pattern PATTERN = Pattern.compile(FILE_PATTERN); + + public GetFileMappingInfo() { + super(HttpMethod.GET, FILE_PATTERN); + } + + @Override + public boolean support(final HttpRequest request) { + return httpMethod.equals(request.getHttpMethod()) && PATTERN.matcher(request.getUriPath()).matches(); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetHelloWorldMappingInfo.java b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetHelloWorldMappingInfo.java new file mode 100644 index 0000000000..cc3517cdd1 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetHelloWorldMappingInfo.java @@ -0,0 +1,17 @@ +package nextstep.jwp.handle.mapping; + +import java.util.Objects; +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.request.HttpRequest; + +public class GetHelloWorldMappingInfo extends MappingInfo { + + public GetHelloWorldMappingInfo() { + super(HttpMethod.GET, "/"); + } + + @Override + public boolean support(final HttpRequest request) { + return httpMethod.equals(request.getHttpMethod()) && Objects.equals(uriPath, request.getUriPath()); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetLoginMappingInfo.java b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetLoginMappingInfo.java new file mode 100644 index 0000000000..b02aa62141 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetLoginMappingInfo.java @@ -0,0 +1,17 @@ +package nextstep.jwp.handle.mapping; + +import java.util.Objects; +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.request.HttpRequest; + +public class GetLoginMappingInfo extends MappingInfo { + + public GetLoginMappingInfo() { + super(HttpMethod.GET, "/login"); + } + + @Override + public boolean support(final HttpRequest request) { + return httpMethod.equals(request.getHttpMethod()) && Objects.equals(uriPath, request.getUriPath()); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetRegisterMappingInfo.java b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetRegisterMappingInfo.java new file mode 100644 index 0000000000..fc382e0ae5 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/mapping/GetRegisterMappingInfo.java @@ -0,0 +1,17 @@ +package nextstep.jwp.handle.mapping; + +import java.util.Objects; +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.request.HttpRequest; + +public class GetRegisterMappingInfo extends MappingInfo { + + public GetRegisterMappingInfo() { + super(HttpMethod.GET, "/register"); + } + + @Override + public boolean support(final HttpRequest request) { + return httpMethod.equals(request.getHttpMethod()) && Objects.equals(uriPath, request.getUriPath()); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/mapping/MappingInfo.java b/tomcat/src/main/java/nextstep/jwp/handle/mapping/MappingInfo.java new file mode 100644 index 0000000000..241d0d6fe8 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/mapping/MappingInfo.java @@ -0,0 +1,17 @@ +package nextstep.jwp.handle.mapping; + +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.request.HttpRequest; + +public abstract class MappingInfo { + + protected final HttpMethod httpMethod; + protected final String uriPath; + + protected MappingInfo(final HttpMethod httpMethod, final String uriPath) { + this.httpMethod = httpMethod; + this.uriPath = uriPath; + } + + public abstract boolean support(final HttpRequest request); +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/mapping/PostLoginMappingInfo.java b/tomcat/src/main/java/nextstep/jwp/handle/mapping/PostLoginMappingInfo.java new file mode 100644 index 0000000000..494b764cc2 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/mapping/PostLoginMappingInfo.java @@ -0,0 +1,17 @@ +package nextstep.jwp.handle.mapping; + +import java.util.Objects; +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.request.HttpRequest; + +public class PostLoginMappingInfo extends MappingInfo { + + public PostLoginMappingInfo() { + super(HttpMethod.POST, "/login"); + } + + @Override + public boolean support(final HttpRequest request) { + return httpMethod.equals(request.getHttpMethod()) && Objects.equals(uriPath, request.getUriPath()); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/handle/mapping/PostRegisterMappingInfo.java b/tomcat/src/main/java/nextstep/jwp/handle/mapping/PostRegisterMappingInfo.java new file mode 100644 index 0000000000..7c9a00c45e --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/handle/mapping/PostRegisterMappingInfo.java @@ -0,0 +1,17 @@ +package nextstep.jwp.handle.mapping; + +import java.util.Objects; +import org.apache.coyote.common.HttpMethod; +import org.apache.coyote.request.HttpRequest; + +public class PostRegisterMappingInfo extends MappingInfo { + + public PostRegisterMappingInfo() { + super(HttpMethod.POST, "/register"); + } + + @Override + public boolean support(final HttpRequest request) { + return httpMethod.equals(request.getHttpMethod()) && Objects.equals(uriPath, request.getUriPath()); + } +} diff --git a/tomcat/src/main/java/nextstep/jwp/model/User.java b/tomcat/src/main/java/nextstep/jwp/model/User.java index 4c2a2cd184..158ae5cce5 100644 --- a/tomcat/src/main/java/nextstep/jwp/model/User.java +++ b/tomcat/src/main/java/nextstep/jwp/model/User.java @@ -26,6 +26,14 @@ public String getAccount() { return account; } + public String getPassword() { + return password; + } + + public String getEmail() { + return email; + } + @Override public String toString() { return "User{" + diff --git a/tomcat/src/main/java/nextstep/jwp/servlet/DispatcherServlet.java b/tomcat/src/main/java/nextstep/jwp/servlet/DispatcherServlet.java new file mode 100644 index 0000000000..8d75a28a75 --- /dev/null +++ b/tomcat/src/main/java/nextstep/jwp/servlet/DispatcherServlet.java @@ -0,0 +1,78 @@ +package nextstep.jwp.servlet; + +import nextstep.jwp.controller.FileController; +import nextstep.jwp.controller.HelloWorldController; +import nextstep.jwp.controller.LoginController; +import nextstep.jwp.controller.RegisterController; +import nextstep.jwp.exception.HandlerMappingException; +import nextstep.jwp.handle.HandlerMapping; +import nextstep.jwp.handle.HandlerMethod; +import nextstep.jwp.handle.mapping.GetFileMappingInfo; +import nextstep.jwp.handle.mapping.GetHelloWorldMappingInfo; +import nextstep.jwp.handle.mapping.GetLoginMappingInfo; +import nextstep.jwp.handle.mapping.GetRegisterMappingInfo; +import nextstep.jwp.handle.mapping.PostLoginMappingInfo; +import nextstep.jwp.handle.mapping.PostRegisterMappingInfo; +import org.apache.catalina.core.Servlet; +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public class DispatcherServlet implements Servlet { + + private HandlerMapping handlerMapping; + + public DispatcherServlet() { + try { + this.handlerMapping = new HandlerMapping(); + handlerMapping.addMappingInfo( + new GetFileMappingInfo(), + new HandlerMethod( + FileController.getInstance(), + FileController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) + ) + ); + handlerMapping.addMappingInfo( + new GetHelloWorldMappingInfo(), + new HandlerMethod( + HelloWorldController.getInstance(), + HelloWorldController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) + ) + ); + handlerMapping.addMappingInfo( + new GetLoginMappingInfo(), + new HandlerMethod( + LoginController.getInstance(), + LoginController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) + ) + ); + handlerMapping.addMappingInfo( + new PostLoginMappingInfo(), + new HandlerMethod( + LoginController.getInstance(), + LoginController.class.getDeclaredMethod("doPost", HttpRequest.class, HttpResponse.class) + ) + ); + handlerMapping.addMappingInfo( + new GetRegisterMappingInfo(), + new HandlerMethod( + RegisterController.getInstance(), + RegisterController.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) + )); + handlerMapping.addMappingInfo( + new PostRegisterMappingInfo(), + new HandlerMethod( + RegisterController.getInstance(), + RegisterController.class.getDeclaredMethod("doPost", HttpRequest.class, HttpResponse.class) + ) + ); + } catch (NoSuchMethodException e) { + throw new HandlerMappingException(); + } + } + + @Override + public void service(final HttpRequest request, final HttpResponse response) throws Exception { + final HandlerMethod handlerMethod = handlerMapping.getHandlerMethod(request); + handlerMethod.invokeMethod(request, response); + } +} diff --git a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java index 3b2c4dda7c..3cacaac586 100644 --- a/tomcat/src/main/java/org/apache/catalina/connector/Connector.java +++ b/tomcat/src/main/java/org/apache/catalina/connector/Connector.java @@ -1,13 +1,16 @@ package org.apache.catalina.connector; -import org.apache.coyote.http11.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.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import org.apache.coyote.http11.Http11Processor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Connector implements Runnable { @@ -15,15 +18,25 @@ public class Connector implements Runnable { private static final int DEFAULT_PORT = 8080; private static final int DEFAULT_ACCEPT_COUNT = 100; + private static final int MAX_THREAD = 250; + private static final int MAX_WAITING_COUNT = 100; + private final ExecutorService executorService; private final ServerSocket serverSocket; private boolean stopped; public Connector() { - this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT); + this(DEFAULT_PORT, DEFAULT_ACCEPT_COUNT, MAX_THREAD); } - public Connector(final int port, final int acceptCount) { + public Connector(final int port, final int acceptCount, final int maxThreads) { + this.executorService = new ThreadPoolExecutor( + maxThreads, + maxThreads, + 0, + TimeUnit.MILLISECONDS, + new LinkedBlockingDeque<>(MAX_WAITING_COUNT) + ); this.serverSocket = createServerSocket(port, acceptCount); this.stopped = false; } @@ -67,12 +80,13 @@ private void process(final Socket connection) { return; } var processor = new Http11Processor(connection); - new Thread(processor).start(); + executorService.execute(processor); } public void stop() { stopped = true; try { + executorService.shutdown(); serverSocket.close(); } catch (IOException e) { log.error(e.getMessage(), e); diff --git a/tomcat/src/main/java/org/apache/catalina/core/ContextManager.java b/tomcat/src/main/java/org/apache/catalina/core/ContextManager.java new file mode 100644 index 0000000000..63a18957e1 --- /dev/null +++ b/tomcat/src/main/java/org/apache/catalina/core/ContextManager.java @@ -0,0 +1,24 @@ +package org.apache.catalina.core; + +import java.util.ArrayList; +import java.util.List; +import nextstep.jwp.servlet.DispatcherServlet; +import org.apache.coyote.exception.NotFoundServletException; +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public class ContextManager { + + private static final List servlets = new ArrayList<>(); + + static { + servlets.add(new DispatcherServlet()); + } + + public static void invoke(final HttpRequest request, final HttpResponse response) throws Exception { + final Servlet servlet = servlets.stream() + .findFirst() + .orElseThrow(NotFoundServletException::new); + servlet.service(request, response); + } +} diff --git a/tomcat/src/main/java/org/apache/catalina/core/Servlet.java b/tomcat/src/main/java/org/apache/catalina/core/Servlet.java new file mode 100644 index 0000000000..e399d003ee --- /dev/null +++ b/tomcat/src/main/java/org/apache/catalina/core/Servlet.java @@ -0,0 +1,9 @@ +package org.apache.catalina.core; + +import org.apache.coyote.request.HttpRequest; +import org.apache.coyote.response.HttpResponse; + +public interface Servlet { + + void service(final HttpRequest request, final HttpResponse response) throws Exception; +} diff --git a/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java b/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java index 3044cbe1b5..59b81b058e 100644 --- a/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java +++ b/tomcat/src/main/java/org/apache/coyote/common/SessionManager.java @@ -1,11 +1,11 @@ package org.apache.coyote.common; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class SessionManager { - private static final Map SESSIONS = new HashMap<>(); + private static final Map SESSIONS = new ConcurrentHashMap<>(); private SessionManager() { } @@ -15,6 +15,9 @@ public static void add(final Session session) { } public static Session findSession(final String id) { + if (id == null) { + return null; + } return SESSIONS.get(id); } diff --git a/tomcat/src/main/java/org/apache/coyote/exception/NotFoundServletException.java b/tomcat/src/main/java/org/apache/coyote/exception/NotFoundServletException.java new file mode 100644 index 0000000000..63a17e5532 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/exception/NotFoundServletException.java @@ -0,0 +1,8 @@ +package org.apache.coyote.exception; + +public class NotFoundServletException extends RuntimeException { + + public NotFoundServletException() { + super("Match Servlet Not Found"); + } +} diff --git a/tomcat/src/main/java/org/apache/coyote/exception/http/NotFoundHandlerException.java b/tomcat/src/main/java/org/apache/coyote/exception/http/NotFoundHandlerException.java deleted file mode 100644 index 190b78e73a..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/exception/http/NotFoundHandlerException.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.apache.coyote.exception.http; - -public class NotFoundHandlerException extends HttpException { - - public NotFoundHandlerException() { - super("Match Handler Not Found"); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/HandlerMapping.java b/tomcat/src/main/java/org/apache/coyote/handle/HandlerMapping.java deleted file mode 100644 index 9819e0e613..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/HandlerMapping.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.apache.coyote.handle; - -import java.util.HashMap; -import java.util.Map; -import org.apache.coyote.exception.http.NotFoundHandlerException; -import org.apache.coyote.handle.handler.FileHandler; -import org.apache.coyote.handle.handler.Handler; -import org.apache.coyote.handle.handler.HelloWorldHandler; -import org.apache.coyote.handle.handler.LoginHandler; -import org.apache.coyote.handle.handler.RegisterHandler; -import org.apache.coyote.handle.mapping.FileMappingInfo; -import org.apache.coyote.handle.mapping.HelloWorldMappingInfo; -import org.apache.coyote.handle.mapping.LoginMappingInfo; -import org.apache.coyote.handle.mapping.MappingInfo; -import org.apache.coyote.handle.mapping.RegisterMappingInfo; -import org.apache.coyote.request.HttpRequest; - -public class HandlerMapping { - - private static final Map handlerMappings = new HashMap<>(); - - static { - handlerMappings.put(new HelloWorldMappingInfo(), new HelloWorldHandler()); - handlerMappings.put(new FileMappingInfo(), new FileHandler()); - handlerMappings.put(new LoginMappingInfo(), new LoginHandler()); - handlerMappings.put(new RegisterMappingInfo(), new RegisterHandler()); - } - - private HandlerMapping() { - } - - public static HandlerMethod getHandlerMethod(final HttpRequest httpRequest) { - return handlerMappings.keySet() - .stream() - .filter(mappingInfo -> mappingInfo.support(httpRequest)) - .findFirst() - .map(mappingInfo -> - new HandlerMethod( - handlerMappings.get(mappingInfo), - mappingInfo.getMethod(httpRequest.getHttpMethod()) - ) - ) - .orElseThrow(NotFoundHandlerException::new); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/HandlerMethod.java b/tomcat/src/main/java/org/apache/coyote/handle/HandlerMethod.java deleted file mode 100644 index 1f5b297684..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/HandlerMethod.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.apache.coyote.handle; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import org.apache.coyote.handle.handler.Handler; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public class HandlerMethod { - - private final Handler handler; - private final Method method; - - public HandlerMethod(final Handler handler, final Method method) { - this.handler = handler; - this.method = method; - } - - public void invokeMethod(final HttpRequest httpRequest, final HttpResponse httpResponse) - throws InvocationTargetException, IllegalAccessException { - method.invoke(handler, httpRequest, httpResponse); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/handler/FileHandler.java b/tomcat/src/main/java/org/apache/coyote/handle/handler/FileHandler.java deleted file mode 100644 index 5b1c5d8e02..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/handler/FileHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.apache.coyote.handle.handler; - -import java.io.IOException; -import org.apache.coyote.common.HttpStatus; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public class FileHandler implements Handler { - - @Override - public void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - viewResolver.renderPage(httpResponse, HttpStatus.OK, httpRequest.getUriPath().substring(1)); - } - - @Override - public void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/handler/Handler.java b/tomcat/src/main/java/org/apache/coyote/handle/handler/Handler.java deleted file mode 100644 index 2d05b771af..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/handler/Handler.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.apache.coyote.handle.handler; - -import java.io.IOException; -import org.apache.coyote.handle.ViewResolver; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public interface Handler { - - ViewResolver viewResolver = ViewResolver.getInstance(); - - void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException; - - void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException; -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/handler/HelloWorldHandler.java b/tomcat/src/main/java/org/apache/coyote/handle/handler/HelloWorldHandler.java deleted file mode 100644 index 8ef447c445..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/handler/HelloWorldHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.apache.coyote.handle.handler; - -import java.io.IOException; -import org.apache.coyote.common.ContentType; -import org.apache.coyote.common.HttpStatus; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public class HelloWorldHandler implements Handler { - - private static final String BODY = "Hello world!"; - - @Override - public void doGet(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - httpResponse.setStatus(HttpStatus.OK); - httpResponse.setContentType(ContentType.TEXT_HTML.getType()); - httpResponse.setContent(BODY); - } - - @Override - public void doPost(final HttpRequest httpRequest, final HttpResponse httpResponse) throws IOException { - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/mapping/FileMappingInfo.java b/tomcat/src/main/java/org/apache/coyote/handle/mapping/FileMappingInfo.java deleted file mode 100644 index ede706eda2..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/mapping/FileMappingInfo.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.apache.coyote.handle.mapping; - -import java.util.regex.Pattern; -import org.apache.coyote.common.HttpMethod; -import org.apache.coyote.handle.handler.FileHandler; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public class FileMappingInfo extends MappingInfo { - - private static final String FILE_PATTER = "/[^.]*\\.[^.]*$"; - private static final Pattern PATTERN = Pattern.compile(FILE_PATTER); - - public FileMappingInfo() { - super(FILE_PATTER); - try { - methodMapping.put( - HttpMethod.GET, - FileHandler.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) - ); - } catch (NoSuchMethodException e) { - throw new IllegalStateException(e); - } - } - - @Override - public boolean support(final HttpRequest httpRequest) { - return methodMapping.keySet().contains(httpRequest.getHttpMethod()) - && PATTERN.matcher(httpRequest.getUriPath()).matches(); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/mapping/HelloWorldMappingInfo.java b/tomcat/src/main/java/org/apache/coyote/handle/mapping/HelloWorldMappingInfo.java deleted file mode 100644 index 4eae57c30d..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/mapping/HelloWorldMappingInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.apache.coyote.handle.mapping; - -import java.util.Objects; -import org.apache.coyote.common.HttpMethod; -import org.apache.coyote.handle.handler.HelloWorldHandler; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public class HelloWorldMappingInfo extends MappingInfo { - - public HelloWorldMappingInfo() { - super("/"); - try { - methodMapping.put( - HttpMethod.GET, - HelloWorldHandler.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) - ); - } catch (NoSuchMethodException e) { - throw new IllegalStateException(e); - } - } - - @Override - public boolean support(final HttpRequest httpRequest) { - return methodMapping.keySet().contains(httpRequest.getHttpMethod()) - && Objects.equals(uriPath, httpRequest.getUriPath()); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/mapping/LoginMappingInfo.java b/tomcat/src/main/java/org/apache/coyote/handle/mapping/LoginMappingInfo.java deleted file mode 100644 index 71fe174d5c..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/mapping/LoginMappingInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.apache.coyote.handle.mapping; - -import java.util.Objects; -import org.apache.coyote.common.HttpMethod; -import org.apache.coyote.handle.handler.LoginHandler; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public class LoginMappingInfo extends MappingInfo { - - public LoginMappingInfo() { - super("/login"); - try { - methodMapping.put( - HttpMethod.GET, - LoginHandler.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) - ); - methodMapping.put( - HttpMethod.POST, - LoginHandler.class.getDeclaredMethod("doPost", HttpRequest.class, HttpResponse.class) - ); - } catch (NoSuchMethodException e) { - throw new IllegalStateException(e); - } - } - - @Override - public boolean support(final HttpRequest httpRequest) { - return methodMapping.keySet().contains(httpRequest.getHttpMethod()) - && Objects.equals(uriPath, httpRequest.getUriPath()); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/mapping/MappingInfo.java b/tomcat/src/main/java/org/apache/coyote/handle/mapping/MappingInfo.java deleted file mode 100644 index f7c5bb4b46..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/mapping/MappingInfo.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.apache.coyote.handle.mapping; - -import java.lang.reflect.Method; -import java.util.EnumMap; -import java.util.Map; -import org.apache.coyote.common.HttpMethod; -import org.apache.coyote.request.HttpRequest; - -public abstract class MappingInfo { - - protected final String uriPath; - protected final Map methodMapping = new EnumMap<>(HttpMethod.class); - - protected MappingInfo(final String uriPath) { - this.uriPath = uriPath; - } - - public abstract boolean support(final HttpRequest httpRequest); - - public Method getMethod(final HttpMethod httpMethod) { - return methodMapping.get(httpMethod); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/handle/mapping/RegisterMappingInfo.java b/tomcat/src/main/java/org/apache/coyote/handle/mapping/RegisterMappingInfo.java deleted file mode 100644 index 0054ff001d..0000000000 --- a/tomcat/src/main/java/org/apache/coyote/handle/mapping/RegisterMappingInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.apache.coyote.handle.mapping; - -import java.util.Objects; -import org.apache.coyote.common.HttpMethod; -import org.apache.coyote.handle.handler.RegisterHandler; -import org.apache.coyote.request.HttpRequest; -import org.apache.coyote.response.HttpResponse; - -public class RegisterMappingInfo extends MappingInfo { - - public RegisterMappingInfo() { - super("/register"); - try { - methodMapping.put( - HttpMethod.GET, - RegisterHandler.class.getDeclaredMethod("doGet", HttpRequest.class, HttpResponse.class) - ); - methodMapping.put( - HttpMethod.POST, - RegisterHandler.class.getDeclaredMethod("doPost", HttpRequest.class, HttpResponse.class) - ); - } catch (NoSuchMethodException e) { - throw new IllegalStateException(e); - } - } - - @Override - public boolean support(final HttpRequest httpRequest) { - return methodMapping.keySet().contains(httpRequest.getHttpMethod()) - && Objects.equals(uriPath, httpRequest.getUriPath()); - } -} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java index 1b87a792fb..7a4ca3457f 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java @@ -3,9 +3,8 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; +import org.apache.catalina.core.ContextManager; import org.apache.coyote.Processor; -import org.apache.coyote.handle.HandlerMapping; -import org.apache.coyote.handle.HandlerMethod; import org.apache.coyote.request.HttpRequest; import org.apache.coyote.response.HttpResponse; import org.slf4j.Logger; @@ -33,12 +32,11 @@ public void process(final Socket connection) { final var outputStream = connection.getOutputStream(); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)) ) { - final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final HttpResponse httpResponse = new HttpResponse(httpRequest.getHttpVersion()); - final HandlerMethod handlerMethod = HandlerMapping.getHandlerMethod(httpRequest); - handlerMethod.invokeMethod(httpRequest, httpResponse); + final HttpRequest request = HttpRequest.parse(bufferedReader); + final HttpResponse response = new HttpResponse(request.getHttpVersion()); + ContextManager.invoke(request, response); - outputStream.write(httpResponse.toString().getBytes()); + outputStream.write(response.toString().getBytes()); outputStream.flush(); } catch (Exception e) { log.error(e.getMessage(), e); diff --git a/tomcat/src/test/java/org/apache/coyote/handle/handler/FileHandlerTest.java b/tomcat/src/test/java/nextstep/jwp/controller/FileControllerTest.java similarity index 89% rename from tomcat/src/test/java/org/apache/coyote/handle/handler/FileHandlerTest.java rename to tomcat/src/test/java/nextstep/jwp/controller/FileControllerTest.java index 4f27a97846..31f6e601f4 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/handler/FileHandlerTest.java +++ b/tomcat/src/test/java/nextstep/jwp/controller/FileControllerTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.handler; +package nextstep.jwp.controller; import static org.assertj.core.api.Assertions.assertThat; @@ -17,7 +17,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class FileHandlerTest { +class FileControllerTest { @Test void GET_요청시_정적_파일을_반환한다() throws Exception { @@ -31,8 +31,8 @@ class FileHandlerTest { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final FileHandler fileHandler = new FileHandler(); - fileHandler.doGet(httpRequest, httpResponse); + final FileController fileController = FileController.getInstance(); + fileController.doGet(httpRequest, httpResponse); final URL resource = getClass().getClassLoader().getResource("static/index.html"); final String expected = String.join("\r\n", diff --git a/tomcat/src/test/java/org/apache/coyote/handle/handler/HelloWorldHandlerTest.java b/tomcat/src/test/java/nextstep/jwp/controller/HelloWorldControllerTest.java similarity index 87% rename from tomcat/src/test/java/org/apache/coyote/handle/handler/HelloWorldHandlerTest.java rename to tomcat/src/test/java/nextstep/jwp/controller/HelloWorldControllerTest.java index d8a0117ef0..b6291d058d 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/handler/HelloWorldHandlerTest.java +++ b/tomcat/src/test/java/nextstep/jwp/controller/HelloWorldControllerTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.handler; +package nextstep.jwp.controller; import static org.assertj.core.api.Assertions.assertThat; @@ -14,7 +14,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class HelloWorldHandlerTest { +class HelloWorldControllerTest { @Test void GET_요청시_HELLO_WORLD를_응답한다() throws Exception { @@ -29,8 +29,8 @@ class HelloWorldHandlerTest { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final HelloWorldHandler helloWorldHandler = new HelloWorldHandler(); - helloWorldHandler.doGet(httpRequest, httpResponse); + final HelloWorldController helloWorldController = HelloWorldController.getInstance(); + helloWorldController.doGet(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 200 OK ", diff --git a/tomcat/src/test/java/org/apache/coyote/handle/handler/LoginHandlerTest.java b/tomcat/src/test/java/nextstep/jwp/controller/LoginControllerTest.java similarity index 89% rename from tomcat/src/test/java/org/apache/coyote/handle/handler/LoginHandlerTest.java rename to tomcat/src/test/java/nextstep/jwp/controller/LoginControllerTest.java index 31cd51ef89..ff1a4a6bef 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/handler/LoginHandlerTest.java +++ b/tomcat/src/test/java/nextstep/jwp/controller/LoginControllerTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.handler; +package nextstep.jwp.controller; import static org.assertj.core.api.Assertions.assertThat; @@ -20,7 +20,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class LoginHandlerTest { +class LoginControllerTest { @Nested class GET_요청_처리 { @@ -41,8 +41,8 @@ class GET_요청_처리 { session.setAttribute("user", "user"); SessionManager.add(session); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doGet(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doGet(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", @@ -65,8 +65,8 @@ class GET_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doGet(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doGet(httpRequest, httpResponse); final URL resource = getClass().getClassLoader().getResource("static/login.html"); final String expected = String.join("\r\n", @@ -92,8 +92,8 @@ class GET_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doGet(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doGet(httpRequest, httpResponse); final URL resource = getClass().getClassLoader().getResource("static/login.html"); final String expected = String.join("\r\n", @@ -126,8 +126,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doPost(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doPost(httpRequest, httpResponse); assertThat(httpResponse.toString()) .contains("HTTP/1.1 302 Found ", "Location: /index.html ", "Set-Cookie: JSESSIONID="); @@ -149,8 +149,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doPost(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", @@ -177,8 +177,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doPost(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", @@ -205,8 +205,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doPost(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", @@ -233,8 +233,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final LoginHandler loginHandler = new LoginHandler(); - loginHandler.doPost(httpRequest, httpResponse); + final LoginController loginController = LoginController.getInstance(); + loginController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", diff --git a/tomcat/src/test/java/org/apache/coyote/handle/handler/RegisterHandlerTest.java b/tomcat/src/test/java/nextstep/jwp/controller/RegisterControllerTest.java similarity index 88% rename from tomcat/src/test/java/org/apache/coyote/handle/handler/RegisterHandlerTest.java rename to tomcat/src/test/java/nextstep/jwp/controller/RegisterControllerTest.java index cdd2ef9c5f..e469e9f578 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/handler/RegisterHandlerTest.java +++ b/tomcat/src/test/java/nextstep/jwp/controller/RegisterControllerTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.handler; +package nextstep.jwp.controller; import static org.assertj.core.api.Assertions.assertThat; @@ -18,7 +18,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class RegisterHandlerTest { +class RegisterControllerTest { @Test void GET_요청시_등록_페이지를_반환한다() throws Exception { @@ -32,8 +32,8 @@ class RegisterHandlerTest { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final RegisterHandler registerHandler = new RegisterHandler(); - registerHandler.doGet(httpRequest, httpResponse); + final RegisterController registerController = RegisterController.getInstance(); + registerController.doGet(httpRequest, httpResponse); final URL resource = getClass().getClassLoader().getResource("static/register.html"); final String expected = String.join("\r\n", @@ -65,8 +65,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final RegisterHandler registerHandler = new RegisterHandler(); - registerHandler.doPost(httpRequest, httpResponse); + final RegisterController registerController = RegisterController.getInstance(); + registerController.doPost(httpRequest, httpResponse); assertThat(httpResponse.toString()) .contains("HTTP/1.1 302 Found ", "Location: /index.html ", "Set-Cookie: JSESSIONID="); @@ -88,8 +88,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final RegisterHandler registerHandler = new RegisterHandler(); - registerHandler.doPost(httpRequest, httpResponse); + final RegisterController registerController = RegisterController.getInstance(); + registerController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", @@ -116,8 +116,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final RegisterHandler registerHandler = new RegisterHandler(); - registerHandler.doPost(httpRequest, httpResponse); + final RegisterController registerController = RegisterController.getInstance(); + registerController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", @@ -144,8 +144,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final RegisterHandler registerHandler = new RegisterHandler(); - registerHandler.doPost(httpRequest, httpResponse); + final RegisterController registerController = RegisterController.getInstance(); + registerController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", @@ -172,8 +172,8 @@ class POST_요청_처리 { final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); final HttpResponse httpResponse = new HttpResponse(HttpVersion.HTTP_11); - final RegisterHandler registerHandler = new RegisterHandler(); - registerHandler.doPost(httpRequest, httpResponse); + final RegisterController registerController = RegisterController.getInstance(); + registerController.doPost(httpRequest, httpResponse); final String expected = String.join("\r\n", "HTTP/1.1 302 Found ", diff --git a/tomcat/src/test/java/org/apache/coyote/handle/ViewResolverTest.java b/tomcat/src/test/java/nextstep/jwp/handle/ViewResolverTest.java similarity index 87% rename from tomcat/src/test/java/org/apache/coyote/handle/ViewResolverTest.java rename to tomcat/src/test/java/nextstep/jwp/handle/ViewResolverTest.java index b21dcdf230..08cd0c165a 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/ViewResolverTest.java +++ b/tomcat/src/test/java/nextstep/jwp/handle/ViewResolverTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle; +package nextstep.jwp.handle; import static org.assertj.core.api.Assertions.assertThat; @@ -26,8 +26,7 @@ class 페이지_렌더링 { final HttpStatus httpStatus = HttpStatus.OK; final String page = "index.html"; - final ViewResolver viewResolver = ViewResolver.getInstance(); - viewResolver.renderPage(httpResponse, httpStatus, page); + ViewResolver.renderPage(httpResponse, httpStatus, page); final URL resource = getClass().getClassLoader().getResource("static/index.html"); final String expected = String.join("\r\n", @@ -46,8 +45,7 @@ class 페이지_렌더링 { final HttpStatus httpStatus = HttpStatus.OK; final String page = "hello.html"; - final ViewResolver viewResolver = ViewResolver.getInstance(); - viewResolver.renderPage(httpResponse, httpStatus, page); + ViewResolver.renderPage(httpResponse, httpStatus, page); final URL resource = getClass().getClassLoader().getResource("static/404.html"); final String expected = String.join("\r\n", diff --git a/tomcat/src/test/java/org/apache/coyote/handle/mapping/FileMappingInfoTest.java b/tomcat/src/test/java/nextstep/jwp/handle/mapping/GetFileMappingInfoTest.java similarity index 84% rename from tomcat/src/test/java/org/apache/coyote/handle/mapping/FileMappingInfoTest.java rename to tomcat/src/test/java/nextstep/jwp/handle/mapping/GetFileMappingInfoTest.java index 92141f6d8e..736a02baaf 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/mapping/FileMappingInfoTest.java +++ b/tomcat/src/test/java/nextstep/jwp/handle/mapping/GetFileMappingInfoTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.mapping; +package nextstep.jwp.handle.mapping; import static org.assertj.core.api.Assertions.assertThat; @@ -13,7 +13,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class FileMappingInfoTest { +class GetFileMappingInfoTest { @Nested class 요청_매핑_여부_확인 { @@ -30,8 +30,8 @@ class 요청_매핑_여부_확인 { final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final FileMappingInfo fileMappingInfo = new FileMappingInfo(); - final boolean result = fileMappingInfo.support(httpRequest); + final GetFileMappingInfo getFileMappingInfo = new GetFileMappingInfo(); + final boolean result = getFileMappingInfo.support(httpRequest); assertThat(result).isTrue(); } @@ -51,8 +51,8 @@ class 요청_매핑_여부_확인 { final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final FileMappingInfo fileMappingInfo = new FileMappingInfo(); - final boolean result = fileMappingInfo.support(httpRequest); + final GetFileMappingInfo getFileMappingInfo = new GetFileMappingInfo(); + final boolean result = getFileMappingInfo.support(httpRequest); assertThat(result).isFalse(); } diff --git a/tomcat/src/test/java/org/apache/coyote/handle/mapping/HelloWorldMappingInfoTest.java b/tomcat/src/test/java/nextstep/jwp/handle/mapping/GetHelloWorldMappingInfoTest.java similarity index 82% rename from tomcat/src/test/java/org/apache/coyote/handle/mapping/HelloWorldMappingInfoTest.java rename to tomcat/src/test/java/nextstep/jwp/handle/mapping/GetHelloWorldMappingInfoTest.java index 9bec8e23d4..73309ad646 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/mapping/HelloWorldMappingInfoTest.java +++ b/tomcat/src/test/java/nextstep/jwp/handle/mapping/GetHelloWorldMappingInfoTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.mapping; +package nextstep.jwp.handle.mapping; import static org.assertj.core.api.Assertions.assertThat; @@ -13,7 +13,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class HelloWorldMappingInfoTest { +class GetHelloWorldMappingInfoTest { @Nested class 요청_매핑_여부_확인 { @@ -30,8 +30,8 @@ class 요청_매핑_여부_확인 { final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final HelloWorldMappingInfo helloWorldMappingInfo = new HelloWorldMappingInfo(); - final boolean result = helloWorldMappingInfo.support(httpRequest); + final GetHelloWorldMappingInfo getHelloWorldMappingInfo = new GetHelloWorldMappingInfo(); + final boolean result = getHelloWorldMappingInfo.support(httpRequest); assertThat(result).isTrue(); } @@ -51,8 +51,8 @@ class 요청_매핑_여부_확인 { final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final HelloWorldMappingInfo helloWorldMappingInfo = new HelloWorldMappingInfo(); - final boolean result = helloWorldMappingInfo.support(httpRequest); + final GetHelloWorldMappingInfo getHelloWorldMappingInfo = new GetHelloWorldMappingInfo(); + final boolean result = getHelloWorldMappingInfo.support(httpRequest); assertThat(result).isFalse(); } diff --git a/tomcat/src/test/java/org/apache/coyote/handle/mapping/LoginMappingInfoTest.java b/tomcat/src/test/java/nextstep/jwp/handle/mapping/PostLoginMappingInfoTest.java similarity index 82% rename from tomcat/src/test/java/org/apache/coyote/handle/mapping/LoginMappingInfoTest.java rename to tomcat/src/test/java/nextstep/jwp/handle/mapping/PostLoginMappingInfoTest.java index 16e25fd7fd..e019fdb0a1 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/mapping/LoginMappingInfoTest.java +++ b/tomcat/src/test/java/nextstep/jwp/handle/mapping/PostLoginMappingInfoTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.mapping; +package nextstep.jwp.handle.mapping; import static org.assertj.core.api.Assertions.assertThat; @@ -13,7 +13,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class LoginMappingInfoTest { +class PostLoginMappingInfoTest { @Nested class 요청_매핑_여부_확인 { @@ -21,17 +21,20 @@ class 요청_매핑_여부_확인 { @Test void 요청_매핑이_가능하면_true_반환한다() throws Exception { final String httpRequestMessage = String.join("\r\n", - "GET /login HTTP/1.1", + "POST /login HTTP/1.1", "Host: localhost:8080", "Connection: keep-alive", - "Accept: */*;q=0.1, text/html;q=0.8, application/json;q=0.5" + "Content-Length: 12", + "Accept: */*;q=0.1, text/html;q=0.8, application/json;q=0.5", + "", + "Hello world!" ); final ByteArrayInputStream inputStream = new ByteArrayInputStream(httpRequestMessage.getBytes()); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final LoginMappingInfo loginMappingInfo = new LoginMappingInfo(); - final boolean result = loginMappingInfo.support(httpRequest); + final PostLoginMappingInfo postLoginMappingInfo = new PostLoginMappingInfo(); + final boolean result = postLoginMappingInfo.support(httpRequest); assertThat(result).isTrue(); } @@ -39,20 +42,17 @@ class 요청_매핑_여부_확인 { @Test void 요청_매핑이_가능하지_않다면_false_반환한다() throws Exception { final String httpRequestMessage = String.join("\r\n", - "PUT /login HTTP/1.1", + "GET /login HTTP/1.1", "Host: localhost:8080", "Connection: keep-alive", - "Content-Length: 12", - "Accept: */*;q=0.1, text/html;q=0.8, application/json;q=0.5", - "", - "Hello world!" + "Accept: */*;q=0.1, text/html;q=0.8, application/json;q=0.5" ); final ByteArrayInputStream inputStream = new ByteArrayInputStream(httpRequestMessage.getBytes()); final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final LoginMappingInfo loginMappingInfo = new LoginMappingInfo(); - final boolean result = loginMappingInfo.support(httpRequest); + final PostLoginMappingInfo postLoginMappingInfo = new PostLoginMappingInfo(); + final boolean result = postLoginMappingInfo.support(httpRequest); assertThat(result).isFalse(); } diff --git a/tomcat/src/test/java/org/apache/coyote/handle/mapping/RegisterMappingInfoTest.java b/tomcat/src/test/java/nextstep/jwp/handle/mapping/PostRegisterMappingInfoTest.java similarity index 80% rename from tomcat/src/test/java/org/apache/coyote/handle/mapping/RegisterMappingInfoTest.java rename to tomcat/src/test/java/nextstep/jwp/handle/mapping/PostRegisterMappingInfoTest.java index 1403d17fc4..dc04eb69c8 100644 --- a/tomcat/src/test/java/org/apache/coyote/handle/mapping/RegisterMappingInfoTest.java +++ b/tomcat/src/test/java/nextstep/jwp/handle/mapping/PostRegisterMappingInfoTest.java @@ -1,4 +1,4 @@ -package org.apache.coyote.handle.mapping; +package nextstep.jwp.handle.mapping; import static org.assertj.core.api.Assertions.assertThat; @@ -13,7 +13,7 @@ @SuppressWarnings("NonAsciiCharacters") @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -class RegisterMappingInfoTest { +class PostRegisterMappingInfoTest { @Nested class 요청_매핑_여부_확인 { @@ -21,7 +21,7 @@ class 요청_매핑_여부_확인 { @Test void 요청_매핑이_가능하면_true_반환한다() throws Exception { final String httpRequestMessage = String.join("\r\n", - "GET /register HTTP/1.1", + "POST /register HTTP/1.1", "Host: localhost:8080", "Connection: keep-alive", "Accept: */*;q=0.1, text/html;q=0.8, application/json;q=0.5" @@ -30,8 +30,8 @@ class 요청_매핑_여부_확인 { final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final RegisterMappingInfo registerMappingInfo = new RegisterMappingInfo(); - final boolean result = registerMappingInfo.support(httpRequest); + final PostRegisterMappingInfo postRegisterMappingInfo = new PostRegisterMappingInfo(); + final boolean result = postRegisterMappingInfo.support(httpRequest); assertThat(result).isTrue(); } @@ -48,8 +48,8 @@ class 요청_매핑_여부_확인 { final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); final HttpRequest httpRequest = HttpRequest.parse(bufferedReader); - final RegisterMappingInfo registerMappingInfo = new RegisterMappingInfo(); - final boolean result = registerMappingInfo.support(httpRequest); + final PostRegisterMappingInfo postRegisterMappingInfo = new PostRegisterMappingInfo(); + final boolean result = postRegisterMappingInfo.support(httpRequest); assertThat(result).isFalse(); } diff --git a/tomcat/src/test/java/nextstep/org/apache/coyote/http11/Http11ProcessorTest.java b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java similarity index 94% rename from tomcat/src/test/java/nextstep/org/apache/coyote/http11/Http11ProcessorTest.java rename to tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java index 6b7fdc8908..d29540fd09 100644 --- a/tomcat/src/test/java/nextstep/org/apache/coyote/http11/Http11ProcessorTest.java +++ b/tomcat/src/test/java/org/apache/coyote/http11/Http11ProcessorTest.java @@ -1,4 +1,4 @@ -package nextstep.org.apache.coyote.http11; +package org.apache.coyote.http11; import static org.assertj.core.api.Assertions.assertThat; @@ -6,7 +6,6 @@ import java.io.IOException; import java.net.URL; import java.nio.file.Files; -import org.apache.coyote.http11.Http11Processor; import org.junit.jupiter.api.Test; import support.StubSocket;