forked from codesquad-members-2021/java-was
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRequestHandler.java
More file actions
187 lines (149 loc) · 6.69 KB
/
RequestHandler.java
File metadata and controls
187 lines (149 loc) · 6.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
package webserver;
import db.DataBase;
import model.PasswordNotMatchException;
import model.User;
import model.UserNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.IOUtils;
import webserver.http.Request;
import webserver.http.Response;
import webserver.http.header.RequestHeader;
import java.io.*;
import java.net.Socket;
import java.nio.file.Files;
import java.util.Map;
import java.util.StringJoiner;
public class RequestHandler extends Thread {
private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
private Socket connection;
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()) {
Request request = getRequest(in); // Request
String responseMessage = requestController(request);
Response response = Response.from(responseMessage); // Response
response.write(out);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
private Request getRequest(InputStream in) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringJoiner requestMessages = new StringJoiner(System.lineSeparator());
String requestMessage = br.readLine();
while (requestMessage != null && requestMessage.length() != 0) {
requestMessages.add(requestMessage);
requestMessage = br.readLine();
}
RequestHeader requestHeader = RequestHeader.from(requestMessages.toString());
int contentLength = Integer.parseInt(requestHeader.getAttributes().getOrDefault("Content-Length", "0"));
String requestBody = IOUtils.readData(br, contentLength);
requestMessages.add(System.lineSeparator() + requestBody);
Request request = Request.from(requestMessages.toString());
return request;
}
private String requestController(Request request) throws IOException {
String responseMessage = "";
String path = request.getPath();
String extension = request.getPathExtension();
switch (path) {
case "/user/create": {
Map<String, String> parameters = request.getRequestMessage().getParameters();
User newUser = User.builder()
.setUserId(parameters.get("userId"))
.setPassword(parameters.get("password"))
.setName(parameters.get("name"))
.setEmail(parameters.get("email"))
.build();
DataBase.addUser(newUser);
responseMessage = "HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /index.html";
break;
}
case "/user/login": {
responseMessage = loginHandler(request.getRequestMessage().getParameters());
break;
}
case "/user/list": {
Map<String, String> parameters = request.getRequestMessage().getHeader().getAttributes();
String Cookie = parameters.getOrDefault("Cookie", "empty");
if (Cookie.equals("logined=true")) {
responseMessage = findHtmlFrom(path + ".html");
} else {
responseMessage = "HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /user/login.html";
}
break;
}
default: {
responseMessage = htmlController(request, responseMessage, path, extension);
}
}
return responseMessage;
}
private String htmlController(Request request, String responseMessage, String path, String extension) throws IOException {
if (extension.equals("html")) {
Map<String, String> parameters = request.getRequestMessage().getHeader().getAttributes();
String Cookie = parameters.getOrDefault("Cookie", "empty");
if (loginRequired(path)) {
switch (Cookie) {
case "logined=true":
responseMessage = findHtmlFrom(path);
break;
default:
responseMessage = "HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /user/login.html";
}
} else {
responseMessage = findHtmlFrom(path);
}
}
return responseMessage;
}
private String findHtmlFrom(String path) throws IOException {
File htmlFile = new File("./webapp" + path);
String responseMessage = "";
if (htmlFile.exists()) {
byte[] body = Files.readAllBytes(htmlFile.toPath());
responseMessage = "HTTP/1.1 200 OK" + System.lineSeparator() +
"Content-Type: text/html;charset=utf-8" + System.lineSeparator() +
"Content-Length: " + body.length + System.lineSeparator() +
System.lineSeparator() +
new String(body);
} else {
responseMessage = "HTTP/1.1 404 NotFound" + System.lineSeparator() + System.lineSeparator();
}
return responseMessage;
}
private boolean loginRequired(String path) {
return path.equals("/user/list.html");
}
public String loginHandler(Map<String, String> parameters) {
try {
User findUser;
try {
findUser = DataBase.findUserById(parameters.get("userId"))
.orElseThrow(UserNotFoundException::new);
} catch (UserNotFoundException userNotFoundException) {
throw new LoginFailedException();
}
try {
findUser.checkPassword(parameters.get("password"));
} catch (PasswordNotMatchException passwordNotMatchException) {
throw new LoginFailedException();
}
return "HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /index.html" + System.lineSeparator() +
"Set-Cookie: logined=true; Path=/";
} catch (LoginFailedException loginFailedException) {
return "HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /user/login_failed.html" + System.lineSeparator() +
"Set-Cookie: logined=false; Path=/";
}
}
}