From e3d811699c1cd9d096b0cc4d9c0f8ca6089bc99c Mon Sep 17 00:00:00 2001 From: han95210 Date: Mon, 16 Mar 2020 15:38:44 +0900 Subject: [PATCH 01/26] refactor : README.md update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ground Rule 추가 - Repository 관리 추가 - 커밋 메시지 가이드 추가 --- README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README.md b/README.md index dc88a3cd..75c05931 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,39 @@ ## 온라인 코드 리뷰 과정 * [텍스트와 이미지로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://github.com/code-squad/codesquad-docs/blob/master/codereview/README.md) * [동영상으로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://youtu.be/a5c9ku-_fok) + +------------- + +##Ground Rule +* 컴퓨터 사용은 50분 단위로 교체하기로 한다. + * 작업한 것을 커밋한다. (master) +* 최소 각자 2번은 진행한다. +* 화 : 13시-17시 +* 수 : 12시-14시 +* daily scrum + * 끝나고 1시간 진행하기로 한다. + +##Repository 관리 +* 하나의 repo를 공유한다. + * https://github.com/Hamill210/java-was +* 해야할 일들을 issue에 기록한다. +* branch는 3개가 있습니다 : Hamill, Dan, Master + * 각자의 branch로 작업을 하고 작업한 것을 master에 push한다. + * 다음 차례 사람은 master branch를 pull한다. + +## 커밋 메세지 가이드 +### Commit Type +* feat : 새로운 기능 추가 +* refactor : 코드 리팩토링 + +### 꼬리말 footer +* associate with : #이슈번호 + +```aidl +feat : index page 구현 + +- 페이지 호출 + - /resource/index.html 호출 + +associate with : #1 +``` From 5543bbdba0dfe543f3f3cd3e782ddfb4f82b9a70 Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Mon, 16 Mar 2020 16:51:45 +0900 Subject: [PATCH 02/26] =?UTF-8?q?refactor=20:=20README.md=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8,=20Handlebar=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Handlebar 수정 중 associate with : #1 --- README.md | 4 +- src/main/java/webserver/RequestHandler.java | 93 ++++++++++++--------- 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 75c05931..bf4e45e5 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ------------- -##Ground Rule +## Ground Rule * 컴퓨터 사용은 50분 단위로 교체하기로 한다. * 작업한 것을 커밋한다. (master) * 최소 각자 2번은 진행한다. @@ -21,7 +21,7 @@ * daily scrum * 끝나고 1시간 진행하기로 한다. -##Repository 관리 +## Repository 관리 * 하나의 repo를 공유한다. * https://github.com/Hamill210/java-was * 해야할 일들을 issue에 기록한다. diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 90195ec4..6c2d87e0 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -1,55 +1,68 @@ package webserver; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.*; +import java.net.Socket; +import java.util.List; +import java.util.stream.Collectors; + public class RequestHandler extends Thread { - private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); + private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); - private Socket connection; + private Socket connection; - public RequestHandler(Socket connectionSocket) { - this.connection = connectionSocket; - } + public RequestHandler(Socket connectionSocket) { + this.connection = connectionSocket; + } + + public void run() { + log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(), + connection.getPort()); + + try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { + // TODO 사용자 요청에 대한 처리는 이 곳에 구현하면 된다. + DataOutputStream dos = new DataOutputStream(out); + byte[] body = "Hello World".getBytes(); + // log.debug("### run"); + + BufferedReader buffer = new BufferedReader(new InputStreamReader(in, "UTF-8")); + String line; + + // while (!"".equals(line = buffer.readLine())) { + // if (line == null) break; + // log.debug("### : {}", line); + // } + + List inputList = buffer.lines().collect(Collectors.toList()); + + log.debug("### : end of request"); - public void run() { - log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(), - connection.getPort()); - - 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) { - log.error(e.getMessage()); - } + response200Header(dos, body.length); + responseBody(dos, body); + } catch (IOException e) { + log.error(e.getMessage()); } + } - private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { - try { - dos.writeBytes("HTTP/1.1 200 OK \r\n"); - dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n"); - dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); - dos.writeBytes("\r\n"); - } catch (IOException e) { - log.error(e.getMessage()); - } + private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { + try { + dos.writeBytes("HTTP/1.1 200 OK \r\n"); + dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n"); + dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); + dos.writeBytes("\r\n"); + } catch (IOException e) { + log.error(e.getMessage()); } + } - private void responseBody(DataOutputStream dos, byte[] body) { - try { - dos.write(body, 0, body.length); - dos.flush(); - } catch (IOException e) { - log.error(e.getMessage()); - } + private void responseBody(DataOutputStream dos, byte[] body) { + try { + dos.write(body, 0, body.length); + dos.flush(); + } catch (IOException e) { + log.error(e.getMessage()); } + } } From cac0a794ca40034bc82e85923821c3372474c81b Mon Sep 17 00:00:00 2001 From: han95210 Date: Mon, 16 Mar 2020 18:01:25 +0900 Subject: [PATCH 03/26] =?UTF-8?q?refactor=20:=20Handlebar=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 Request Header 출력하기 - Request Line에서 path 분리하기 - path에 해당하는 파일 읽어 응답하기 associate with : #1 --- src/main/java/webserver/RequestHandler.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 6c2d87e0..b40ddc1c 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -5,6 +5,8 @@ import java.io.*; import java.net.Socket; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; @@ -19,12 +21,12 @@ public RequestHandler(Socket connectionSocket) { public void run() { log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(), - connection.getPort()); + connection.getPort()); try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { // TODO 사용자 요청에 대한 처리는 이 곳에 구현하면 된다. DataOutputStream dos = new DataOutputStream(out); - byte[] body = "Hello World".getBytes(); +// byte[] body = "Hello World".getBytes(); // log.debug("### run"); BufferedReader buffer = new BufferedReader(new InputStreamReader(in, "UTF-8")); @@ -36,7 +38,15 @@ public void run() { // } List inputList = buffer.lines().collect(Collectors.toList()); + String[] requestLine = inputList.get(0).split(" "); + String requestUrl =requestLine[1]; + log.debug("### : {}", requestUrl); + + File requestFile = new File("./webapp" + requestUrl); + byte[] body = Files.readAllBytes(requestFile.toPath()); + + log.debug("### body : {}", new String(body)); log.debug("### : end of request"); response200Header(dos, body.length); From 4116dd65fa6274f15159144f7588ee2f9f446fa6 Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Mon, 16 Mar 2020 20:26:06 +0900 Subject: [PATCH 04/26] =?UTF-8?q?refactor=20:=20Day1=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20Step1.=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD1=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - index.html 완료 associate with : #1 --- retrospective/Day1.md | 29 +++++++++++++++ src/main/java/webserver/RequestHandler.java | 40 +++++++++------------ src/main/resources/logback.xml | 2 +- 3 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 retrospective/Day1.md diff --git a/retrospective/Day1.md b/retrospective/Day1.md new file mode 100644 index 00000000..7e206dbd --- /dev/null +++ b/retrospective/Day1.md @@ -0,0 +1,29 @@ +# Day 1 + +## 오늘한 것 +- [ ] http://localhost:8080/index.html 로 접속했을 때 webapp 디렉토리의 index.html 파일을 읽어 클라이언트에 응답합니다. + - index.html 호출 성공 + - css 호출 실패 + +## 내일 할 것 +- Step1. 요구사항 2 + +## 키워드 +- favicon.ico +- 이게 되는 이유 +`!"".equals(line = br.readLine())` +- 프로그램을 종료해도 Listen 이 남아있는 이유 +- Http request, response Header 만 공부 + - request line + +## 느낀점 +### 좋은 점 +- Hamill + - 몰랐던 기능을 옆에서 볼 수 있었다 +### 나쁜 점 +- Hamill + - 문제 상황을 좀 더 공유해줬으면 좋겠다 + +### Dan +- 어떻게 해야 반복적인 것을 잘할 수 있을지 고민 중 + diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index b40ddc1c..8c2ebbd8 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -6,13 +6,10 @@ import java.io.*; import java.net.Socket; import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.stream.Collectors; public class RequestHandler extends Thread { - private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); + private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); private Socket connection; public RequestHandler(Socket connectionSocket) { @@ -20,33 +17,27 @@ public RequestHandler(Socket connectionSocket) { } public void run() { - log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(), - connection.getPort()); + log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(), connection.getPort()); try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { // TODO 사용자 요청에 대한 처리는 이 곳에 구현하면 된다. - DataOutputStream dos = new DataOutputStream(out); -// byte[] body = "Hello World".getBytes(); - // log.debug("### run"); + log.debug("### run"); - BufferedReader buffer = new BufferedReader(new InputStreamReader(in, "UTF-8")); - String line; - - // while (!"".equals(line = buffer.readLine())) { - // if (line == null) break; - // log.debug("### : {}", line); - // } + DataOutputStream dos = new DataOutputStream(out); + BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); + String[] tokens = new String[3]; + String line = null; - List inputList = buffer.lines().collect(Collectors.toList()); - String[] requestLine = inputList.get(0).split(" "); - String requestUrl =requestLine[1]; + while (!"".equals(line = br.readLine()) || line == null) { + if (line.startsWith("GET")) { + tokens = line.split(" "); + } + log.debug("{}", line); + } - log.debug("### : {}", requestUrl); - File requestFile = new File("./webapp" + requestUrl); - byte[] body = Files.readAllBytes(requestFile.toPath()); + byte[] body = Files.readAllBytes(new File("./webapp" + tokens[1]).toPath()); - log.debug("### body : {}", new String(body)); log.debug("### : end of request"); response200Header(dos, body.length); @@ -58,10 +49,12 @@ public void run() { private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { try { + log.debug("### response200Header, {}", lengthOfBodyContent); dos.writeBytes("HTTP/1.1 200 OK \r\n"); dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n"); dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); dos.writeBytes("\r\n"); + } catch (IOException e) { log.error(e.getMessage()); } @@ -69,6 +62,7 @@ private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { private void responseBody(DataOutputStream dos, byte[] body) { try { + log.debug("### DataOutputStream"); dos.write(body, 0, body.length); dos.flush(); } catch (IOException e) { diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index ed8ef09e..f276591f 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -10,4 +10,4 @@ - \ No newline at end of file + From 84abfbb09b73774d200c44c50e86498a436a6c1d Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Mon, 16 Mar 2020 21:58:37 +0900 Subject: [PATCH 05/26] =?UTF-8?q?refactor=20:=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=EB=A5=BC=20wiki=20=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ground Rule wiki 로 이동 - Day 의 회고는 issue 로 관리 --- README.md | 33 +-------------------------------- retrospective/Day1.md | 11 ----------- 2 files changed, 1 insertion(+), 43 deletions(-) diff --git a/README.md b/README.md index bf4e45e5..27a5e2a4 100644 --- a/README.md +++ b/README.md @@ -13,35 +13,4 @@ ------------- ## Ground Rule -* 컴퓨터 사용은 50분 단위로 교체하기로 한다. - * 작업한 것을 커밋한다. (master) -* 최소 각자 2번은 진행한다. -* 화 : 13시-17시 -* 수 : 12시-14시 -* daily scrum - * 끝나고 1시간 진행하기로 한다. - -## Repository 관리 -* 하나의 repo를 공유한다. - * https://github.com/Hamill210/java-was -* 해야할 일들을 issue에 기록한다. -* branch는 3개가 있습니다 : Hamill, Dan, Master - * 각자의 branch로 작업을 하고 작업한 것을 master에 push한다. - * 다음 차례 사람은 master branch를 pull한다. - -## 커밋 메세지 가이드 -### Commit Type -* feat : 새로운 기능 추가 -* refactor : 코드 리팩토링 - -### 꼬리말 footer -* associate with : #이슈번호 - -```aidl -feat : index page 구현 - -- 페이지 호출 - - /resource/index.html 호출 - -associate with : #1 -``` +https://github.com/Hamill210/java-was.wiki.git diff --git a/retrospective/Day1.md b/retrospective/Day1.md index 7e206dbd..eaf53b44 100644 --- a/retrospective/Day1.md +++ b/retrospective/Day1.md @@ -16,14 +16,3 @@ - Http request, response Header 만 공부 - request line -## 느낀점 -### 좋은 점 -- Hamill - - 몰랐던 기능을 옆에서 볼 수 있었다 -### 나쁜 점 -- Hamill - - 문제 상황을 좀 더 공유해줬으면 좋겠다 - -### Dan -- 어떻게 해야 반복적인 것을 잘할 수 있을지 고민 중 - From 200f7e6463d6131d62b7d78bed7c156a82583cb9 Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Tue, 17 Mar 2020 12:23:33 +0900 Subject: [PATCH 06/26] =?UTF-8?q?refactor=20:=20RequestHandler=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 상대 경로였던 프로그램 경로를 절대 경로로 수정 --- src/main/java/webserver/RequestHandler.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 8c2ebbd8..0d21dc65 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -10,6 +10,7 @@ public class RequestHandler extends Thread { private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); + private final String WEBAPP_PATH = System.getProperty("user.dir") + "/webapp"; private Socket connection; public RequestHandler(Socket connectionSocket) { @@ -35,10 +36,8 @@ public void run() { log.debug("{}", line); } - - byte[] body = Files.readAllBytes(new File("./webapp" + tokens[1]).toPath()); - - log.debug("### : end of request"); + File uriFile = new File(WEBAPP_PATH + tokens[1]); + byte[] body = Files.readAllBytes(uriFile.toPath()); response200Header(dos, body.length); responseBody(dos, body); From d48b5d30fa066bfa0102cfb9d349732d919c724b Mon Sep 17 00:00:00 2001 From: han95210 Date: Tue, 17 Mar 2020 14:53:28 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - UserController 클래스 추가 - WelcomeController 클래스 추가 - HttpRequestUtils 클래스에 parseUriString 메서드 추가 associate with : #2 --- src/main/java/Controller/UserController.java | 23 +++++++++++++++++++ .../java/Controller/WelcomController.java | 5 ++++ src/main/java/util/HttpRequestUtils.java | 4 ++++ src/test/java/util/HttpRequestUtilsTest.java | 13 +++++++++++ 4 files changed, 45 insertions(+) create mode 100644 src/main/java/Controller/UserController.java create mode 100644 src/main/java/Controller/WelcomController.java diff --git a/src/main/java/Controller/UserController.java b/src/main/java/Controller/UserController.java new file mode 100644 index 00000000..a378a4ff --- /dev/null +++ b/src/main/java/Controller/UserController.java @@ -0,0 +1,23 @@ +package Controller; + +import util.HttpRequestUtils; + +import java.util.Map; +import java.util.Set; + +public class UserController { + + public String create(String uriString) { + Map parameters = HttpRequestUtils.parseUriString(uriString); + + String[] userInfo = new String[4]; + + Set keys = parameters.keySet(); + parameters.get(key); + + for (String key : parameters.keySet()) { + parameters.get(key); + } + } + +} diff --git a/src/main/java/Controller/WelcomController.java b/src/main/java/Controller/WelcomController.java new file mode 100644 index 00000000..485fee7a --- /dev/null +++ b/src/main/java/Controller/WelcomController.java @@ -0,0 +1,5 @@ +package Controller; + +public class WelcomController { + +} diff --git a/src/main/java/util/HttpRequestUtils.java b/src/main/java/util/HttpRequestUtils.java index c4cd95c0..404f52f3 100644 --- a/src/main/java/util/HttpRequestUtils.java +++ b/src/main/java/util/HttpRequestUtils.java @@ -17,6 +17,10 @@ public static Map parseQueryString(String queryString) { return parseValues(queryString, "&"); } + public static Map parseUriString(String uriString) { + return parseValues(uriString, "&"); + } + /** * @param 쿠키 * 값은 name1=value1; name2=value2 형식임 diff --git a/src/test/java/util/HttpRequestUtilsTest.java b/src/test/java/util/HttpRequestUtilsTest.java index a4265f5e..027a53ac 100644 --- a/src/test/java/util/HttpRequestUtilsTest.java +++ b/src/test/java/util/HttpRequestUtilsTest.java @@ -4,12 +4,25 @@ import static org.junit.Assert.*; import java.util.Map; +import java.util.Set; import org.junit.Test; import util.HttpRequestUtils.Pair; public class HttpRequestUtilsTest { + + @Test + public void parseUriString() { + String uriString = "userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net"; + Map parameters = HttpRequestUtils.parseUriString(uriString); + + assertEquals("javajigi", parameters.get("userId")); + assertEquals("password", parameters.get("password")); + assertEquals("%EB%B0%95%EC%9E%AC%EC%84%B1", parameters.get("name")); + assertEquals("javajigi%40slipp.net", parameters.get("email")); + } + @Test public void parseQueryString() { String queryString = "userId=javajigi"; From a46ac311cd4df4366dac65b90d55a82b2f37931c Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Tue, 17 Mar 2020 15:52:26 +0900 Subject: [PATCH 08/26] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WelcomeController 추가 - UserController 추가 - User 생성자 추가 (매개변수 userParameterMap) associate with #2 --- src/main/java/Controller/UserController.java | 15 +--- .../java/Controller/WelcomController.java | 5 -- .../java/Controller/WelcomeController.java | 12 +++ src/main/java/model/User.java | 90 ++++++++++++------- 4 files changed, 74 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/Controller/WelcomController.java create mode 100644 src/main/java/Controller/WelcomeController.java diff --git a/src/main/java/Controller/UserController.java b/src/main/java/Controller/UserController.java index a378a4ff..76a89768 100644 --- a/src/main/java/Controller/UserController.java +++ b/src/main/java/Controller/UserController.java @@ -1,23 +1,16 @@ package Controller; +import model.User; import util.HttpRequestUtils; import java.util.Map; -import java.util.Set; public class UserController { - public String create(String uriString) { + public static User create(String uriString) { Map parameters = HttpRequestUtils.parseUriString(uriString); + User user = new User(parameters); - String[] userInfo = new String[4]; - - Set keys = parameters.keySet(); - parameters.get(key); - - for (String key : parameters.keySet()) { - parameters.get(key); - } + return user; } - } diff --git a/src/main/java/Controller/WelcomController.java b/src/main/java/Controller/WelcomController.java deleted file mode 100644 index 485fee7a..00000000 --- a/src/main/java/Controller/WelcomController.java +++ /dev/null @@ -1,5 +0,0 @@ -package Controller; - -public class WelcomController { - -} diff --git a/src/main/java/Controller/WelcomeController.java b/src/main/java/Controller/WelcomeController.java new file mode 100644 index 00000000..366642ef --- /dev/null +++ b/src/main/java/Controller/WelcomeController.java @@ -0,0 +1,12 @@ +package Controller; + +import model.User; + +public class WelcomeController { + + public void doWork(String[] tokens) { + if (tokens[1].startsWith("/user/create")) { + User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); + } + } +} diff --git a/src/main/java/model/User.java b/src/main/java/model/User.java index b7abb730..63879ece 100644 --- a/src/main/java/model/User.java +++ b/src/main/java/model/User.java @@ -1,36 +1,62 @@ package model; +import java.util.Map; +import java.util.Objects; + public class User { - private String userId; - private String password; - private String name; - private String email; - - public User(String userId, String password, String name, String email) { - this.userId = userId; - this.password = password; - this.name = name; - this.email = email; - } - - public String getUserId() { - return userId; - } - - public String getPassword() { - return password; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - @Override - public String toString() { - return "User [userId=" + userId + ", password=" + password + ", name=" + name + ", email=" + email + "]"; - } + private String userId; + private String password; + private String name; + private String email; + + public User(String userId, String password, String name, String email) { + this.userId = userId; + this.password = password; + this.name = name; + this.email = email; + } + + public User(Map userParameterMap) { + this.userId = userParameterMap.get("userId"); + this.password = userParameterMap.get("password"); + this.name = userParameterMap.get("name"); + this.email = userParameterMap.get("email"); + } + + public String getUserId() { + return userId; + } + + public String getPassword() { + return password; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof User)) return false; + User user = (User) o; + return Objects.equals(getUserId(), user.getUserId()) && + Objects.equals(getPassword(), user.getPassword()) && + Objects.equals(getName(), user.getName()) && + Objects.equals(getEmail(), user.getEmail()); + } + + @Override + public int hashCode() { + return Objects.hash(getUserId(), getPassword(), getName(), getEmail()); + } + + @Override + public String toString() { + return "User [userId=" + userId + ", password=" + password + ", name=" + name + ", email=" + email + "]"; + } } From f0511eeeaf7902893d01826c7dec24fd5ae4abe0 Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Tue, 17 Mar 2020 15:53:18 +0900 Subject: [PATCH 09/26] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 코드 정리 - Test case 추가 associate with #2 --- src/main/java/webserver/RequestHandler.java | 5 +- src/main/java/webserver/WebServer.java | 44 +++--- src/test/java/controller/UserTest.java | 18 +++ src/test/java/controller/WelcomeTest.java | 18 +++ src/test/java/util/HttpRequestUtilsTest.java | 154 +++++++++---------- 5 files changed, 139 insertions(+), 100 deletions(-) create mode 100644 src/test/java/controller/UserTest.java create mode 100644 src/test/java/controller/WelcomeTest.java diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 0d21dc65..31979fd7 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -1,5 +1,6 @@ package webserver; +import Controller.WelcomeController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,9 +34,11 @@ public void run() { if (line.startsWith("GET")) { tokens = line.split(" "); } - log.debug("{}", line); } + WelcomeController wc = new WelcomeController(); + wc.doWork(tokens); + File uriFile = new File(WEBAPP_PATH + tokens[1]); byte[] body = Files.readAllBytes(uriFile.toPath()); diff --git a/src/main/java/webserver/WebServer.java b/src/main/java/webserver/WebServer.java index 91f4a0fb..284657a8 100644 --- a/src/main/java/webserver/WebServer.java +++ b/src/main/java/webserver/WebServer.java @@ -1,34 +1,34 @@ package webserver; -import java.net.ServerSocket; -import java.net.Socket; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.net.ServerSocket; +import java.net.Socket; + public class WebServer { - private static final Logger log = LoggerFactory.getLogger(WebServer.class); - private static final int DEFAULT_PORT = 8080; + private static final Logger log = LoggerFactory.getLogger(WebServer.class); + private static final int DEFAULT_PORT = 8080; - public static void main(String args[]) throws Exception { - int port = 0; - if (args == null || args.length == 0) { - port = DEFAULT_PORT; - } else { - port = Integer.parseInt(args[0]); - } + public static void main(String args[]) throws Exception { + int port = 0; + if (args == null || args.length == 0) { + port = DEFAULT_PORT; + } else { + port = Integer.parseInt(args[0]); + } - // 서버소켓을 생성한다. 웹서버는 기본적으로 8080번 포트를 사용한다. + // 서버소켓을 생성한다. 웹서버는 기본적으로 8080번 포트를 사용한다. - try (ServerSocket listenSocket = new ServerSocket(port)) { - log.info("Web Application Server started {} port.", port); + try (ServerSocket listenSocket = new ServerSocket(port)) { + log.info("Web Application Server started {} port.", port); - // 클라이언트가 연결될때까지 대기한다. - Socket connection; - while ((connection = listenSocket.accept()) != null) { - RequestHandler requestHandler = new RequestHandler(connection); - requestHandler.start(); - } - } + // 클라이언트가 연결될때까지 대기한다. + Socket connection; + while ((connection = listenSocket.accept()) != null) { + RequestHandler requestHandler = new RequestHandler(connection); + requestHandler.start(); + } } + } } diff --git a/src/test/java/controller/UserTest.java b/src/test/java/controller/UserTest.java new file mode 100644 index 00000000..e0bd8955 --- /dev/null +++ b/src/test/java/controller/UserTest.java @@ -0,0 +1,18 @@ +package controller; + +import Controller.UserController; +import model.User; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class UserTest { + + @Test + public void create() { + String uriString = "userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net"; + + User expectedUser = new User("javajigi", "password", "%EB%B0%95%EC%9E%AC%EC%84%B1", "javajigi%40slipp.net"); + assertEquals(expectedUser, UserController.create(uriString)); + } +} diff --git a/src/test/java/controller/WelcomeTest.java b/src/test/java/controller/WelcomeTest.java new file mode 100644 index 00000000..ec9a5025 --- /dev/null +++ b/src/test/java/controller/WelcomeTest.java @@ -0,0 +1,18 @@ +package controller; + +import Controller.WelcomeController; +import org.junit.Test; + +public class WelcomeTest { + + WelcomeController wc = new WelcomeController(); + + @Test + public void doWork() { + String requestLine = + "GET /user/create?userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net HTTP/1.1"; + String[] tokens = requestLine.split(" "); + + wc.doWork(tokens); + } +} diff --git a/src/test/java/util/HttpRequestUtilsTest.java b/src/test/java/util/HttpRequestUtilsTest.java index 027a53ac..f738a963 100644 --- a/src/test/java/util/HttpRequestUtilsTest.java +++ b/src/test/java/util/HttpRequestUtilsTest.java @@ -1,86 +1,86 @@ package util; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; +import org.junit.Test; +import util.HttpRequestUtils.Pair; import java.util.Map; -import java.util.Set; -import org.junit.Test; - -import util.HttpRequestUtils.Pair; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; public class HttpRequestUtilsTest { - @Test - public void parseUriString() { - String uriString = "userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net"; - Map parameters = HttpRequestUtils.parseUriString(uriString); - - assertEquals("javajigi", parameters.get("userId")); - assertEquals("password", parameters.get("password")); - assertEquals("%EB%B0%95%EC%9E%AC%EC%84%B1", parameters.get("name")); - assertEquals("javajigi%40slipp.net", parameters.get("email")); - } - - @Test - public void parseQueryString() { - String queryString = "userId=javajigi"; - Map parameters = HttpRequestUtils.parseQueryString(queryString); - assertThat(parameters.get("userId"), is("javajigi")); - assertThat(parameters.get("password"), is(nullValue())); - - queryString = "userId=javajigi&password=password2"; - parameters = HttpRequestUtils.parseQueryString(queryString); - assertThat(parameters.get("userId"), is("javajigi")); - assertThat(parameters.get("password"), is("password2")); - } - - @Test - public void parseQueryString_null() { - Map parameters = HttpRequestUtils.parseQueryString(null); - assertThat(parameters.isEmpty(), is(true)); - - parameters = HttpRequestUtils.parseQueryString(""); - assertThat(parameters.isEmpty(), is(true)); - - parameters = HttpRequestUtils.parseQueryString(" "); - assertThat(parameters.isEmpty(), is(true)); - } - - @Test - public void parseQueryString_invalid() { - String queryString = "userId=javajigi&password"; - Map parameters = HttpRequestUtils.parseQueryString(queryString); - assertThat(parameters.get("userId"), is("javajigi")); - assertThat(parameters.get("password"), is(nullValue())); - } - - @Test - public void parseCookies() { - String cookies = "logined=true; JSessionId=1234"; - Map parameters = HttpRequestUtils.parseCookies(cookies); - assertThat(parameters.get("logined"), is("true")); - assertThat(parameters.get("JSessionId"), is("1234")); - assertThat(parameters.get("session"), is(nullValue())); - } - - @Test - public void getKeyValue() throws Exception { - Pair pair = HttpRequestUtils.getKeyValue("userId=javajigi", "="); - assertThat(pair, is(new Pair("userId", "javajigi"))); - } - - @Test - public void getKeyValue_invalid() throws Exception { - Pair pair = HttpRequestUtils.getKeyValue("userId", "="); - assertThat(pair, is(nullValue())); - } - - @Test - public void parseHeader() throws Exception { - String header = "Content-Length: 59"; - Pair pair = HttpRequestUtils.parseHeader(header); - assertThat(pair, is(new Pair("Content-Length", "59"))); - } + @Test + public void parseUriString() { + String uriString = "userId=javajigi&password=password&name=%EB%B0%95%EC%9E%AC%EC%84%B1&email=javajigi%40slipp.net"; + Map parameters = HttpRequestUtils.parseUriString(uriString); + + assertEquals("javajigi", parameters.get("userId")); + assertEquals("password", parameters.get("password")); + assertEquals("%EB%B0%95%EC%9E%AC%EC%84%B1", parameters.get("name")); + assertEquals("javajigi%40slipp.net", parameters.get("email")); + } + + @Test + public void parseQueryString() { + String queryString = "userId=javajigi"; + Map parameters = HttpRequestUtils.parseQueryString(queryString); + assertThat(parameters.get("userId"), is("javajigi")); + assertThat(parameters.get("password"), is(nullValue())); + + queryString = "userId=javajigi&password=password2"; + parameters = HttpRequestUtils.parseQueryString(queryString); + assertThat(parameters.get("userId"), is("javajigi")); + assertThat(parameters.get("password"), is("password2")); + } + + @Test + public void parseQueryString_null() { + Map parameters = HttpRequestUtils.parseQueryString(null); + assertThat(parameters.isEmpty(), is(true)); + + parameters = HttpRequestUtils.parseQueryString(""); + assertThat(parameters.isEmpty(), is(true)); + + parameters = HttpRequestUtils.parseQueryString(" "); + assertThat(parameters.isEmpty(), is(true)); + } + + @Test + public void parseQueryString_invalid() { + String queryString = "userId=javajigi&password"; + Map parameters = HttpRequestUtils.parseQueryString(queryString); + assertThat(parameters.get("userId"), is("javajigi")); + assertThat(parameters.get("password"), is(nullValue())); + } + + @Test + public void parseCookies() { + String cookies = "logined=true; JSessionId=1234"; + Map parameters = HttpRequestUtils.parseCookies(cookies); + assertThat(parameters.get("logined"), is("true")); + assertThat(parameters.get("JSessionId"), is("1234")); + assertThat(parameters.get("session"), is(nullValue())); + } + + @Test + public void getKeyValue() throws Exception { + Pair pair = HttpRequestUtils.getKeyValue("userId=javajigi", "="); + assertThat(pair, is(new Pair("userId", "javajigi"))); + } + + @Test + public void getKeyValue_invalid() throws Exception { + Pair pair = HttpRequestUtils.getKeyValue("userId", "="); + assertThat(pair, is(nullValue())); + } + + @Test + public void parseHeader() throws Exception { + String header = "Content-Length: 59"; + Pair pair = HttpRequestUtils.parseHeader(header); + assertThat(pair, is(new Pair("Content-Length", "59"))); + } } From 82dce59f3d9566c8a37ddf1a440678364745ba13 Mon Sep 17 00:00:00 2001 From: han95210 Date: Tue, 17 Mar 2020 16:55:55 +0900 Subject: [PATCH 10/26] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - user/form.html 수정 * requestHeader, requestBody 메서드 추가 및 수정 중 associate with : #6 --- src/main/java/Controller/PageController.java | 26 +++++++++ src/main/java/webserver/RequestHandler.java | 58 +++++++++++++++----- src/test/java/util/HttpRequestUtilsTest.java | 1 + webapp/user/form.html | 4 +- 4 files changed, 74 insertions(+), 15 deletions(-) create mode 100644 src/main/java/Controller/PageController.java diff --git a/src/main/java/Controller/PageController.java b/src/main/java/Controller/PageController.java new file mode 100644 index 00000000..b5737c70 --- /dev/null +++ b/src/main/java/Controller/PageController.java @@ -0,0 +1,26 @@ +package Controller; + +import model.User; + +public class PageController { + + public void doWork(String[] tokens) { + + switch(tokens[0]) { + case "GET": + break; + case "POST": + if (tokens[1].startsWith("/user/create")) { + User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); + } + break; + default: + break; + } + + + if (tokens[1].startsWith("/user/create")) { + User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); + } + } +} diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 31979fd7..27b10538 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -7,6 +7,8 @@ import java.io.*; import java.net.Socket; import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; public class RequestHandler extends Thread { @@ -30,21 +32,29 @@ public void run() { String[] tokens = new String[3]; String line = null; - while (!"".equals(line = br.readLine()) || line == null) { - if (line.startsWith("GET")) { - tokens = line.split(" "); - } - } +// while (!"".equals(line = br.readLine()) || line == null) { +// if (line.startsWith("GET")) { +// tokens = line.split(" "); +// } +// } - WelcomeController wc = new WelcomeController(); - wc.doWork(tokens); + List requestHeaders = requestHeader(br); + log.debug("### requestHeader : {}", requestHeaders); + List requestBodys = requestBody(br); + log.debug("### requestBody : {}", requestBodys); - File uriFile = new File(WEBAPP_PATH + tokens[1]); - byte[] body = Files.readAllBytes(uriFile.toPath()); - - response200Header(dos, body.length); - responseBody(dos, body); - } catch (IOException e) { +// +// WelcomeController wc = new WelcomeController(); +// wc.doWork(tokens); +// +// File uriFile = new File(WEBAPP_PATH + tokens[1]); +// byte[] body = Files.readAllBytes(uriFile.toPath()); +// +// response200Header(dos, body.length); +// responseBody(dos, body); + } catch (IOException ie) { + log.error(ie.getMessage()); + } catch (Exception e) { log.error(e.getMessage()); } } @@ -62,6 +72,28 @@ private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { } } + private List requestHeader(BufferedReader br) throws Exception { + String line = null; + List requestHeaders = new ArrayList<>(); + + while (!"".equals(line = br.readLine()) || line == null) { + requestHeaders.add(line); + } + + return requestHeaders; + } + + private List requestBody(BufferedReader br) throws Exception { + String line = null; + List requestBody = new ArrayList<>(); + + while (!"".equals(line = br.readLine()) || line == null) { + requestBody.add(line); + } + + return requestBody; + } + private void responseBody(DataOutputStream dos, byte[] body) { try { log.debug("### DataOutputStream"); diff --git a/src/test/java/util/HttpRequestUtilsTest.java b/src/test/java/util/HttpRequestUtilsTest.java index f738a963..2dcdc59f 100644 --- a/src/test/java/util/HttpRequestUtilsTest.java +++ b/src/test/java/util/HttpRequestUtilsTest.java @@ -2,6 +2,7 @@ import org.junit.Test; import util.HttpRequestUtils.Pair; +import webserver.RequestHandler; import java.util.Map; diff --git a/webapp/user/form.html b/webapp/user/form.html index 96fe1bd3..587a9d68 100644 --- a/webapp/user/form.html +++ b/webapp/user/form.html @@ -75,7 +75,7 @@
-
+
@@ -104,4 +104,4 @@ - \ No newline at end of file + From 809b9803ae0fc11362119265ce9347cbcad2429e Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Tue, 17 Mar 2020 17:53:26 +0900 Subject: [PATCH 11/26] =?UTF-8?q?feat=20:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EA=B5=AC=ED=98=84=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - requestBody 가져오기 associate with #6 --- src/main/java/Controller/PageController.java | 22 +++++++--- src/main/java/webserver/RequestHandler.java | 46 ++++++++++++-------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/main/java/Controller/PageController.java b/src/main/java/Controller/PageController.java index b5737c70..7167d636 100644 --- a/src/main/java/Controller/PageController.java +++ b/src/main/java/Controller/PageController.java @@ -1,13 +1,23 @@ package Controller; import model.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import webserver.RequestHandler; public class PageController { + private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); - public void doWork(String[] tokens) { + public String doWork(String requestLine) { + log.debug("### dowork"); + String[] tokens = requestLine.split(" "); - switch(tokens[0]) { + switch (tokens[0]) { case "GET": + log.debug("### dowork : GET"); + if (tokens[1].equals("/user/form.html")) { + return "/user/form.html"; + } break; case "POST": if (tokens[1].startsWith("/user/create")) { @@ -19,8 +29,10 @@ public void doWork(String[] tokens) { } - if (tokens[1].startsWith("/user/create")) { - User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); - } + // if (tokens[1].startsWith("/user/create")) { + // User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); + // } + + return ""; } } diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 27b10538..c4ef6a8b 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -1,8 +1,9 @@ package webserver; -import Controller.WelcomeController; +import Controller.PageController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import util.IOUtils; import java.io.*; import java.net.Socket; @@ -32,26 +33,31 @@ public void run() { String[] tokens = new String[3]; String line = null; -// while (!"".equals(line = br.readLine()) || line == null) { -// if (line.startsWith("GET")) { -// tokens = line.split(" "); -// } -// } + // while (!"".equals(line = br.readLine()) || line == null) { + // if (line.startsWith("GET")) { + // tokens = line.split(" "); + // } + // } List requestHeaders = requestHeader(br); log.debug("### requestHeader : {}", requestHeaders); + // log.debug("### readLine : {}", ((line = br.readLine()) == null) ? "null" : line); + // log.debug("### readLine : {}", br.readLine()); + // log.debug("### readLine : {}", br.readLine()); + // log.debug("### readLine : {}", br.readLine()); List requestBodys = requestBody(br); log.debug("### requestBody : {}", requestBodys); -// -// WelcomeController wc = new WelcomeController(); -// wc.doWork(tokens); -// -// File uriFile = new File(WEBAPP_PATH + tokens[1]); -// byte[] body = Files.readAllBytes(uriFile.toPath()); -// -// response200Header(dos, body.length); -// responseBody(dos, body); + // + PageController wc = new PageController(); + String redirectUrl = wc.doWork(requestHeaders.get(0)); + // + // File uriFile = new File(WEBAPP_PATH + tokens[1]); + File uriFile = new File(WEBAPP_PATH + redirectUrl); + byte[] body = Files.readAllBytes(uriFile.toPath()); + // + response200Header(dos, body.length); + responseBody(dos, body); } catch (IOException ie) { log.error(ie.getMessage()); } catch (Exception e) { @@ -76,9 +82,11 @@ private List requestHeader(BufferedReader br) throws Exception { String line = null; List requestHeaders = new ArrayList<>(); + log.debug("### requestheader before : {}", br.ready()); while (!"".equals(line = br.readLine()) || line == null) { requestHeaders.add(line); } + log.debug("### requestheader after : {}", br.ready()); return requestHeaders; } @@ -87,10 +95,14 @@ private List requestBody(BufferedReader br) throws Exception { String line = null; List requestBody = new ArrayList<>(); - while (!"".equals(line = br.readLine()) || line == null) { - requestBody.add(line); + log.debug("### requestBody before {}", br.ready()); + + if (br.ready()) { + log.debug("### : " + IOUtils.readData(br, 57)); } + log.debug("### requestBody after {}", br.ready()); + return requestBody; } From 6365a0bc1e349d795bbc35ff3b1f0a006611d1c2 Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Tue, 17 Mar 2020 22:49:58 +0900 Subject: [PATCH 12/26] =?UTF-8?q?feat=20:=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=202,=203=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - requestLine, requestHeader, requestBody 를 나누어 구현 - Pair 객체를 사용 - GET /user/form.html 구현 - POST /user/create 구현 - WebServer 에 userDB 를 두어 User 정보를 관리 associate with #7, #8 --- src/main/java/Controller/PageController.java | 28 +-- src/main/java/Controller/UserController.java | 7 + .../java/Controller/WelcomeController.java | 6 + src/main/java/util/HttpRequestUtils.java | 201 ++++++++++-------- src/main/java/webserver/RequestHandler.java | 113 +++++----- src/main/java/webserver/WebServer.java | 5 + 6 files changed, 206 insertions(+), 154 deletions(-) diff --git a/src/main/java/Controller/PageController.java b/src/main/java/Controller/PageController.java index 7167d636..ee36c32d 100644 --- a/src/main/java/Controller/PageController.java +++ b/src/main/java/Controller/PageController.java @@ -1,38 +1,42 @@ package Controller; -import model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import util.HttpRequestUtils; import webserver.RequestHandler; +import webserver.WebServer; + +import java.util.Map; public class PageController { private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); - public String doWork(String requestLine) { + public String doWork(Map requestLine, String requestBody) { log.debug("### dowork"); - String[] tokens = requestLine.split(" "); - switch (tokens[0]) { + String method = requestLine.get("method").getValue(); + String requestUrl = requestLine.get("requestUrl").getValue(); + String protocol = requestLine.get("protocol").getValue(); + + switch (method) { case "GET": log.debug("### dowork : GET"); - if (tokens[1].equals("/user/form.html")) { + if (requestUrl.equals("/user/form.html")) { return "/user/form.html"; } break; case "POST": - if (tokens[1].startsWith("/user/create")) { - User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); + if (requestUrl.equals("/user/create")) { + + UserController.create(requestBody); + log.debug("### userDB : {}", WebServer.userDB); + return "/index.html"; } break; default: break; } - - // if (tokens[1].startsWith("/user/create")) { - // User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); - // } - return ""; } } diff --git a/src/main/java/Controller/UserController.java b/src/main/java/Controller/UserController.java index 76a89768..3ac5e847 100644 --- a/src/main/java/Controller/UserController.java +++ b/src/main/java/Controller/UserController.java @@ -1,15 +1,22 @@ package Controller; import model.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import util.HttpRequestUtils; +import webserver.RequestHandler; +import webserver.WebServer; import java.util.Map; public class UserController { + private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); public static User create(String uriString) { Map parameters = HttpRequestUtils.parseUriString(uriString); + log.debug("### parameters : {}", parameters); User user = new User(parameters); + WebServer.userDB.put(WebServer.userDB.size() + 1, user); return user; } diff --git a/src/main/java/Controller/WelcomeController.java b/src/main/java/Controller/WelcomeController.java index 366642ef..36338658 100644 --- a/src/main/java/Controller/WelcomeController.java +++ b/src/main/java/Controller/WelcomeController.java @@ -1,10 +1,16 @@ package Controller; import model.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import webserver.RequestHandler; public class WelcomeController { + private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); + public void doWork(String[] tokens) { + if (tokens[1].startsWith("/user/create")) { User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1)); } diff --git a/src/main/java/util/HttpRequestUtils.java b/src/main/java/util/HttpRequestUtils.java index 404f52f3..22429d15 100644 --- a/src/main/java/util/HttpRequestUtils.java +++ b/src/main/java/util/HttpRequestUtils.java @@ -1,113 +1,138 @@ package util; +import com.google.common.base.Strings; +import com.google.common.collect.Maps; + import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; -import com.google.common.base.Strings; -import com.google.common.collect.Maps; - +/** + * The type Http request utils. + */ public class HttpRequestUtils { - /** - * @param queryString은 - * URL에서 ? 이후에 전달되는 field1=value1&field2=value2 형식임 - * @return - */ - public static Map parseQueryString(String queryString) { - return parseValues(queryString, "&"); + /** + * @param queryString은 + * URL에서 ? 이후에 전달되는 field1=value1&field2=value2 형식임 + * @return + */ + public static Map parseQueryString(String queryString) { + return parseValues(queryString, "&"); + } + + public static Map parseUriString(String uriString) { + return parseValues(uriString, "&"); + } + + /** + * @param 쿠키 + * 값은 name1=value1; name2=value2 형식임 + * @return + */ + public static Map parseCookies(String cookies) { + return parseValues(cookies, ";"); + } + + private static Map parseValues(String values, String separator) { + if (Strings.isNullOrEmpty(values)) { + return Maps.newHashMap(); } - public static Map parseUriString(String uriString) { - return parseValues(uriString, "&"); - } + String[] tokens = values.split(separator); + return Arrays.stream(tokens).map(t -> getKeyValue(t, "=")).filter(p -> p != null) + .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); + } - /** - * @param 쿠키 - * 값은 name1=value1; name2=value2 형식임 - * @return - */ - public static Map parseCookies(String cookies) { - return parseValues(cookies, ";"); + static Pair getKeyValue(String keyValue, String regex) { + if (Strings.isNullOrEmpty(keyValue)) { + return null; } - private static Map parseValues(String values, String separator) { - if (Strings.isNullOrEmpty(values)) { - return Maps.newHashMap(); - } - - String[] tokens = values.split(separator); - return Arrays.stream(tokens).map(t -> getKeyValue(t, "=")).filter(p -> p != null) - .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue())); + String[] tokens = keyValue.split(regex); + if (tokens.length != 2) { + return null; } - static Pair getKeyValue(String keyValue, String regex) { - if (Strings.isNullOrEmpty(keyValue)) { - return null; - } - - String[] tokens = keyValue.split(regex); - if (tokens.length != 2) { - return null; - } - - return new Pair(tokens[0], tokens[1]); + return new Pair(tokens[0], tokens[1]); + } + + /** + * Feat : requestLine 을 파싱해줍니다. + * Desc : + * Return : Pair[] + */ + public static Pair[] parseRequestLine(String requestLine) { + Pair[] returnPairs = new Pair[3]; + String[] parseRequestLine = requestLine.split(" "); + returnPairs[0] = new Pair("method", parseRequestLine[0]); + returnPairs[1] = new Pair("requestUrl", parseRequestLine[1]); + returnPairs[2] = new Pair("protocol", parseRequestLine[2]); + + return returnPairs; + } + + public static Pair parseHeader(String header) { + return getKeyValue(header, ": "); + } + + public static class Pair { + String key; + String value; + + Pair(String key, String value) { + this.key = key.trim(); + this.value = value.trim(); } - public static Pair parseHeader(String header) { - return getKeyValue(header, ": "); + public String getKey() { + return key; } - public static class Pair { - String key; - String value; - - Pair(String key, String value) { - this.key = key.trim(); - this.value = value.trim(); - } - - public String getKey() { - return key; - } + public String getValue() { + return value; + } - public String getValue() { - return value; - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((key == null) ? 0 : key.hashCode()); - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Pair other = (Pair) obj; + if (key == null) { + if (other.key != null) { + return false; } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Pair other = (Pair) obj; - if (key == null) { - if (other.key != null) - return false; - } else if (!key.equals(other.key)) - return false; - if (value == null) { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; + } else if (!key.equals(other.key)) { + return false; + } + if (value == null) { + if (other.value != null) { + return false; } + } else if (!value.equals(other.value)) { + return false; + } + return true; + } - @Override - public String toString() { - return "Pair [key=" + key + ", value=" + value + "]"; - } + @Override + public String toString() { + return "Pair [key=" + key + ", value=" + value + "]"; } + } } diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index c4ef6a8b..32fb7f38 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -3,13 +3,17 @@ import Controller.PageController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import util.HttpRequestUtils; import util.IOUtils; import java.io.*; import java.net.Socket; import java.nio.file.Files; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import static util.HttpRequestUtils.Pair; public class RequestHandler extends Thread { @@ -30,32 +34,26 @@ public void run() { DataOutputStream dos = new DataOutputStream(out); BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); - String[] tokens = new String[3]; - String line = null; - - // while (!"".equals(line = br.readLine()) || line == null) { - // if (line.startsWith("GET")) { - // tokens = line.split(" "); - // } - // } - - List requestHeaders = requestHeader(br); - log.debug("### requestHeader : {}", requestHeaders); - // log.debug("### readLine : {}", ((line = br.readLine()) == null) ? "null" : line); - // log.debug("### readLine : {}", br.readLine()); - // log.debug("### readLine : {}", br.readLine()); - // log.debug("### readLine : {}", br.readLine()); - List requestBodys = requestBody(br); - log.debug("### requestBody : {}", requestBodys); - - // - PageController wc = new PageController(); - String redirectUrl = wc.doWork(requestHeaders.get(0)); - // - // File uriFile = new File(WEBAPP_PATH + tokens[1]); + + Map requestLine = requestLine(br); + log.debug("### requestLine : {}", requestLine); + Map requestHeader = requestHeader(br); + log.debug("### requestHeader : {}", requestHeader); + + String requestBody = ""; + if (requestHeader.containsKey("Content-Length")) { + log.debug("### Content-Length : {}", requestHeader.get("Content-Length").getValue()); + requestBody = requestBody(br + , Integer.parseInt(requestHeader.get("Content-Length").getValue())); + log.debug("### requestBody : {}", requestBody); + } + + PageController pc = new PageController(); + String redirectUrl = pc.doWork(requestLine, requestBody); + File uriFile = new File(WEBAPP_PATH + redirectUrl); byte[] body = Files.readAllBytes(uriFile.toPath()); - // + response200Header(dos, body.length); responseBody(dos, body); } catch (IOException ie) { @@ -65,45 +63,52 @@ public void run() { } } - private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { - try { - log.debug("### response200Header, {}", lengthOfBodyContent); - dos.writeBytes("HTTP/1.1 200 OK \r\n"); - dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n"); - dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); - dos.writeBytes("\r\n"); + /** + * @param br + * @return + * @throws Exception + */ - } catch (IOException e) { - log.error(e.getMessage()); - } + private Map requestLine(BufferedReader br) throws Exception { + if (!br.ready()) return new HashMap<>(); + + Map requestLine = new HashMap<>(); + Pair[] parsedRequestLine = HttpRequestUtils.parseRequestLine(br.readLine()); + Arrays.stream(parsedRequestLine).forEach(token -> requestLine.put(token.getKey(), token)); + + return requestLine; } - private List requestHeader(BufferedReader br) throws Exception { - String line = null; - List requestHeaders = new ArrayList<>(); + private Map requestHeader(BufferedReader br) throws Exception { + if (!br.ready()) return new HashMap<>(); - log.debug("### requestheader before : {}", br.ready()); - while (!"".equals(line = br.readLine()) || line == null) { - requestHeaders.add(line); + String line; + Map requestHeader = new HashMap<>(); + while (br.ready()) { + if ("".equals(line = br.readLine())) break; + + Pair token = HttpRequestUtils.parseHeader(line); + requestHeader.put(token.getKey(), token); } - log.debug("### requestheader after : {}", br.ready()); - return requestHeaders; + return requestHeader; } - private List requestBody(BufferedReader br) throws Exception { - String line = null; - List requestBody = new ArrayList<>(); + private String requestBody(BufferedReader br, int contentLength) throws Exception { + return (br.ready()) ? IOUtils.readData(br, contentLength) : null; + } - log.debug("### requestBody before {}", br.ready()); + private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { + try { + log.debug("### response200Header, {}", lengthOfBodyContent); + dos.writeBytes("HTTP/1.1 200 OK \r\n"); + dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n"); + dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); + dos.writeBytes("\r\n"); - if (br.ready()) { - log.debug("### : " + IOUtils.readData(br, 57)); + } catch (IOException e) { + log.error(e.getMessage()); } - - log.debug("### requestBody after {}", br.ready()); - - return requestBody; } private void responseBody(DataOutputStream dos, byte[] body) { diff --git a/src/main/java/webserver/WebServer.java b/src/main/java/webserver/WebServer.java index 284657a8..dd4f0177 100644 --- a/src/main/java/webserver/WebServer.java +++ b/src/main/java/webserver/WebServer.java @@ -1,14 +1,19 @@ package webserver; +import model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.ServerSocket; import java.net.Socket; +import java.util.HashMap; +import java.util.Map; public class WebServer { + private static final Logger log = LoggerFactory.getLogger(WebServer.class); private static final int DEFAULT_PORT = 8080; + public static Map userDB = new HashMap<>(); public static void main(String args[]) throws Exception { int port = 0; From 35daff4f1f9f1ccb567b12702708c1127264d3d2 Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Wed, 18 Mar 2020 02:58:22 +0900 Subject: [PATCH 13/26] =?UTF-8?q?refactor=20:=20RequestHandler=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - requestLine, requestHeader, requestBody 를 가져올 수 있는 메소드를 나누어 구현 - statusLine, responseHeader, responseBody 를 가져올 수 있는 메소드를 나누어 구현 --- src/main/java/webserver/RequestHandler.java | 97 +++++++++++++-------- 1 file changed, 63 insertions(+), 34 deletions(-) diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 32fb7f38..12596c8b 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -36,26 +36,20 @@ public void run() { BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); Map requestLine = requestLine(br); - log.debug("### requestLine : {}", requestLine); Map requestHeader = requestHeader(br); - log.debug("### requestHeader : {}", requestHeader); - String requestBody = ""; if (requestHeader.containsKey("Content-Length")) { - log.debug("### Content-Length : {}", requestHeader.get("Content-Length").getValue()); - requestBody = requestBody(br - , Integer.parseInt(requestHeader.get("Content-Length").getValue())); - log.debug("### requestBody : {}", requestBody); + requestBody = requestBody(br, Integer.parseInt(requestHeader.get("Content-Length").getValue())); } PageController pc = new PageController(); - String redirectUrl = pc.doWork(requestLine, requestBody); + String responseBodyURL = pc.doWork(requestLine, requestBody); - File uriFile = new File(WEBAPP_PATH + redirectUrl); - byte[] body = Files.readAllBytes(uriFile.toPath()); + String statusLine = statusLine(200); + byte[] body = responseBody(responseBodyURL); + String responseHeader = responseHeader(body.length); - response200Header(dos, body.length); - responseBody(dos, body); + sendResponse(dos, statusLine, responseHeader, body); } catch (IOException ie) { log.error(ie.getMessage()); } catch (Exception e) { @@ -64,11 +58,10 @@ public void run() { } /** - * @param br - * @return - * @throws Exception + * Feat : parsing 된 requestLine 을 리턴해줍니다. + * Desc : parseRequestLine() 을 통해 method, requestUrl, protocol 로 parsing 됩니다. + * Return : Map */ - private Map requestLine(BufferedReader br) throws Exception { if (!br.ready()) return new HashMap<>(); @@ -79,6 +72,11 @@ private Map requestLine(BufferedReader br) throws Exception { return requestLine; } + /** + * Feat : parsing 된 requestHeader 를 리턴해줍니다. + * Desc : parseHeader() 를 통해 header 에 들어 있는 값들을 parsing 합니다. + * Return : Map + */ private Map requestHeader(BufferedReader br) throws Exception { if (!br.ready()) return new HashMap<>(); @@ -94,30 +92,61 @@ private Map requestHeader(BufferedReader br) throws Exception { return requestHeader; } + /** + * Feat : requestBody 를 가져옵니다. + * Desc : contentLength 만큼 가져옵니다. + * Return : String + */ private String requestBody(BufferedReader br, int contentLength) throws Exception { return (br.ready()) ? IOUtils.readData(br, contentLength) : null; } - private void response200Header(DataOutputStream dos, int lengthOfBodyContent) { - try { - log.debug("### response200Header, {}", lengthOfBodyContent); - dos.writeBytes("HTTP/1.1 200 OK \r\n"); - dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n"); - dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); - dos.writeBytes("\r\n"); + /** + * Feat : statusLine 을 만듭니다. + * Desc : + * Return : String + */ + private String statusLine(int statusCode) { + log.debug("### statusLine"); + return "HTTP/1.1" + statusCode + " OK \r\n"; + } - } catch (IOException e) { - log.error(e.getMessage()); - } + /** + * Feat : responseHeader 를 만듭니다. + * Desc : + * Return : String + */ + private String responseHeader(int lengthOfBodyContent) { + log.debug("### responseHeader, {}", lengthOfBodyContent); + + StringBuilder sb = new StringBuilder(); + sb.append("Content-Type: text/html;charset=utf-8\r\n"); + sb.append("Content-Length: ").append(lengthOfBodyContent).append("\r\n"); + sb.append("\r\n"); + + return sb.toString(); } - private void responseBody(DataOutputStream dos, byte[] body) { - try { - log.debug("### DataOutputStream"); - dos.write(body, 0, body.length); - dos.flush(); - } catch (IOException e) { - log.error(e.getMessage()); - } + /** + * Feat : responseURL 을 가지고 responseBody 를 만듭니다. + * Desc : + * Return : byte[] + */ + private byte[] responseBody(String responseBodyURL) throws Exception { + File uriFile = new File(WEBAPP_PATH + responseBodyURL); + return Files.readAllBytes(uriFile.toPath()); + } + + /** + * Feat : reponse 를 client 에게 보내줍니다. + * Desc : + * Return : void + */ + private void sendResponse(DataOutputStream dos, String statusLine, String header, byte[] body) throws Exception { + log.debug("### DataOutputStream"); + dos.writeBytes(statusLine); + dos.writeBytes(header); + dos.write(body, 0, body.length); + dos.flush(); } } From ce94f26bade85cd9aaa2dc2897cf1a7feedabb16 Mon Sep 17 00:00:00 2001 From: han95210 Date: Wed, 18 Mar 2020 14:49:08 +0900 Subject: [PATCH 14/26] =?UTF-8?q?refactor=20:=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=EC=82=AC=ED=95=AD=204=20=EA=B5=AC=ED=98=84=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PageController - dowork()의 리턴타입 변경 (String -> Map) - ReqestHandler - dowork() 리턴값 변경에 따른 변수명 변경 associate with : #7 --- src/main/java/Controller/PageController.java | 26 ++++++++++++++++---- src/main/java/webserver/RequestHandler.java | 20 +++++++++------ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/main/java/Controller/PageController.java b/src/main/java/Controller/PageController.java index ee36c32d..6c3e9afd 100644 --- a/src/main/java/Controller/PageController.java +++ b/src/main/java/Controller/PageController.java @@ -6,14 +6,21 @@ import webserver.RequestHandler; import webserver.WebServer; +import java.util.HashMap; import java.util.Map; public class PageController { private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); - public String doWork(Map requestLine, String requestBody) { + public Map doWork(Map requestLine, Map requestHeader, String requestBody) { + Map response = new HashMap<>(); log.debug("### dowork"); + String responseBodyUrl = ""; + String statusCode = ""; + String location = ""; + String message = ""; + String method = requestLine.get("method").getValue(); String requestUrl = requestLine.get("requestUrl").getValue(); String protocol = requestLine.get("protocol").getValue(); @@ -22,21 +29,30 @@ public String doWork(Map requestLine, String requ case "GET": log.debug("### dowork : GET"); if (requestUrl.equals("/user/form.html")) { - return "/user/form.html"; + responseBodyUrl = "/user/form.html"; + statusCode = "200"; + message = "OK"; } break; case "POST": if (requestUrl.equals("/user/create")) { - UserController.create(requestBody); log.debug("### userDB : {}", WebServer.userDB); - return "/index.html"; + responseBodyUrl = "/index.html"; + statusCode = "302"; + location = "http://localhost:8080/index.html"; + message = "Found"; } break; default: break; } - return ""; + response.put("responseBodyUrl", responseBodyUrl); + response.put("statusCode", statusCode); + response.put("location", location); + response.put("message", message); + + return response; } } diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 12596c8b..a4c22465 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -43,11 +43,14 @@ public void run() { } PageController pc = new PageController(); - String responseBodyURL = pc.doWork(requestLine, requestBody); + Map response = pc.doWork(requestLine, requestHeader, requestBody); - String statusLine = statusLine(200); - byte[] body = responseBody(responseBodyURL); - String responseHeader = responseHeader(body.length); + + String statusLine = statusLine(response.get("statusCode"), response.get("message")); + log.debug("### statusLine: {}", statusLine); + byte[] body = responseBody(response.get("responseBodyUrl")); + String responseHeader = responseHeader(body.length, response.get("location")); + log.debug("### responseHeader : {}", responseHeader); sendResponse(dos, statusLine, responseHeader, body); } catch (IOException ie) { @@ -106,9 +109,9 @@ private String requestBody(BufferedReader br, int contentLength) throws Exceptio * Desc : * Return : String */ - private String statusLine(int statusCode) { + private String statusLine(String statusCode, String message) { log.debug("### statusLine"); - return "HTTP/1.1" + statusCode + " OK \r\n"; + return "HTTP/1.1 " + statusCode + " " + message + "\r\n"; } /** @@ -116,10 +119,12 @@ private String statusLine(int statusCode) { * Desc : * Return : String */ - private String responseHeader(int lengthOfBodyContent) { + private String responseHeader(int lengthOfBodyContent, String location) { log.debug("### responseHeader, {}", lengthOfBodyContent); StringBuilder sb = new StringBuilder(); + + sb.append("location: ").append(location).append("\r\n"); sb.append("Content-Type: text/html;charset=utf-8\r\n"); sb.append("Content-Length: ").append(lengthOfBodyContent).append("\r\n"); sb.append("\r\n"); @@ -144,6 +149,7 @@ private byte[] responseBody(String responseBodyURL) throws Exception { */ private void sendResponse(DataOutputStream dos, String statusLine, String header, byte[] body) throws Exception { log.debug("### DataOutputStream"); + log.debug("### statusLine : {}", statusLine); dos.writeBytes(statusLine); dos.writeBytes(header); dos.write(body, 0, body.length); From 0e71953bdc1f820191ed202562a78ed7376c0a3f Mon Sep 17 00:00:00 2001 From: Byung Hyun Choi Date: Wed, 18 Mar 2020 15:56:27 +0900 Subject: [PATCH 15/26] =?UTF-8?q?feat=20:=20PageController=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EA=B5=AC=ED=98=84,=20inmemory=20DB=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /index.html, /user/login.html 구현 - User create 연결 associate with #7 --- src/main/java/Controller/PageController.java | 27 +++- src/main/java/Controller/UserController.java | 6 +- src/main/java/db/DataBase.java | 27 ++-- src/main/java/webserver/RequestHandler.java | 1 - src/main/java/webserver/WebServer.java | 4 - webapp/user/login.html | 156 ++++++++++--------- 6 files changed, 120 insertions(+), 101 deletions(-) diff --git a/src/main/java/Controller/PageController.java b/src/main/java/Controller/PageController.java index 6c3e9afd..e275af01 100644 --- a/src/main/java/Controller/PageController.java +++ b/src/main/java/Controller/PageController.java @@ -1,10 +1,10 @@ package Controller; +import db.DataBase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import util.HttpRequestUtils; import webserver.RequestHandler; -import webserver.WebServer; import java.util.HashMap; import java.util.Map; @@ -12,7 +12,9 @@ public class PageController { private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); - public Map doWork(Map requestLine, Map requestHeader, String requestBody) { + public Map doWork(Map requestLine, + Map requestHeader, String requestBody) + { Map response = new HashMap<>(); log.debug("### dowork"); @@ -32,17 +34,36 @@ public Map doWork(Map requestLine responseBodyUrl = "/user/form.html"; statusCode = "200"; message = "OK"; + } else if (requestUrl.equals("/index.html")) { + responseBodyUrl = "/index.html"; + statusCode = "200"; + message = "OK"; + } else if (requestUrl.equals("/user/login.html")) { + responseBodyUrl = "/user/login.html"; + statusCode = "200"; + message = "OK"; } break; case "POST": if (requestUrl.equals("/user/create")) { UserController.create(requestBody); - log.debug("### userDB : {}", WebServer.userDB); + log.debug("### DataBase : {}", DataBase.findAll()); + log.debug("### requestBody : {}", requestBody); responseBodyUrl = "/index.html"; statusCode = "302"; location = "http://localhost:8080/index.html"; message = "Found"; } + if (requestUrl.equals("/user/login")) { + log.debug("### requestBody : {}", requestBody); + // + // UserController.create(requestBody); + // // log.debug("### userDB : {}", WebServer.userDB); + // responseBodyUrl = "/index.html"; + // statusCode = "302"; + // location = "http://localhost:8080/index.html"; + // message = "Found"; + } break; default: break; diff --git a/src/main/java/Controller/UserController.java b/src/main/java/Controller/UserController.java index 3ac5e847..88815ed5 100644 --- a/src/main/java/Controller/UserController.java +++ b/src/main/java/Controller/UserController.java @@ -1,11 +1,11 @@ package Controller; +import db.DataBase; import model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import util.HttpRequestUtils; import webserver.RequestHandler; -import webserver.WebServer; import java.util.Map; @@ -16,8 +16,8 @@ public static User create(String uriString) { Map parameters = HttpRequestUtils.parseUriString(uriString); log.debug("### parameters : {}", parameters); User user = new User(parameters); - WebServer.userDB.put(WebServer.userDB.size() + 1, user); + DataBase.addUser(user); - return user; + return DataBase.findUserById(user.getUserId()); } } diff --git a/src/main/java/db/DataBase.java b/src/main/java/db/DataBase.java index b9419a4a..2c25f8e4 100644 --- a/src/main/java/db/DataBase.java +++ b/src/main/java/db/DataBase.java @@ -1,24 +1,23 @@ package db; -import java.util.Collection; -import java.util.Map; - import com.google.common.collect.Maps; - import model.User; +import java.util.Collection; +import java.util.Map; + public class DataBase { - private static Map users = Maps.newHashMap(); + private static Map users = Maps.newHashMap(); - public static void addUser(User user) { - users.put(user.getUserId(), user); - } + public static void addUser(User user) { + users.put(user.getUserId(), user); + } - public static User findUserById(String userId) { - return users.get(userId); - } + public static User findUserById(String userId) { + return users.get(userId); + } - public static Collection findAll() { - return users.values(); - } + public static Collection findAll() { + return users.values(); + } } diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index a4c22465..525ee9e2 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -45,7 +45,6 @@ public void run() { PageController pc = new PageController(); Map response = pc.doWork(requestLine, requestHeader, requestBody); - String statusLine = statusLine(response.get("statusCode"), response.get("message")); log.debug("### statusLine: {}", statusLine); byte[] body = responseBody(response.get("responseBodyUrl")); diff --git a/src/main/java/webserver/WebServer.java b/src/main/java/webserver/WebServer.java index dd4f0177..e9ee9dbc 100644 --- a/src/main/java/webserver/WebServer.java +++ b/src/main/java/webserver/WebServer.java @@ -1,19 +1,15 @@ package webserver; -import model.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.ServerSocket; import java.net.Socket; -import java.util.HashMap; -import java.util.Map; public class WebServer { private static final Logger log = LoggerFactory.getLogger(WebServer.class); private static final int DEFAULT_PORT = 8080; - public static Map userDB = new HashMap<>(); public static void main(String args[]) throws Exception { int port = 0; diff --git a/webapp/user/login.html b/webapp/user/login.html index 69be6c86..00119f5f 100644 --- a/webapp/user/login.html +++ b/webapp/user/login.html @@ -1,100 +1,104 @@ - - - SLiPP Java Web Programming - - - - + + + SLiPP Java Web Programming + + + +