diff --git a/README.md b/README.md index 235fddaea..a6e48d6b0 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ * 각 요구사항을 구현하는 것이 중요한 것이 아니라 구현 과정을 통해 학습한 내용을 인식하는 것이 배움에 중요하다. ### 요구사항 1 - http://localhost:8080/index.html로 접속시 응답 -* +* ### 요구사항 2 - get 방식으로 회원가입 * @@ -24,13 +24,13 @@ * ### 요구사항 4 - redirect 방식으로 이동 -* +* http 상태코드에대해 알게되었다. 302 코드를 이용하여 실무에서 사용했던 불필요한 요청로직을 지울수있을것같다. ### 요구사항 5 - cookie -* +* 개발하면서 헤더에 쿠키를 담아서 보내는데 생각보다 오래걸렷다. 문자열을 자르는것 부터 많은 리팩토링이 필요하다. ### 요구사항 6 - stylesheet 적용 -* +* css의 타입이 text/css 인지 여태 신경도 안쓰고 개발했던것같다. 프레임워크에서 자동으로 해주다보니 잘 적용되던것들을 가볍게 넘긴거같다. ### heroku 서버에 배포 후 -* \ No newline at end of file +* diff --git a/src/main/java/util/HeaderUtil.java b/src/main/java/util/HeaderUtil.java new file mode 100644 index 000000000..1420685ef --- /dev/null +++ b/src/main/java/util/HeaderUtil.java @@ -0,0 +1,61 @@ +package util; + + +import java.util.HashMap; +import java.util.Map; + +public class HeaderUtil { + + public static String getUriInHeader(String header) { + String[] headerArr = header.split(" "); + return headerArr[1]; + } + + public static String getRealUrl(String url) { + int index = url.indexOf("?"); + + if (index == -1) { + return url; + } + return url.substring(0, index); + } + + public static String getParamInUrl(String url) { + int index = url.indexOf("?"); + + if (index == -1) { + return ""; + } + + return url.substring(index+1); + } + + public static Map paramToMap(String paramText) { + int length = paramText.length(); + String[] paramArr = paramText.split("&"); + Map paramMap = new HashMap<>(); + + if (length == 0) { + return paramMap; + } + + for (String param : paramArr) { + mapInputParam(param, paramMap); + } + + System.out.println(paramMap); + + return paramMap; + } + + private static void mapInputParam (String param, Map paramMap) { + int index = param.indexOf("="); + if(index > -1) { + String key = param.substring(0, index); + String value = param.substring(index + 1, param.length()); + + paramMap.put(key, value); + } + } + +} diff --git a/src/main/java/util/HttpRequestUtils.java b/src/main/java/util/HttpRequestUtils.java index c4cd95c0d..03ed4f8b1 100644 --- a/src/main/java/util/HttpRequestUtils.java +++ b/src/main/java/util/HttpRequestUtils.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import com.google.common.base.Strings; diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 90195ec4e..b5b08264d 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -1,13 +1,15 @@ package webserver; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.net.Socket; +import java.nio.file.Files; +import java.util.Map; +import model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import util.HeaderUtil; +import util.HttpRequestUtils; public class RequestHandler extends Thread { private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); @@ -24,11 +26,31 @@ public void run() { try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { // TODO 사용자 요청에 대한 처리는 이 곳에 구현하면 된다. - DataOutputStream dos = new DataOutputStream(out); - byte[] body = "Hello World".getBytes(); - response200Header(dos, body.length); - responseBody(dos, body); - } catch (IOException e) { + + final String line = br.readLine(); + final String url = HeaderUtil.getUriInHeader(line); + final String realUrl = HeaderUtil.getRealUrl(url); + + //리팩토링 힌트 + +// param = HeaderUtil.getParamInUrl(url); +// Map map =HeaderUtil.paramToMap(param); + + if (url.startsWith("/user/create")) { + final int index = url.indexOf("?"); + final String queryString = url.substring(index + 1); + + final Map params = HttpRequestUtils.parseQueryString(queryString); + + final User user = new User(params.get("userId"), params.get("password"), params.get("name"), params.get("email")); + } else { + final DataOutputStream dos = new DataOutputStream(out); +// byte[] body = "Hello World22".getBytes(); + final byte[] body = Files.readAllBytes(new File("./webapp" + realUrl).toPath()); + response200Header(dos, body.length); + responseBody(dos, body); + } + } catch (final IOException e) { log.error(e.getMessage()); } } @@ -52,4 +74,4 @@ private void responseBody(DataOutputStream dos, byte[] body) { log.error(e.getMessage()); } } -} +} \ No newline at end of file diff --git a/src/main/java/webserver/WebServer.java b/src/main/java/webserver/WebServer.java index 91f4a0fbc..a06d2bebb 100644 --- a/src/main/java/webserver/WebServer.java +++ b/src/main/java/webserver/WebServer.java @@ -19,7 +19,6 @@ public static void main(String args[]) throws Exception { } // 서버소켓을 생성한다. 웹서버는 기본적으로 8080번 포트를 사용한다. - try (ServerSocket listenSocket = new ServerSocket(port)) { log.info("Web Application Server started {} port.", port); diff --git a/src/test/java/util/HeaderUtilTest.java b/src/test/java/util/HeaderUtilTest.java new file mode 100644 index 000000000..d76fae2be --- /dev/null +++ b/src/test/java/util/HeaderUtilTest.java @@ -0,0 +1,64 @@ +package util; + +import org.junit.Test; + +import java.util.Map; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.*; + +public class HeaderUtilTest { + + @Test + public void url_분리() { + + String header = "GET /index.html HTTP/1.1"; + + String url = HeaderUtil.getUriInHeader(header); + + assertThat("/index.html", is(url)); + } + + + + @Test + public void url_파라메터_제거버전() { + + String pullUrl = "/index.html?name=123&password=1234"; + + String url = HeaderUtil.getRealUrl(pullUrl); + + assertThat("/index.html", is(url)); + } + + @Test + public void url_제거버전() { + + String pullUrl = "/index.html?name=123&password=1234"; + + String url = HeaderUtil.getParamInUrl(pullUrl); + + assertThat("name=123&password=1234", is(url)); + } + + @Test + public void url_제거버전2() { + + String pullUrl = "/index.html"; + + String url = HeaderUtil.getParamInUrl(pullUrl); + + assertThat("", is(url)); + } + + @Test + public void paramToMap() { + + String pullUrl = "name=123&password=1234"; + + Map map = HeaderUtil.paramToMap(pullUrl); + + assertThat("123", is(map.get("name"))); + assertThat("1234", is(map.get("password"))); + } +} diff --git a/webapp/user/form.html b/webapp/user/form.html index 96fe1bd3a..f7a3b5612 100644 --- a/webapp/user/form.html +++ b/webapp/user/form.html @@ -75,7 +75,7 @@
-
+