diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 473cb85..501849d 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -31,73 +31,131 @@ public void run() { connection.getPort()); try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { - BufferedReader br = new BufferedReader(new InputStreamReader(in)); - StringJoiner requestMessages = new StringJoiner(System.lineSeparator()); + Request request = getRequest(in); // Request - String requestMessage = br.readLine(); + String responseMessage = requestController(request); - while (requestMessage != null && requestMessage.length() != 0) { - requestMessages.add(requestMessage); - requestMessage = br.readLine(); - } + Response response = Response.from(responseMessage); // Response + response.write(out); + + } catch (IOException e) { + log.error(e.getMessage(), e); + } + } + + private Request getRequest(InputStream in) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(in)); + StringJoiner requestMessages = new StringJoiner(System.lineSeparator()); - RequestHeader requestHeader = RequestHeader.from(requestMessages.toString()); + String requestMessage = br.readLine(); - int contentLength = Integer.parseInt(requestHeader.getAttributes().getOrDefault("Content-Length", "0")); - String requestBody = IOUtils.readData(br, contentLength); + while (requestMessage != null && requestMessage.length() != 0) { + requestMessages.add(requestMessage); + requestMessage = br.readLine(); + } - requestMessages.add(System.lineSeparator() + requestBody); + RequestHeader requestHeader = RequestHeader.from(requestMessages.toString()); - Request request = Request.from(requestMessages.toString()); + int contentLength = Integer.parseInt(requestHeader.getAttributes().getOrDefault("Content-Length", "0")); + String requestBody = IOUtils.readData(br, contentLength); - // TODO: Default Message를 설정할 수 있을 것 같다. - String responseMessage = "HTTP/1.1 404 NotFound" + System.lineSeparator() + System.lineSeparator(); + requestMessages.add(System.lineSeparator() + requestBody); - String path = request.getPath(); - String extension = request.getPathExtension(); - if (extension.equals("html")) { + Request request = Request.from(requestMessages.toString()); + return request; + } - File htmlFile = new File("./webapp" + path); + private String requestController(Request request) throws IOException { - if (htmlFile.exists()) { - byte[] body = Files.readAllBytes(htmlFile.toPath()); + String responseMessage = ""; + String path = request.getPath(); + String extension = request.getPathExtension(); - responseMessage = "HTTP/1.1 200 OK" + System.lineSeparator() + - "Content-Type: text/html;charset=utf-8" + System.lineSeparator() + - "Content-Length: " + body.length + System.lineSeparator() + - System.lineSeparator() + - new String(body); - } - } + switch (path) { + case "/user/create": { + Map parameters = request.getRequestMessage().getParameters(); - switch (path) { - case "/user/create": { - Map parameters = request.getRequestMessage().getParameters(); + User newUser = User.builder() + .setUserId(parameters.get("userId")) + .setPassword(parameters.get("password")) + .setName(parameters.get("name")) + .setEmail(parameters.get("email")) + .build(); - User newUser = User.builder() - .setUserId(parameters.get("userId")) - .setPassword(parameters.get("password")) - .setName(parameters.get("name")) - .setEmail(parameters.get("email")) - .build(); + DataBase.addUser(newUser); + + responseMessage = "HTTP/1.1 302 Found" + System.lineSeparator() + + "Location: /index.html"; + break; + } + case "/user/login": { + responseMessage = loginHandler(request.getRequestMessage().getParameters()); + + break; + } + case "/user/list": { + Map parameters = request.getRequestMessage().getHeader().getAttributes(); - DataBase.addUser(newUser); + String Cookie = parameters.getOrDefault("Cookie", "empty"); + if (Cookie.equals("logined=true")) { + responseMessage = findHtmlFrom(path + ".html"); + } else { responseMessage = "HTTP/1.1 302 Found" + System.lineSeparator() + - "Location: /index.html"; - break; + "Location: /user/login.html"; } - case "/user/login": { - responseMessage = loginHandler(request.getRequestMessage().getParameters()); + break; + } + default: { + responseMessage = htmlController(request, responseMessage, path, extension); + } + } + return responseMessage; + } + + private String htmlController(Request request, String responseMessage, String path, String extension) throws IOException { + if (extension.equals("html")) { + + Map parameters = request.getRequestMessage().getHeader().getAttributes(); + String Cookie = parameters.getOrDefault("Cookie", "empty"); + + if (loginRequired(path)) { + switch (Cookie) { + case "logined=true": + responseMessage = findHtmlFrom(path); + break; + default: + responseMessage = "HTTP/1.1 302 Found" + System.lineSeparator() + + "Location: /user/login.html"; } + } else { + responseMessage = findHtmlFrom(path); } + } + return responseMessage; + } - Response response = Response.from(responseMessage); - response.write(out); + private String findHtmlFrom(String path) throws IOException { + File htmlFile = new File("./webapp" + path); + String responseMessage = ""; - } catch (IOException e) { - log.error(e.getMessage(), e); + if (htmlFile.exists()) { + byte[] body = Files.readAllBytes(htmlFile.toPath()); + + responseMessage = "HTTP/1.1 200 OK" + System.lineSeparator() + + "Content-Type: text/html;charset=utf-8" + System.lineSeparator() + + "Content-Length: " + body.length + System.lineSeparator() + + System.lineSeparator() + + new String(body); + } else { + responseMessage = "HTTP/1.1 404 NotFound" + System.lineSeparator() + System.lineSeparator(); } + + return responseMessage; + } + + private boolean loginRequired(String path) { + return path.equals("/user/list.html"); } public String loginHandler(Map parameters) { diff --git a/src/test/java/webserver/RequestHandlerTest.java b/src/test/java/webserver/RequestHandlerTest.java index a60c0ef..ed33da7 100644 --- a/src/test/java/webserver/RequestHandlerTest.java +++ b/src/test/java/webserver/RequestHandlerTest.java @@ -438,4 +438,103 @@ static Stream loginHandler() { ) ); } + + @ParameterizedTest + @MethodSource("리스트_페이지") + void 리스트_페이지(String desc, String message, String expectedResponseMessage) throws IOException { + + + RequestHandler requestHandler = new RequestHandler(server.accept()); + + BufferedOutputStream browserStream = new BufferedOutputStream(browser.getOutputStream()); + browserStream.write(message.getBytes(StandardCharsets.UTF_8)); + browserStream.write(System.lineSeparator().getBytes(StandardCharsets.UTF_8)); + browserStream.flush(); + + requestHandler.run(); + + BufferedReader br = new BufferedReader(new InputStreamReader(browser.getInputStream())); + String actualResponseMessage = br.lines().collect(Collectors.joining(System.lineSeparator())); + + + assertThat(actualResponseMessage) + .as("리스트_페이지 : %s", desc) + .isEqualTo(expectedResponseMessage); + } + + static Stream 리스트_페이지() throws IOException { + return Stream.of( + Arguments.arguments( + "Cookie: logined=true가 있을 경우 /user/list 접속 접근", + + "GET /user/list HTTP/1.1" + System.lineSeparator() + + "Host: localhost:8080" + System.lineSeparator() + + "Connection: keep-alive" + System.lineSeparator() + + "Accept: */*" + System.lineSeparator() + + "Cookie: logined=true" + System.lineSeparator() + + "" + System.lineSeparator(), + + "HTTP/1.1 200 OK" + System.lineSeparator() + + "Content-Type: text/html;charset=utf-8" + System.lineSeparator() + + "Content-Length: 4801" + System.lineSeparator() + + "" + System.lineSeparator() + + Files.lines(new File("./webapp/user/list.html").toPath()) + .collect(Collectors.joining(System.lineSeparator())) + + + ), Arguments.arguments( + "Cookie: logined=true가 없을 경우 /user/list 이동 접근", + + "GET /user/list HTTP/1.1" + System.lineSeparator() + + "Host: localhost:8080" + System.lineSeparator() + + "Connection: keep-alive" + System.lineSeparator() + + "Accept: */*" + System.lineSeparator() + + "" + System.lineSeparator(), + + "HTTP/1.1 302 Found" + System.lineSeparator() + + "Location: /user/login.html" + System.lineSeparator() + ), Arguments.arguments( + "Cookie: logined=true가 있을 경우 /user/list.html 접근", + + "GET /user/list.html HTTP/1.1" + System.lineSeparator() + + "Host: localhost:8080" + System.lineSeparator() + + "Connection: keep-alive" + System.lineSeparator() + + "Accept: */*" + System.lineSeparator() + + "Cookie: logined=true" + System.lineSeparator() + + "" + System.lineSeparator(), + + "HTTP/1.1 200 OK" + System.lineSeparator() + + "Content-Type: text/html;charset=utf-8" + System.lineSeparator() + + "Content-Length: 4801" + System.lineSeparator() + + "" + System.lineSeparator() + + Files.lines(new File("./webapp/user/list.html").toPath()) + .collect(Collectors.joining(System.lineSeparator())) + + ), Arguments.arguments( + "Cookie: logined=true가 없을 경우 /user/list.html 접근", + + "GET /user/list.html HTTP/1.1" + System.lineSeparator() + + "Host: localhost:8080" + System.lineSeparator() + + "Connection: keep-alive" + System.lineSeparator() + + "Accept: */*" + System.lineSeparator() + + "" + System.lineSeparator(), + + "HTTP/1.1 302 Found" + System.lineSeparator() + + "Location: /user/login.html" + System.lineSeparator() + ), Arguments.arguments( + "Cookie 없을 경우 /user/list 접근", + + "GET /user/list HTTP/1.1" + System.lineSeparator() + + "Host: localhost:8080" + System.lineSeparator() + + "Connection: keep-alive" + System.lineSeparator() + + "Accept: */*" + System.lineSeparator() + + "" + System.lineSeparator(), + + "HTTP/1.1 302 Found" + System.lineSeparator() + + "Location: /user/login.html" + System.lineSeparator() + ) + ); + + } + }