Skip to content
Merged
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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ dependencies {

test {
useJUnitPlatform()
}
}
27 changes: 27 additions & 0 deletions src/main/java/controller/AbstractController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package controller;

import webserver.HttpMethod;
import webserver.HttpRequest;
import webserver.HttpResponse;

public abstract class AbstractController implements Controller {

@Override
public void service(HttpRequest request, HttpResponse response) {
HttpMethod method = request.getMethod();

if (method.isPost()) {
doPost(request, response);
} else {
doGet(request, response);
}
}

public void doPost(HttpRequest request, HttpResponse response) {

}

public void doGet(HttpRequest request, HttpResponse response) {

}
}
8 changes: 8 additions & 0 deletions src/main/java/controller/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package controller;

import webserver.HttpRequest;
import webserver.HttpResponse;

public interface Controller {
void service(HttpRequest request, HttpResponse response);
}
23 changes: 23 additions & 0 deletions src/main/java/controller/CreateUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package controller;

import db.DataBase;
import model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.HttpRequest;
import webserver.HttpResponse;

public class CreateUserController extends AbstractController {
private static final Logger log = LoggerFactory.getLogger(CreateUserController.class);

@Override
public void doPost(HttpRequest request, HttpResponse response) {
String userId = request.getParameter("userId");
String password = request.getParameter("password");
String name = request.getParameter("name");
String email = request.getParameter("email");
DataBase.addUser(new User(userId, password, name, email));
response.sendRedirect("/index.html");
log.debug("{}님이 회원가입에 성공하셨습니다.", userId);
}
}
62 changes: 62 additions & 0 deletions src/main/java/controller/ListUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package controller;

import db.DataBase;
import model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.HttpRequestUtils;
import webserver.HttpRequest;
import webserver.HttpResponse;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Collection;
import java.util.Map;

public class ListUserController extends AbstractController {
private static final Logger log = LoggerFactory.getLogger(ListUserController.class);

@Override
public void doGet(HttpRequest request, HttpResponse response) {
String cookies = request.getHeader("Cookie");
Map<String, String> cookieStringMap = HttpRequestUtils.parseCookies(cookies);
log.info("Cookie: {}", cookieStringMap.toString());
if (cookieStringMap.get("logined").equals("false")) {
response.sendRedirect("/user/login.html");
} else {
String url = "/user/list.html";
byte[] body = new byte[0];
try {
body = Files.readAllBytes(new File("./webapp" + url).toPath());
} catch (IOException e) {
e.printStackTrace();
}
String bodyStr = new String(body);
int tbodyIndex = bodyStr.indexOf("<tbody>");
log.info("bodyStr : {}", bodyStr.substring(0, tbodyIndex + 7));

StringBuilder result = new StringBuilder(bodyStr.substring(0, tbodyIndex + 7));
Collection<User> users = DataBase.findAll();
int id = 0;
for (User user : users) {
id++;
result.append("<tr><th scope=\"row\">")
.append(id).append("</th> <td>")
.append(user.getUserId()).append("</td> <td>")
.append(user.getName()).append("</td> <td>")
.append(user.getEmail()).append("</td> <td>")
.append("<a href=\"#\" class=\"btn btn - success\" role=\"button\">수정</a></td>");
}
result.append(bodyStr.substring(tbodyIndex + 7));
log.info("result: {}", result.toString());
response.response200Header(result.toString().getBytes().length, "text/html");
response.responseBody(result.toString().getBytes());
}
}

public boolean isLogin(String id) {

return false;
}
}
28 changes: 28 additions & 0 deletions src/main/java/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package controller;

import db.DataBase;
import model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.HttpRequest;
import webserver.HttpResponse;

public class LoginController extends AbstractController {
private static final Logger log = LoggerFactory.getLogger(LoginController.class);

@Override
public void doPost(HttpRequest request, HttpResponse response) {
String userId = request.getParameter("userId");
String password = request.getParameter("password");
User targetUser = DataBase.findUserById(userId);
// todo : 세션의 작동원리를 깊히 생각해보기
if (targetUser == null || !password.equals(targetUser.getPassword())) {
response.addHeader("Set-Cookie", "logined=false");
response.sendRedirect("/user/login_failed.html");
} else if (password.equals(targetUser.getPassword())) {
response.addHeader("Set-Cookie", "logined=true");
response.sendRedirect("/index.html");
log.info("{}님이 로그인하셨습니다.", userId);
}
}
}
4 changes: 4 additions & 0 deletions src/main/java/webserver/HttpMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@

