Skip to content

Commit 9ceda95

Browse files
authored
Merge pull request #50 from Hamill210/Step2
[Hamill&Dan][HTTP 웹서버 구현하기] Step1, 2 Submit
2 parents 03ab411 + 4179774 commit 9ceda95

21 files changed

+860
-351
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,8 @@
99
## 온라인 코드 리뷰 과정
1010
* [텍스트와 이미지로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://github.com/code-squad/codesquad-docs/blob/master/codereview/README.md)
1111
* [동영상으로 살펴보는 코드스쿼드의 온라인 코드 리뷰 과정](https://youtu.be/a5c9ku-_fok)
12+
13+
-------------
14+
15+
## Ground Rule
16+
https://github.com/Hamill210/java-was.wiki.git

retrospective/Day1.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Day 1
2+
3+
## 오늘한 것
4+
- [ ] http://localhost:8080/index.html 로 접속했을 때 webapp 디렉토리의 index.html 파일을 읽어 클라이언트에 응답합니다.
5+
- index.html 호출 성공
6+
- css 호출 실패
7+
8+
## 내일 할 것
9+
- Step1. 요구사항 2
10+
11+
## 키워드
12+
- favicon.ico
13+
- 이게 되는 이유
14+
`!"".equals(line = br.readLine())`
15+
- 프로그램을 종료해도 Listen 이 남아있는 이유
16+
- Http request, response Header 만 공부
17+
- request line
18+
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package Controller;
2+
3+
import db.DataBase;
4+
import model.User;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import util.HttpRequestUtils;
8+
import webserver.RequestHandler;
9+
10+
import java.util.Arrays;
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
public class PageController {
15+
private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
16+
17+
public Map<String, String> doWork(Map<String, String> requestLine,
18+
Map<String, String> requestHeader, String requestBody)
19+
{
20+
Map<String, String> response = new HashMap<>();
21+
log.debug("### dowork");
22+
23+
String responseBodyUrl = "";
24+
String statusCode = "";
25+
String location = "";
26+
String message = "";
27+
28+
String method = requestLine.get("method");
29+
String requestUrl = requestLine.get("requestUrl");
30+
String protocol = requestLine.get("protocol");
31+
String contentType = requestHeader.get("Accept");
32+
33+
switch (method) {
34+
case "GET":
35+
log.debug("### dowork : GET");
36+
if (requestUrl.equals("/user/form.html")) {
37+
responseBodyUrl = "/user/form.html";
38+
statusCode = "200";
39+
message = "OK";
40+
} else if (requestUrl.equals("/index.html")) {
41+
responseBodyUrl = "/index.html";
42+
statusCode = "200";
43+
message = "OK";
44+
} else if (requestUrl.equals("/user/login.html")) {
45+
responseBodyUrl = "/user/login.html";
46+
statusCode = "200";
47+
message = "OK";
48+
} else if (requestUrl.equals("/user/login_failed.html")) {
49+
responseBodyUrl = "/user/login_failed.html";
50+
statusCode = "200";
51+
message = "OK";
52+
} else if (requestUrl.equals("/user/list")) {
53+
boolean de = false;
54+
log.debug("### requestHeader : {}", requestHeader);
55+
log.debug("### requestHeader : {}", requestHeader.get("Cookie"));
56+
57+
String cookie = requestHeader.get("Cookie").replaceAll(" ", "");
58+
boolean delemeter = Arrays.stream(cookie.split(";")).anyMatch(token -> token.startsWith("logined=true"));
59+
60+
if (delemeter) {
61+
responseBodyUrl = "/user/list.html";
62+
statusCode = "200";
63+
message = "OK";
64+
} else {
65+
responseBodyUrl = "/user/list.html";
66+
statusCode = "302";
67+
location = "http://localhost:8080/user/login.html";
68+
message = "Found";
69+
}
70+
} else {
71+
responseBodyUrl = requestLine.get("requestUrl");
72+
statusCode = "200";
73+
message = "OK";
74+
}
75+
break;
76+
case "POST":
77+
if (requestUrl.equals("/user/create")) {
78+
UserController.create(requestBody);
79+
log.debug("### DataBase : {}", DataBase.findAll());
80+
log.debug("### requestBody : {}", requestBody);
81+
responseBodyUrl = "/index.html";
82+
statusCode = "302";
83+
location = "http://localhost:8080/index.html";
84+
message = "Found";
85+
}
86+
if (requestUrl.equals("/user/login")) {
87+
Map<String, String> parsedRequestBody = HttpRequestUtils.parseRequestBody(requestBody);
88+
User loginUser =
89+
new User(parsedRequestBody.get("userId"), parsedRequestBody.get("password"), "", "");
90+
User findUser = DataBase.findUserById(parsedRequestBody.get("userId"));
91+
log.debug("### login check : {}", loginUser.getPassword().equals(findUser.getPassword()));
92+
93+
if (loginUser.getPassword().equals(findUser.getPassword())) {
94+
responseBodyUrl = "/index.html";
95+
statusCode = "302";
96+
location = "http://localhost:8080/index.html";
97+
message = "Found";
98+
response.put("Set-Cookie", "logined=true; Path=/");
99+
} else {
100+
responseBodyUrl = "/user/login_failed.html";
101+
statusCode = "302";
102+
location = "http://localhost:8080/user/login_failed.html";
103+
message = "Found";
104+
response.put("Set-Cookie", "logined=false; Path=/");
105+
}
106+
}
107+
break;
108+
default:
109+
break;
110+
}
111+
112+
response.put("responseBodyUrl", responseBodyUrl);
113+
response.put("statusCode", statusCode);
114+
response.put("location", location);
115+
response.put("message", message);
116+
response.put("protocol", protocol);
117+
response.put("contentType", contentType);
118+
119+
return response;
120+
}
121+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package Controller;
2+
3+
import db.DataBase;
4+
import model.User;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import util.HttpRequestUtils;
8+
import webserver.RequestHandler;
9+
10+
import java.util.Map;
11+
12+
public class UserController {
13+
private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
14+
15+
public static User create(String uriString) {
16+
Map<String, String> parameters = HttpRequestUtils.parseUriString(uriString);
17+
log.debug("### parameters : {}", parameters);
18+
User user = new User(parameters);
19+
DataBase.addUser(user);
20+
21+
return DataBase.findUserById(user.getUserId());
22+
}
23+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package Controller;
2+
3+
import model.User;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import webserver.RequestHandler;
7+
8+
public class WelcomeController {
9+
10+
private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
11+
12+
public void doWork(String[] tokens) {
13+
14+
if (tokens[1].startsWith("/user/create")) {
15+
User createdUser = UserController.create(tokens[1].substring(tokens[1].indexOf("?") + 1));
16+
}
17+
}
18+
}

src/main/java/db/DataBase.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,23 @@
11
package db;
22

3-
import java.util.Collection;
4-
import java.util.Map;
5-
63
import com.google.common.collect.Maps;
7-
84
import model.User;
95

6+
import java.util.Collection;
7+
import java.util.Map;
8+
109
public class DataBase {
11-
private static Map<String, User> users = Maps.newHashMap();
10+
private static Map<String, User> users = Maps.newHashMap();
1211

13-
public static void addUser(User user) {
14-
users.put(user.getUserId(), user);
15-
}
12+
public static void addUser(User user) {
13+
users.put(user.getUserId(), user);
14+
}
1615

17-
public static User findUserById(String userId) {
18-
return users.get(userId);
19-
}
16+
public static User findUserById(String userId) {
17+
return users.get(userId);
18+
}
2019

21-
public static Collection<User> findAll() {
22-
return users.values();
23-
}
20+
public static Collection<User> findAll() {
21+
return users.values();
22+
}
2423
}

src/main/java/model/HttpRequest.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package model;
2+
3+
import util.HttpRequestUtils;
4+
import util.IOUtils;
5+
6+
import java.io.BufferedReader;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
public class HttpRequest extends HttpTemplate {
11+
private BufferedReader br;
12+
13+
public HttpRequest(BufferedReader br) throws Exception {
14+
this.br = br;
15+
this.startLine = requestLine();
16+
this.header = requestHeader();
17+
this.body = requestBody();
18+
}
19+
20+
/**
21+
* Feat : parsing 된 requestLine 을 리턴해줍니다.
22+
* Desc : parseRequestLine() 을 통해 method, requestUrl, protocol 로 parsing 됩니다.
23+
* Return : Map<String, String>
24+
*/
25+
private Map<String, String> requestLine() throws Exception {
26+
if (!br.ready()) return new HashMap<>();
27+
String line = br.readLine();
28+
29+
Map<String, String> requestLine = new HashMap<>();
30+
String[] splitedLine = line.split(" ");
31+
32+
requestLine.put("method", splitedLine[0]);
33+
requestLine.put("requestUrl", splitedLine[1]);
34+
requestLine.put("protocol", splitedLine[2]);
35+
36+
return requestLine;
37+
}
38+
39+
/**
40+
* Feat : parsing 된 requestHeader 를 리턴해줍니다.
41+
* Desc :
42+
* Return : Map<String, Stirng>
43+
*/
44+
private Map<String, String> requestHeader() throws Exception {
45+
if (!br.ready()) return new HashMap<>();
46+
String line;
47+
48+
Map<String, String> requestHeader = new HashMap<>();
49+
while (br.ready()) {
50+
if ("".equals(line = br.readLine())) break;
51+
requestHeader.putAll(HttpRequestUtils.getKeyValueMap(line, ": "));
52+
}
53+
54+
return requestHeader;
55+
}
56+
57+
/**
58+
* Feat : requestBody 를 만듭니다.
59+
* Desc : contentLength 만큼 만듭니다.
60+
* Return : String
61+
*/
62+
private String requestBody() throws Exception {
63+
return (br.ready() && header.containsKey("Content-Length"))
64+
? IOUtils.readData(br, Integer.parseInt(header.get("Content-Length")))
65+
: "";
66+
}
67+
68+
public String getMethod() {
69+
return this.startLine.get("method");
70+
}
71+
72+
public String getProtocol() {
73+
return this.startLine.get("protocol");
74+
}
75+
76+
public String getPath() {
77+
return this.startLine.get("requestUrl");
78+
}
79+
80+
public Map<String, String> getHeader() {
81+
return this.header;
82+
}
83+
84+
public String getBody() {
85+
return this.body;
86+
}
87+
88+
public Map<String, String> getStartLine() {
89+
return this.startLine;
90+
}
91+
}

0 commit comments

Comments
 (0)