Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 103 additions & 45 deletions src/main/java/webserver/RequestHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,73 +31,131 @@ public void run() {
connection.getPort());

try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringJoiner requestMessages = new StringJoiner(System.lineSeparator());
Request request = getRequest(in); // Request

String requestMessage = br.readLine();
String responseMessage = requestController(request);

while (requestMessage != null && requestMessage.length() != 0) {
requestMessages.add(requestMessage);
requestMessage = br.readLine();
}
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());

RequestHeader requestHeader = RequestHeader.from(requestMessages.toString());
String requestMessage = br.readLine();

int contentLength = Integer.parseInt(requestHeader.getAttributes().getOrDefault("Content-Length", "0"));
String requestBody = IOUtils.readData(br, contentLength);
while (requestMessage != null && requestMessage.length() != 0) {
requestMessages.add(requestMessage);
requestMessage = br.readLine();
}

requestMessages.add(System.lineSeparator() + requestBody);
RequestHeader requestHeader = RequestHeader.from(requestMessages.toString());

Request request = Request.from(requestMessages.toString());
int contentLength = Integer.parseInt(requestHeader.getAttributes().getOrDefault("Content-Length", "0"));
String requestBody = IOUtils.readData(br, contentLength);

// TODO: Default Message를 설정할 수 있을 것 같다.
String responseMessage = "HTTP/1.1 404 NotFound" + System.lineSeparator() + System.lineSeparator();
requestMessages.add(System.lineSeparator() + requestBody);

String path = request.getPath();
String extension = request.getPathExtension();
if (extension.equals("html")) {
Request request = Request.from(requestMessages.toString());
return request;
}

File htmlFile = new File("./webapp" + path);
private String requestController(Request request) throws IOException {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거도 좋네요
나중에 클래스로 분리도 가능할 것 같네요


if (htmlFile.exists()) {
byte[] body = Files.readAllBytes(htmlFile.toPath());
String responseMessage = "";
String path = request.getPath();
String extension = request.getPathExtension();

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);
}
}
switch (path) {
case "/user/create": {
Map<String, String> parameters = request.getRequestMessage().getParameters();

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();

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();

DataBase.addUser(newUser);
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: /index.html";
break;
"Location: /user/login.html";
}
case "/user/login": {
responseMessage = loginHandler(request.getRequestMessage().getParameters());
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)) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

접근은 괜찮은 것 같아요
그런데 너무 미래를 위한 코드가 아닐까 하는 생각도 한 편으로 드네요

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;
}

Response response = Response.from(responseMessage);
response.write(out);
private String findHtmlFrom(String path) throws IOException {
File htmlFile = new File("./webapp" + path);
String responseMessage = "";

} catch (IOException e) {
log.error(e.getMessage(), e);
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) {
Expand Down
99 changes: 99 additions & 0 deletions src/test/java/webserver/RequestHandlerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -438,4 +438,103 @@ static Stream<Arguments> loginHandler() {
)
);
}

@ParameterizedTest
@MethodSource("리스트_페이지")
void 리스트_페이지(String desc, String message, String expectedResponseMessage) throws IOException {


RequestHandler requestHandler = new RequestHandler(server.accept());

BufferedOutputStream browserStream = new BufferedOutputStream(browser.getOutputStream());
browserStream.write(message.getBytes(StandardCharsets.UTF_8));
browserStream.write(System.lineSeparator().getBytes(StandardCharsets.UTF_8));
browserStream.flush();

requestHandler.run();

BufferedReader br = new BufferedReader(new InputStreamReader(browser.getInputStream()));
String actualResponseMessage = br.lines().collect(Collectors.joining(System.lineSeparator()));


assertThat(actualResponseMessage)
.as("리스트_페이지 : %s", desc)
.isEqualTo(expectedResponseMessage);
}

static Stream<Arguments> 리스트_페이지() throws IOException {
return Stream.of(
Arguments.arguments(
"Cookie: logined=true가 있을 경우 /user/list 접속 접근",

"GET /user/list HTTP/1.1" + System.lineSeparator() +
"Host: localhost:8080" + System.lineSeparator() +
"Connection: keep-alive" + System.lineSeparator() +
"Accept: */*" + System.lineSeparator() +
"Cookie: logined=true" + System.lineSeparator() +
"" + System.lineSeparator(),

"HTTP/1.1 200 OK" + System.lineSeparator() +
"Content-Type: text/html;charset=utf-8" + System.lineSeparator() +
"Content-Length: 4801" + System.lineSeparator() +
"" + System.lineSeparator() +
Files.lines(new File("./webapp/user/list.html").toPath())
.collect(Collectors.joining(System.lineSeparator()))


), Arguments.arguments(
"Cookie: logined=true가 없을 경우 /user/list 이동 접근",

"GET /user/list HTTP/1.1" + System.lineSeparator() +
"Host: localhost:8080" + System.lineSeparator() +
"Connection: keep-alive" + System.lineSeparator() +
"Accept: */*" + System.lineSeparator() +
"" + System.lineSeparator(),

"HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /user/login.html" + System.lineSeparator()
), Arguments.arguments(
"Cookie: logined=true가 있을 경우 /user/list.html 접근",

"GET /user/list.html HTTP/1.1" + System.lineSeparator() +
"Host: localhost:8080" + System.lineSeparator() +
"Connection: keep-alive" + System.lineSeparator() +
"Accept: */*" + System.lineSeparator() +
"Cookie: logined=true" + System.lineSeparator() +
"" + System.lineSeparator(),

"HTTP/1.1 200 OK" + System.lineSeparator() +
"Content-Type: text/html;charset=utf-8" + System.lineSeparator() +
"Content-Length: 4801" + System.lineSeparator() +
"" + System.lineSeparator() +
Files.lines(new File("./webapp/user/list.html").toPath())
.collect(Collectors.joining(System.lineSeparator()))

), Arguments.arguments(
"Cookie: logined=true가 없을 경우 /user/list.html 접근",

"GET /user/list.html HTTP/1.1" + System.lineSeparator() +
"Host: localhost:8080" + System.lineSeparator() +
"Connection: keep-alive" + System.lineSeparator() +
"Accept: */*" + System.lineSeparator() +
"" + System.lineSeparator(),

"HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /user/login.html" + System.lineSeparator()
), Arguments.arguments(
"Cookie 없을 경우 /user/list 접근",

"GET /user/list HTTP/1.1" + System.lineSeparator() +
"Host: localhost:8080" + System.lineSeparator() +
"Connection: keep-alive" + System.lineSeparator() +
"Accept: */*" + System.lineSeparator() +
"" + System.lineSeparator(),

"HTTP/1.1 302 Found" + System.lineSeparator() +
"Location: /user/login.html" + System.lineSeparator()
)
);

}

}