Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[로운] 4단계 - HTTP 웹 서버 구현 미션 제출합니다. #200

Open
wants to merge 3 commits into
base: lowoon
Choose a base branch
from
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
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ bin/
.idea
*.iws
*.iml
*.ipr
*.ipr
22 changes: 22 additions & 0 deletions application/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
.DS_Store
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
/out/
/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

11 changes: 11 additions & 0 deletions application/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
jar {
enabled = true
}

dependencies {
implementation project(':application:module-api')
implementation project(':framework:module-webserver')

implementation 'org.springframework:spring-core:5.2.6.RELEASE'
implementation 'com.github.jknack:handlebars:4.2.0'
}
22 changes: 22 additions & 0 deletions application/module-api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
.DS_Store
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
/out/
/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

13 changes: 13 additions & 0 deletions application/module-api/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
jar {
enabled = true
}

dependencies {
implementation project(':application:module-core')
implementation project(':application:module-common')
implementation project(':framework:module-webserver')

implementation 'org.springframework:spring-core:5.2.6.RELEASE'
implementation 'com.github.jknack:handlebars:4.2.0'
implementation 'ch.qos.logback:logback-classic:1.2.3'
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import java.io.IOException;
import java.net.URISyntaxException;

import webserver.HttpRequest;
import webserver.HttpResponse;
import webserver.HttpStatus;
import domain.HttpRequest;
import domain.HttpResponse;
import domain.HttpStatus;

public abstract class AbstractController implements Controller {
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import java.io.IOException;
import java.net.URISyntaxException;

import webserver.HttpRequest;
import webserver.HttpResponse;
import domain.HttpRequest;
import domain.HttpResponse;

public interface Controller {
void service(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,43 @@

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Objects;

import annotations.Controller;
import annotations.RequestMapping;
import domain.HttpHeader;
import domain.HttpMethod;
import domain.HttpRequest;
import domain.HttpResponse;
import domain.HttpStatus;
import utils.Extension;
import utils.FileIoUtils;
import utils.RequestUtils;
import webserver.HttpHeader;
import webserver.HttpRequest;
import webserver.HttpResponse;
import webserver.HttpStatus;

@Controller
public class FileController extends AbstractController {
@RequestMapping(path = "file", method = HttpMethod.GET)
@Override
public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException, URISyntaxException {
String path = httpRequest.getPath();
byte[] body = FileIoUtils.findStaticFile(path);
if (body != null) {
if (Objects.nonNull(body)) {
httpResponse.setHttpStatus(HttpStatus.OK);
addContentType(httpResponse, path);
httpResponse.addHeader(HttpHeader.CONTENT_LENGTH, String.valueOf(body.length));
httpResponse.forward(body);
}
if (body == null) {
if (Objects.isNull(body)) {
httpResponse.setHttpStatus(HttpStatus.NOT_FOUND);
httpResponse.error();
}
}

private void addContentType(HttpResponse httpResponse, String path) {
String extension = RequestUtils.extractExtension(path);
if (Extension.isJS(extension)) {
httpResponse.addHeader(HttpHeader.CONTENT_TYPE, "application/javascript;charset=utf-8");
}
if (Extension.isCSS(extension) || Extension.isHTML(extension)) {
httpResponse.addHeader(HttpHeader.CONTENT_TYPE,
String.format("text/%s;charset=utf-8", RequestUtils.extractExtension(path)));
String contentType = Extension.getContentType(extension);
if (Objects.nonNull(contentType)) {
httpResponse.addHeader(HttpHeader.CONTENT_TYPE, contentType);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package controller.user;

import java.io.IOException;
import java.util.Objects;

import annotations.Controller;
import annotations.RequestMapping;
import controller.AbstractController;
import cookie.HttpCookie;
import domain.HttpMethod;
import domain.HttpRequest;
import domain.HttpResponse;
import domain.HttpStatus;
import service.user.UserService;
import session.HttpSession;
import user.User;

@Controller
public class LoginController extends AbstractController {
private final UserService userService;

public LoginController() {
userService = UserService.getInstance();
}

public LoginController(UserService userService) {
this.userService = userService;
}

@RequestMapping(path = "/user/login", method = HttpMethod.POST)
@Override
public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
if (!httpRequest.containsAll(User.USER_ID, User.PASSWORD)) {
httpResponse.setHttpStatus(HttpStatus.BAD_REQUEST);
httpResponse.error();
return;
}
setHttpResponse(httpRequest, httpResponse);
}

private void setHttpResponse(HttpRequest httpRequest, HttpResponse httpResponse) throws
IOException {
User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID));
HttpCookie httpCookie = new HttpCookie();
HttpSession httpSession = httpRequest.getHttpSession();
httpResponse.setHttpStatus(HttpStatus.FOUND);
httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId()));
httpCookie.apply(httpResponse);
if (Objects.isNull(user)) {
httpSession.setAttribute("logined", false);
httpResponse.sendRedirect("/user/login_failed.html");
}
if (Objects.nonNull(user)) {
httpSession.setAttribute("logined", true);
httpResponse.sendRedirect("/index.html");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,32 @@
package domain.user.web;
package controller.user;

import java.io.IOException;

import annotations.Controller;
import annotations.RequestMapping;
import controller.AbstractController;
import domain.user.model.User;
import domain.user.service.UserService;
import session.model.HttpSession;
import session.service.SessionService;
import webserver.HttpCookie;
import webserver.HttpRequest;
import webserver.HttpResponse;
import webserver.HttpStatus;
import cookie.HttpCookie;
import domain.HttpMethod;
import domain.HttpRequest;
import domain.HttpResponse;
import domain.HttpStatus;
import service.user.UserService;
import session.HttpSession;
import user.User;

@Controller
public class UserCreateController extends AbstractController {
private final UserService userService;
private final SessionService sessionService;

public UserCreateController(UserService userService, SessionService sessionService) {
public UserCreateController() {
userService = UserService.getInstance();
}

public UserCreateController(UserService userService) {
this.userService = userService;
this.sessionService = sessionService;
}

@RequestMapping(path = "/user/create", method = HttpMethod.POST)
@Override
public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
if (!httpRequest.containsAll(User.USER_ID, User.PASSWORD, User.NAME, User.EMAIL)) {
Expand All @@ -33,7 +39,6 @@ public void doPost(HttpRequest httpRequest, HttpResponse httpResponse) throws IO
userService.addUser(user);
HttpSession httpSession = new HttpSession();
httpSession.setAttribute("logined", true);
sessionService.addSession(httpSession);
HttpCookie httpCookie = new HttpCookie();
httpCookie.add(String.format("SESSIONID=%s; Path=/", httpSession.getId()));
httpCookie.apply(httpResponse);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,34 +1,40 @@
package domain.user.web;
package controller.user;

import java.io.IOException;
import java.util.List;

import com.fasterxml.jackson.databind.ObjectMapper;

import annotations.Controller;
import annotations.RequestMapping;
import controller.AbstractController;
import domain.user.model.User;
import domain.user.service.UserService;
import session.service.SessionService;
import webserver.HttpHeader;
import webserver.HttpRequest;
import webserver.HttpResponse;
import webserver.HttpStatus;
import domain.HttpHeader;
import domain.HttpMethod;
import domain.HttpRequest;
import domain.HttpResponse;
import domain.HttpStatus;
import service.user.UserService;
import user.User;

@Controller
public class UserListController extends AbstractController {
private final UserService userService;
private final SessionService sessionService;
private final ObjectMapper objectMapper;

public UserListController(UserService userService, SessionService sessionService, ObjectMapper objectMapper) {
public UserListController() {
userService = UserService.getInstance();
objectMapper = new ObjectMapper();
}

public UserListController(UserService userService, ObjectMapper objectMapper) {
this.userService = userService;
this.sessionService = sessionService;
this.objectMapper = objectMapper;
}

@RequestMapping(path = "/user/list", method = HttpMethod.GET)
@Override
public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
if (httpRequest.getSessionId() == null ||
!(boolean)sessionService.findById(httpRequest.getSessionId()).getAttribute("logined")) {
if (httpRequest.notAuthorized()) {
httpResponse.setHttpStatus(HttpStatus.UNAUTHORIZED);
httpResponse.sendRedirect("/user/login.html");
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,41 @@
package domain.user.web;
package controller.user;

import java.io.IOException;
import java.util.Objects;

import com.fasterxml.jackson.databind.ObjectMapper;

import annotations.Controller;
import annotations.RequestMapping;
import controller.AbstractController;
import domain.user.model.User;
import domain.user.service.UserService;
import webserver.HttpHeader;
import webserver.HttpRequest;
import webserver.HttpResponse;
import webserver.HttpStatus;
import domain.HttpHeader;
import domain.HttpMethod;
import domain.HttpRequest;
import domain.HttpResponse;
import domain.HttpStatus;
import service.user.UserService;
import user.User;

@Controller
public class UserReadController extends AbstractController {
private final UserService userService;
private final ObjectMapper objectMapper;

public UserReadController() {
userService = UserService.getInstance();
objectMapper = new ObjectMapper();
}

public UserReadController(UserService userService, ObjectMapper objectMapper) {
this.userService = userService;
this.objectMapper = objectMapper;
}

@RequestMapping(path = "/user/profile", method = HttpMethod.GET)
@Override
public void doGet(HttpRequest httpRequest, HttpResponse httpResponse) throws IOException {
User user = userService.findByUserId(httpRequest.getParameter(User.USER_ID));
if (user == null) {
if (Objects.isNull(user)) {
validateParameter(httpRequest, httpResponse);
httpResponse.error();
return;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package domain.user.service;
package service.user;

import java.util.ArrayList;
import java.util.List;

import domain.user.db.UserRepository;
import domain.user.model.User;
import user.User;
import user.UserRepository;

public class UserService {
private static final UserService instance = new UserService();
Expand Down
Loading