Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
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 .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

---
name: Feature Request
about: Suggest new Feature Request for this project
title: "{ISSUE_TITLE}"
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -204,5 +204,5 @@ Network Trash Folder
Temporary Items
.apdisk

src/main/java/controller/
#src/main/java/controller/

14 changes: 14 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,20 @@ dependencies {
implementation group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.9.0'
// https://mvnrepository.com/artifact/com.h2database/h2
implementation group: 'com.h2database', name: 'h2', version: '2.1.210'

// EMBED TOMCAT 관련 설정
// tomcat-embed-core
implementation 'org.apache.tomcat.embed:tomcat-embed-core:10.1.0-M17'
// https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-logging-juli
implementation 'org.apache.tomcat.embed:tomcat-embed-logging-juli:9.0.0.M6'
// https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper:10.1.0-M17'
// https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper
implementation 'org.apache.tomcat:tomcat-jasper:10.1.0-M17'
// https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-el
implementation 'org.apache.tomcat.embed:tomcat-embed-el:10.1.0-M17'
// https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jsp-api
implementation 'org.apache.tomcat:tomcat-jsp-api:10.1.0-M17'
}

test {
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/controller/AbstractController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package controller;

import http.request.HttpRequest;
import http.request.RequestLine;
import http.response.HttpResponse;
import java.io.IOException;

public abstract class AbstractController implements Controller{

@Override
public void service(HttpRequest request, HttpResponse response) throws IOException {
RequestLine requestLine = request.getRequestLine();
if (requestLine.getHttpMethod().isGET()) {
doGet(request, response);
}

if (requestLine.getHttpMethod().isPOST()) {
doPost(request, response);
}
}

protected void doGet(HttpRequest request, HttpResponse response) throws IOException {}

protected void doPost(HttpRequest request, HttpResponse response) throws IOException {}
}
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.request.HttpRequest;
import http.response.HttpResponse;
import java.io.IOException;

public interface Controller {

void service(HttpRequest request, HttpResponse response) throws IOException;
}
22 changes: 22 additions & 0 deletions src/main/java/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package controller;

import db.URLDataBase;
import http.MimeType;
import http.request.HttpRequest;
import http.request.RequestLine;
import http.request.RequestURI;
import http.response.HttpResponse;
import java.io.IOException;

public class HomeController extends AbstractController{

@Override
protected void doGet(HttpRequest request, HttpResponse response) throws IOException {
String url = request.getRequestURIPath();
if (URLDataBase.contains(url) || MimeType.isSupportedExtension(url)) {
response.ok(url);
return;
}
response.ok();
}
}
32 changes: 32 additions & 0 deletions src/main/java/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package controller;

import db.UserDataBase;
import http.Cookie;
import http.request.HttpRequest;
import http.response.HttpResponse;
import java.io.IOException;
import java.util.Map;
import model.User;
import util.HttpRequestUtils;

public class LoginController extends AbstractController{

private static final String TRUE = "true";
private static final String LOGIN = "logined";
private static final String USER_ID = "userId";
private static final String PASSWORD = "password";

@Override
protected void doPost(HttpRequest request, HttpResponse response) throws IOException {
String messageBody = request.getMessageBody();
Map<String, String> parsedMessageBody = HttpRequestUtils.parseQueryString(messageBody);
String userId = parsedMessageBody.get(USER_ID);
String password = parsedMessageBody.get(PASSWORD);
User savedUser = UserDataBase.findUserById(userId);
if (UserDataBase.login(savedUser, userId, password)) {
response.found("/index.html", new Cookie(LOGIN, TRUE));
return;
}
response.found("/user/login_failed.html");
}
}
31 changes: 31 additions & 0 deletions src/main/java/controller/SignUpController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package controller;

import db.UserDataBase;
import http.request.HttpRequest;
import http.response.HttpResponse;
import java.io.IOException;
import java.util.Map;
import model.User;
import util.HttpRequestUtils;

public class SignUpController extends AbstractController{

private static final String USER_ID = "userId";
private static final String PASSWORD = "password";
private static final String NAME = "name";
private static final String EMAIL = "email";

@Override
protected void doPost(HttpRequest request, HttpResponse response) throws IOException {
String messageBody = request.getMessageBody();
Map<String, String> parsedMessageBody = HttpRequestUtils.parseQueryString(messageBody);
UserDataBase.addUser(
new User(
parsedMessageBody.get(USER_ID),
parsedMessageBody.get(PASSWORD),
parsedMessageBody.get(NAME),
parsedMessageBody.get(EMAIL))
);
response.found("/index.html");
}
}
36 changes: 36 additions & 0 deletions src/main/java/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package controller;

import db.UserDataBase;
import http.request.HttpRequest;
import http.request.RequestHeaders;
import http.response.HttpResponse;
import java.io.IOException;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.HttpRequestUtils;

public class UserController extends AbstractController{

private static final Logger log = LoggerFactory.getLogger(UserController.class);
private static final String LOGIN = "logined";
private static final String TRUE = "true";

@Override
protected void doGet(HttpRequest request, HttpResponse response) throws IOException {
RequestHeaders requestHeaders = request.getRequestHeaders();
if (!requestHeaders.hasCookie()){
log.debug("RequestHeaders has not Cookie!");
response.ok("/user/login.html");
return;
}

String cookies = requestHeaders.getCookie();
Map<String, String> parsedCookies = HttpRequestUtils.parseCookies(cookies);
if (parsedCookies.get(LOGIN).equals(TRUE)) {
response.ok("/user/list.html", UserDataBase.findAll());
return;
}
response.ok("/user/login.html");
}
}
2 changes: 0 additions & 2 deletions src/main/java/db/UserDataBase.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package db;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import model.User;

public class UserDataBase {
Expand Down
102 changes: 27 additions & 75 deletions src/main/java/handler/RequestHandler.java
Original file line number Diff line number Diff line change
@@ -1,106 +1,58 @@
package handler;

import db.URLDataBase;
import db.UserDataBase;
import http.request.HttpMethod;
import controller.Controller;
import controller.HomeController;
import controller.LoginController;
import controller.SignUpController;
import controller.UserController;
import http.request.HttpRequest;
import http.request.RequestHeaders;
import http.request.RequestLine;
import http.request.RequestMessageBody;
import http.request.RequestURI;
import http.response.HttpResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import util.HttpRequestUtils;

public class RequestHandler extends Thread {

private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
private static final Map<String, Controller> handlerMap = new HashMap<>();

static {
handlerMap.put("/index.html", new HomeController());
handlerMap.put("/user/list", new UserController());
handlerMap.put("/user/list.html", new UserController());
handlerMap.put("/user/create", new SignUpController());
handlerMap.put("/user/login", new LoginController());
}

private final Socket connection;
private Controller controller = new HomeController();;

public RequestHandler(Socket connectionSocket) {
this.connection = connectionSocket;
}

@Override
public void run() {
log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(),
connection.getPort());

try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) {
HttpRequest httpRequest = HttpRequest.from(in);
HttpResponse httpResponse = HttpResponse.ok();
RequestLine requestLine = httpRequest.getRequestLine();
log.info("RequestLine= {}", requestLine);
RequestURI requestUri = requestLine.getRequestUri();
String url = requestUri.getPath();

if (requestLine.getHttpMethod().equals(HttpMethod.GET)) {
if (URLDataBase.contains(url) || url.contains(".css") || url.contains(".js")
|| url.contains(".woff") || url.contains(".ico")) {
httpResponse = HttpResponse.ok(url);
}
if (url.equals("/user/list")) {
RequestHeaders requestHeaders = httpRequest.getRequestHeaders();
String cookies = requestHeaders.getCookie();
log.debug("Cookie= {}", cookies);
if (cookies == null) {
httpResponse = HttpResponse.ok("/user/login.html");
}

if (cookies != null) {
Map<String, String> parseCookies = HttpRequestUtils.parseCookies(cookies);
if (parseCookies.get("logined").equals("false")) {
httpResponse = HttpResponse.ok("/user/login.html");
}
httpResponse = HttpResponse.ok("/user/list.html", UserDataBase.findAll());
}
}
httpResponse.flush(out);
}

if (requestLine.getHttpMethod().equals(HttpMethod.POST)) {
RequestMessageBody requestMessageBody = httpRequest.getRequestMessageBody();
String messageBody = requestMessageBody.getMessageBody();
log.debug("HTTP Message Body = {}", messageBody );

Map<String, String> parsedMessageBody = HttpRequestUtils.parseQueryString(messageBody);
String userId = parsedMessageBody.get("userId");
String password = parsedMessageBody.get("password");
if (url.equals("/user/create")) {
User user = new User(
userId, password,
parsedMessageBody.get("name"),
parsedMessageBody.get("email")
);
UserDataBase.addUser(user);
log.debug("Create User ! = {}", user);
}

if (url.equals("/user/login")) {
User savedUser = UserDataBase.findUserById(userId);
log.debug("saved User = {}", savedUser);
if (!UserDataBase.login(savedUser, userId, password)) {
httpResponse = HttpResponse.found("/user/login_failed.html");
httpResponse.flush(out);
log.debug("Login Fail! userId = {}", userId);
return;
}
log.debug("Login Complete! userId = {}", userId);
httpResponse = HttpResponse.found("/index.html", true);
log.info("Response Headers = {}", httpResponse.getResponseHeaders());
httpResponse.flush(out);
}

httpResponse = HttpResponse.found("/index.html");
HttpResponse httpResponse = new HttpResponse(out);
String url = httpRequest.getRequestURIPath();

if (handlerMap.containsKey(url)) {
controller = handlerMap.get(url);
log.debug("Controller = {}", controller.getClass());
controller.service(httpRequest, httpResponse);
return;
}
httpResponse.flush(out);

controller.service(httpRequest, httpResponse);
} catch (IOException e) {
log.error(e.getMessage());
}
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/http/Cookie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package http;

public class Cookie {

private final String key;
private final String value;

public Cookie(String key, String value) {
this.key = key;
this.value = value;
}

@Override
public String toString() {
return key + "=" + value + ";";
}
}
25 changes: 25 additions & 0 deletions src/main/java/http/MimeType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package http;

import java.util.Arrays;

public enum MimeType {
HTML(".html"), CSS(".css"), JS(".js"), WOFF(".woff"), ICO(".ico"),
TTF(".ttf"), EOT(".eot"), SVG(".svg"), OTF(".otf");

private final String extension;

MimeType(String extension) {
this.extension = extension;
}

public static boolean isSupportedExtension(String url) {
return searchExtension(url) != null;
}

private static MimeType searchExtension(String url){
return Arrays.stream(MimeType.values())
.filter(m -> url.endsWith(m.extension))
.findAny()
.orElse(null);
}
}
Loading