diff --git a/tomcat/src/main/java/org/apache/coyote/dynamichandler/LoginHandler.java b/tomcat/src/main/java/org/apache/coyote/dynamichandler/LoginHandler.java index fa173afafa..fbada60e35 100644 --- a/tomcat/src/main/java/org/apache/coyote/dynamichandler/LoginHandler.java +++ b/tomcat/src/main/java/org/apache/coyote/dynamichandler/LoginHandler.java @@ -74,7 +74,7 @@ public void doPost( if (user.isPresent() && user.get().checkPassword(password)) { HttpSession httpSession = httpRequest.getHttpSession(true); - httpResponse.addCookie("JSESSIONID=" + httpSession.getId()); + httpResponse.addCookie("JSESSIONID", httpSession.getId()); httpResponse.sendRedirect("/index.html"); httpSession.add("user", user.get()); log.info("로그인 성공! 아이디 : {}", account); diff --git a/tomcat/src/main/java/org/apache/coyote/http11/Cookie.java b/tomcat/src/main/java/org/apache/coyote/http11/Cookie.java new file mode 100644 index 0000000000..c7be47a4a9 --- /dev/null +++ b/tomcat/src/main/java/org/apache/coyote/http11/Cookie.java @@ -0,0 +1,22 @@ +package org.apache.coyote.http11; + +import java.util.HashMap; +import java.util.Map; + +public class Cookie { + + private final Map values; + + public Cookie() { + values = new HashMap<>(); + } + + public void put(String key, String value) { + values.put(key, value); + } + + public Map getValues() { + return values; + } + +} diff --git a/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse.java b/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse.java index 5d8700ff7f..2eed15df18 100644 --- a/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse.java +++ b/tomcat/src/main/java/org/apache/coyote/http11/HttpResponse.java @@ -5,6 +5,7 @@ import java.util.LinkedHashMap; import java.util.Map; +import java.util.StringJoiner; import java.util.stream.Collectors; public class HttpResponse { @@ -13,9 +14,11 @@ public class HttpResponse { private final Map attribute = new LinkedHashMap<>(); private HttpStatus status; private String responseBody; + private Cookie cookie; public void setStatus(HttpStatus status) { this.status = status; + cookie = new Cookie(); } public void setResponseBody(String responseBody) { @@ -26,22 +29,40 @@ public void sendRedirect(String redirectionUrl) { attribute.put(LOCATION.getValue(), redirectionUrl); } - public void addCookie(String cookie) { - attribute.put(SET_COOKIE.getValue(), cookie); + public void addCookie(String key, String value) { + cookie.put(key, value); } public void setHeader(String key, String value) { attribute.put(key, value); } + private String getAttributeString() { + return String.join("\r\n", + attribute.entrySet() + .stream() + .map(entry -> entry.getKey() + ": " + entry.getValue() + " ") + .collect(Collectors.joining("\r\n")), + getCookieString()); + } + + private String getCookieString() { + Map values = cookie.getValues(); + + if (values.isEmpty()) { + return ""; + } + + StringJoiner cookieString = new StringJoiner(";"); + values.forEach((key, value) -> cookieString.add(String.format("%s=%s", key, value))); + + return SET_COOKIE.getValue() + ": " + cookieString; + } + public String toString() { return String.join("\r\n", PROTOCOL + " " + status.getValue() + " " + status.name() + " ", - attribute.entrySet() - .stream() - .map(entry -> entry.getKey() + ": " + entry.getValue() + " ") - .collect(Collectors.joining("\r\n")), - "", + getAttributeString(), responseBody ); }