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
10 changes: 10 additions & 0 deletions src/main/java/controller/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package controller;

import http.HttpRequest;
import http.HttpResponse;

import java.io.IOException;

public interface Controller {
void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException;
}
29 changes: 29 additions & 0 deletions src/main/java/controller/ControllerKey.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package controller;

import http.HttpMethod;

import java.util.Objects;

public class ControllerKey {

private HttpMethod method;
private String url;

public ControllerKey(HttpMethod method, String url) {
this.method = method;
this.url = url;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ControllerKey that = (ControllerKey) o;
return method == that.method && Objects.equals(url, that.url);
}

@Override
public int hashCode() {
return Objects.hash(method, url);
}
}
22 changes: 22 additions & 0 deletions src/main/java/controller/CreateUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package controller;

import db.DataBase;
import http.HttpRequest;
import http.HttpResponse;
import model.User;

import java.io.IOException;

public class CreateUserController implements Controller {
@Override
public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
User user = new User(
httpRequest.data("userId"),
httpRequest.data("password"),
httpRequest.data("name"),
httpRequest.data("email")
);
DataBase.addUser(user);
httpResponse.redirect("/index.html");
}
}
14 changes: 14 additions & 0 deletions src/main/java/controller/DefaultController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package controller;

import http.HttpRequest;
import http.HttpResponse;

import java.io.IOException;

public class DefaultController implements Controller {

@Override
public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
httpResponse.forward(httpRequest.getUrl());
}
}
17 changes: 17 additions & 0 deletions src/main/java/controller/ListUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package controller;

import http.HttpRequest;
import http.HttpResponse;

import java.io.IOException;

public class ListUserController implements Controller{
@Override
public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
if ("true".equals(httpRequest.cookie("logined"))) {
httpResponse.forward("/user/list.html");
} else {
httpResponse.redirect("/user/login.html");
}
}
}
25 changes: 25 additions & 0 deletions src/main/java/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package controller;

import db.DataBase;
import http.HttpRequest;
import http.HttpResponse;
import model.User;

import java.io.IOException;

public class LoginController implements Controller{
@Override
public void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
User user = DataBase.findUserById(httpRequest.data("userId"));
if (user == null) {
httpResponse.addHeader("Set-Cookie", "logined=false; Path=/");
httpResponse.redirect("/user/login_failed.html");
} else if (user.checkPassword(httpRequest.data("password"))) {
httpResponse.addHeader("Set-Cookie", "logined=true; Path=/");
httpResponse.redirect("/index.html");
} else {
httpResponse.addHeader("Set-Cookie", "logined=false; Path=/");
httpResponse.redirect("/user/login_failed.html");
}
}
}
57 changes: 14 additions & 43 deletions src/main/java/webserver/RequestHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,70 +2,41 @@

import java.io.*;
import java.net.Socket;
import java.nio.file.Files;
import java.util.Map;

import db.DataBase;
import controller.Controller;
import controller.ControllerKey;
import http.HttpRequest;
import http.HttpResponse;
import model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

private Map<ControllerKey, Controller> controllerMap;
private Controller defaultController;
private Socket connection;

public RequestHandler(Socket connectionSocket) {

public RequestHandler(Socket connectionSocket, Map<ControllerKey, Controller> controllerMap, Controller defaultController) {
this.connection = connectionSocket;
this.controllerMap = controllerMap;
this.defaultController = defaultController;
}

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 사용자 요청에 대한 처리는 이 곳에 구현하면 된다.
HttpRequest httpRequest = HttpRequest.of(in);
String url = httpRequest.getUrl();

HttpResponse httpResponse = new HttpResponse(out);
if ("/user/create".equals(url)) {
User user = new User(
httpRequest.data("userId"),
httpRequest.data("password"),
httpRequest.data("name"),
httpRequest.data("email")
);
DataBase.addUser(user);
log.debug("user : {}", user);
httpResponse.redirect("/index.html");
} else if ("/user/login".equals(url)) {
User user = DataBase.findUserById(httpRequest.data("userId"));
if (user == null) {
log.debug("Not Found");
httpResponse.addHeader("Set-Cookie", "logined=false; Path=/");
httpResponse.redirect("/user/login_failed.html");
} else if (user.checkPassword(httpRequest.data("password"))) {
log.debug("Login success");
httpResponse.addHeader("Set-Cookie", "logined=true; Path=/");
httpResponse.redirect("/index.html");
} else {
log.debug("Password was not matched");
httpResponse.addHeader("Set-Cookie", "logined=false; Path=/");
httpResponse.redirect("/user/login_failed.html");
}
} else if ("/user/list".equals(url)) {
log.debug("Cookie : {}", httpRequest.header("Cookie"));
if ("true".equals(httpRequest.cookie("logined"))) {
httpResponse.forward("/user/list.html");
} else {
httpResponse.redirect("/user/login.html");
}
} else {
log.debug("Cookie : {}", httpRequest.header("Cookie"));
httpResponse.forward(url);
}

ControllerKey controllerKey = new ControllerKey(httpRequest.method(), httpRequest.getUrl());
Controller controller = controllerMap.getOrDefault(controllerKey, defaultController);

controller.service(httpRequest, httpResponse);

} catch (IOException e) {
log.error(e.getMessage());
Expand Down
19 changes: 14 additions & 5 deletions src/main/java/webserver/WebServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,27 @@

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;

import model.User;
import controller.*;
import http.HttpMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WebServer {
private static final Logger log = LoggerFactory.getLogger(WebServer.class);
private static final int DEFAULT_PORT = 8080;

private static final Controller defaultController = new DefaultController();
private static final Map<ControllerKey, Controller> controllerMap = new HashMap<>();

static {
controllerMap.put(new ControllerKey(HttpMethod.POST, "/user/create"), new CreateUserController());
controllerMap.put(new ControllerKey(HttpMethod.POST, "/user/login"), new LoginController());
controllerMap.put(new ControllerKey(HttpMethod.GET, "/user/list"), new ListUserController());
}

public static void main(String args[]) throws Exception {
int port = 0;
if (args == null || args.length == 0) {
Expand All @@ -22,14 +32,13 @@ public static void main(String args[]) throws Exception {
}

// 서버소켓을 생성한다. 웹서버는 기본적으로 8080번 포트를 사용한다.

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 requestHandler = new RequestHandler(connection, controllerMap, defaultController);
requestHandler.start();
}
}
Expand Down
45 changes: 45 additions & 0 deletions src/test/java/controller/ControllerKeyTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package controller;

import http.HttpMethod;
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class ControllerKeyTest {

private SoftAssertions softly;

@BeforeEach
public void beforeEach() {
softly = new SoftAssertions();
}

@AfterEach
public void afterEach() {
softly.assertAll();
}

@Test
@DisplayName("get /index.html")
void getIndex() {
String url = "/index.html";
ControllerKey key1 = new ControllerKey(HttpMethod.GET, url);
ControllerKey key2 = new ControllerKey(HttpMethod.GET, url);

softly.assertThat(key1).isEqualTo(key2);
softly.assertThat(key1.hashCode()).isEqualTo(key2.hashCode());
}

@Test
@DisplayName("post와 get은 달라야한다.")
void getAndPost() {
String url = "/index.html";
ControllerKey key1 = new ControllerKey(HttpMethod.GET, url);
ControllerKey key2 = new ControllerKey(HttpMethod.POST, url);

softly.assertThat(key1).isNotEqualTo(key2);
softly.assertThat(key1.hashCode()).isNotEqualTo(key2.hashCode());
}
}