public enum HttpMethod {
GET, POST;

public boolean isPost() {
return this == POST;
}
}
61 changes: 50 additions & 11 deletions src/main/java/webserver/HttpRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,78 @@
import util.HttpRequestUtils;
import util.IOUtils;

import java.io.BufferedReader;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class HttpRequest {
private static final Logger log = LoggerFactory.getLogger(HttpRequest.class);

private String startLine;
private String requestLine;
private Map<String, String> headers;
private BufferedReader br;
private String RequestBody;
private Map<String, String> parameters;

public HttpRequest(String startLine, Map<String, String> headers) {
this.startLine = startLine;
this.headers = headers;
public HttpRequest(InputStream in) {
try {
br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
requestLine = br.readLine();
String line = requestLine;
if (line == null) {
return;
}
headers = new HashMap<>();
while (!line.isEmpty()) {
log.info("headers : {}", line);
line = br.readLine();
if (line == null) {
break;
}
String[] headerTokens = line.split(": ");
if (headerTokens.length == 2) {
headers.put(headerTokens[0], headerTokens[1]);
}
}
if (headers.get("Content-Length") == null) {
String tokens = requestLine.split(" ")[1];
String queryString = tokens.substring(tokens.indexOf("?") + 1);
parameters = HttpRequestUtils.parseQueryString(queryString);
}
if (headers.get("Content-Length") != null) {
RequestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length")));
parameters = HttpRequestUtils.parseQueryString(RequestBody);
}
log.info("parameters : {}", parameters.toString());
} catch (IOException e) {
e.printStackTrace();
}
}

public HttpMethod getMethod() {
String[] tokens = startLine.split(" ");
String[] tokens = requestLine.split(" ");
String method = tokens[0];
return HttpMethod.valueOf(method);
}

public String getPath() {
String[] tokens = startLine.split(" ");
String[] tokens = requestLine.split(" ");
if (tokens[1].contains("?")) {
return tokens[1].substring(0, tokens[1].indexOf("?"));
}
return tokens[1];
}

public String getHeader(String fieldName) {
return headers.get(fieldName);
}

public String getParameter(String fieldName, BufferedReader br) throws Exception {
String RequestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length")));
Map<String, String> parameters = HttpRequestUtils.parseQueryString(RequestBody);
log.info("parameters : {}", parameters.toString());
public Map<String, String> headers() {
return headers;
}

public String getParameter(String fieldName) {
return parameters.get(fieldName);
}
}
23 changes: 7 additions & 16 deletions src/main/java/webserver/HttpResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ public void addHeader(String fieldName, String fieldValue) {
public void forward(String url) throws IOException {
byte[] body = Files.readAllBytes(new File("./webapp" + url).toPath());
if (url.endsWith(".css")) {
response200HeaderWithCss(body.length);
response200Header(body.length, "text/css");
} else if (url.endsWith(".js")) {
response200Header(body.length, "application/javascript");
} else {
response200Header(body.length);
response200Header(body.length, "text/html");
}
responseBody(body);
}
Expand All @@ -36,21 +38,10 @@ public void forwardBody(String string) {

}

public void response200HeaderWithCss(int lengthOfBodyContent) {
public void response200Header(int lengthOfBodyContent, String contentType) {
try {
dos.writeBytes("HTTP/1.1 200 OK \r\n");
dos.writeBytes("Content-Type: text/css;charset=utf-8\r\n");
dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n");
dos.writeBytes("\r\n");
} catch (IOException e) {
log.error(e.getMessage());
}
}

public void response200Header(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-Type:" + contentType + ";charset=utf-8\r\n");
dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n");
dos.writeBytes("\r\n");
} catch (IOException e) {
Expand All @@ -73,7 +64,7 @@ public void sendRedirect(String url) {
processHeaders();
dos.writeBytes("Location: " + url + "\r\n");
} catch (IOException e) {

e.printStackTrace();
}
}

Expand Down
Loading