Skip to content
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package db;
package app.db;

import model.User;
import app.model.User;

import java.util.Collection;
import java.util.HashMap;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package webserver;
package app.handler;

import db.Database;
import model.User;
import webserver.http.HttpMethod;
import webserver.http.request.HttpRequest;
import webserver.web.handler.DynamicViewHandler;
import webserver.web.handler.response.view.ViewResponse;
import app.db.Database;
import app.model.User;
import http.HttpMethod;
import http.request.HttpRequest;
import web.handler.DynamicViewHandler;
import web.response.ViewResponse;

public class RegisterHandlerImpl extends DynamicViewHandler {
public RegisterHandlerImpl() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package model;
package app.model;

public class User {
private String userId;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package webserver;
package bootstrap;

import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import dependency.DependencyLoader;
import config.DependencyLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.http.HttpServlet;
import web.dispatch.ConnectionHandler;

public class WebServer {
private static final Logger logger = LoggerFactory.getLogger(WebServer.class);
Expand All @@ -33,12 +33,12 @@ public static void main(String args[]) throws Exception {
while ((connection = listenSocket.accept()) != null) {
Socket singleConnection = connection;
executor.submit(() -> {
HttpServlet httpServlet = new HttpServlet(LOADER.wasServlet,
ConnectionHandler connectionHandler = new ConnectionHandler(LOADER.dispatcher,
LOADER.exceptionHandlerMapping,
LOADER.httpResponseConverter,
LOADER.httpRequestConverter,
singleConnection);
httpServlet.run();
connectionHandler.run();
});
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package dependency;
package config;

import webserver.RegisterHandlerImpl;
import webserver.exception.ExceptionHandlerMapping;
import webserver.exception.handler.ErrorExceptionHandler;
import webserver.exception.handler.ServiceExceptionHandler;
import webserver.exception.handler.UnhandledErrorHandler;
import webserver.http.request.HttpBufferedReaderRequestConverter;
import webserver.http.request.HttpRequestConverter;
import webserver.http.response.HttpBufferedStreamResponseConverter;
import webserver.http.response.HttpResponseConverter;
import webserver.web.WasServlet;
import webserver.web.handler.StaticContentHandler;
import webserver.web.handler.WebHandler;
import webserver.web.handler.response.handler.StaticContentResponseHandler;
import webserver.web.handler.response.handler.ViewResponseHandler;
import webserver.web.handler.response.handler.WebHandlerResponseHandler;
import app.handler.RegisterHandlerImpl;
import exception.ExceptionHandlerMapping;
import exception.handler.ErrorExceptionHandler;
import exception.handler.ServiceExceptionHandler;
import exception.handler.UnhandledErrorHandler;
import http.request.HttpBufferedReaderRequestConverter;
import http.request.HttpRequestConverter;
import http.response.HttpBufferedStreamResponseConverter;
import http.response.HttpResponseConverter;
import web.dispatch.Dispatcher;
import web.handler.StaticContentHandler;
import web.handler.WebHandler;
import web.posthandler.StaticContentResponseHandler;
import web.posthandler.ViewResponseHandler;
import web.posthandler.WebHandlerResponseHandler;

import java.util.List;

Expand All @@ -37,8 +37,8 @@ public HttpResponseConverter httpResponseConverter(){


//Web
public WasServlet wasServlet(){
return new WasServlet(
public Dispatcher dispatcher(){
return new Dispatcher(
webHandlerList(),
webHandlerResponseHandlerList()
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package dependency;
package config;

import webserver.exception.ExceptionHandlerMapping;
import webserver.http.request.HttpRequestConverter;
import webserver.http.response.HttpResponseConverter;
import webserver.web.WasServlet;
import exception.ExceptionHandlerMapping;
import http.request.HttpRequestConverter;
import http.response.HttpResponseConverter;
import web.dispatch.Dispatcher;

public class DependencyLoader {
private final AppConfig appConfig;

public final HttpRequestConverter httpRequestConverter;
public final HttpResponseConverter httpResponseConverter;
public final ExceptionHandlerMapping exceptionHandlerMapping;
public final WasServlet wasServlet;
public final Dispatcher dispatcher;

public DependencyLoader(){
this.appConfig = new AppConfig();
this.httpRequestConverter = appConfig.httpRequestConverter();
this.httpResponseConverter = appConfig.httpResponseConverter();
this.exceptionHandlerMapping = appConfig.exceptionHandlerMapping();
this.wasServlet = appConfig.wasServlet();
this.dispatcher = appConfig.dispatcher();
}
}
9 changes: 9 additions & 0 deletions src/main/java/config/VariableConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package config;

import java.util.List;

public class VariableConfig {
public static final List<String> STATIC_RESOURCE_ROOTS = List.of(
"./src/main/resources",
"./src/main/resources/static");
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package webserver.exception;
package exception;


import webserver.http.HttpStatus;
import http.HttpStatus;

public enum ErrorCode {
/* Internal Error */
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

public class ErrorException extends RuntimeException {
private final ErrorCode errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

import java.net.Socket;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

import java.net.Socket;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.exception;
package exception;

public class ServiceException extends RuntimeException {
private final ErrorCode errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package webserver.exception.handler;
package exception.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.exception.ErrorCode;
import webserver.exception.ErrorException;
import webserver.exception.ExceptionHandler;
import webserver.http.HttpStatus;
import exception.ErrorCode;
import exception.ErrorException;
import exception.ExceptionHandler;
import http.HttpStatus;

import java.io.IOException;
import java.io.OutputStream;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package webserver.exception.handler;
package exception.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.exception.ErrorCode;
import webserver.exception.ServiceException;
import webserver.exception.ExceptionHandler;
import webserver.http.HttpStatus;
import exception.ErrorCode;
import exception.ServiceException;
import exception.ExceptionHandler;
import http.HttpStatus;

import java.io.IOException;
import java.io.OutputStream;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package webserver.exception.handler;
package exception.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webserver.exception.ExceptionHandler;
import exception.ExceptionHandler;

import java.io.IOException;
import java.io.OutputStream;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http;
package http;

public enum HttpMethod {
GET,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http;
package http;

public enum HttpStatus {
OK(200),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.request;
package http.request;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package webserver.http.request;
package http.request;

import webserver.exception.ErrorCode;
import webserver.exception.ErrorException;
import webserver.exception.ServiceException;
import webserver.http.HttpMethod;
import exception.ErrorCode;
import exception.ErrorException;
import exception.ServiceException;
import http.HttpMethod;

import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.request;
package http.request;

import java.net.Socket;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.response;
package http.response;

import java.io.BufferedOutputStream;
import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package webserver.http.response;
package http.response;

import webserver.http.HttpStatus;
import http.HttpStatus;

import java.io.File;
import java.net.URLConnection;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
Expand Down Expand Up @@ -58,4 +60,28 @@ public void setBody(byte[] body) {
this.body = body;
setHeader("Content-Length", String.valueOf(body.length));
}

public void setBody(File file, byte[] body) {
this.body = body;
setHeader("Content-Type", guessContentType(file));
setHeader("Content-Length", String.valueOf(body.length));
}

private String guessContentType(File file) {
String byName = URLConnection.guessContentTypeFromName(file.getName());
if (byName != null) return byName;

String name = file.getName().toLowerCase();
if (name.endsWith(".html") || name.endsWith(".htm")) return "text/html; charset=utf-8";
if (name.endsWith(".css")) return "text/css; charset=utf-8";
if (name.endsWith(".js")) return "application/javascript; charset=utf-8";
if (name.endsWith(".json")) return "application/json; charset=utf-8";
if (name.endsWith(".png")) return "image/png";
if (name.endsWith(".jpg") || name.endsWith(".jpeg")) return "image/jpeg";
if (name.endsWith(".gif")) return "image/gif";
if (name.endsWith(".svg")) return "image/svg+xml";
if (name.endsWith(".txt")) return "text/plain; charset=utf-8";

return "application/octet-stream";
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package webserver.http.response;
package http.response;

import java.net.Socket;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,26 @@
package webserver.http;
package web.dispatch;

import webserver.exception.ExceptionHandlerMapping;
import webserver.http.response.HttpResponseConverter;
import webserver.web.WasServlet;
import webserver.http.request.HttpRequestConverter;
import webserver.http.request.HttpRequest;
import webserver.http.response.HttpResponse;
import exception.ExceptionHandlerMapping;
import http.response.HttpResponseConverter;
import http.request.HttpRequestConverter;
import http.request.HttpRequest;
import http.response.HttpResponse;

import java.net.Socket;

public class HttpServlet implements Runnable{
public class ConnectionHandler implements Runnable{
private final Socket connection;
private final HttpRequestConverter requestConverter;
private final HttpResponseConverter responseConverter;
private final ExceptionHandlerMapping exceptionHandlerMapping;
private final WasServlet wasServlet;

public HttpServlet(WasServlet wasServlet,
ExceptionHandlerMapping exceptionHandlerMapping,
HttpResponseConverter responseConverter,
HttpRequestConverter requestConverter,
Socket connection) {
this.wasServlet = wasServlet;
private final Dispatcher dispatcher;

public ConnectionHandler(Dispatcher dispatcher,
ExceptionHandlerMapping exceptionHandlerMapping,
HttpResponseConverter responseConverter,
HttpRequestConverter requestConverter,
Socket connection) {
this.dispatcher = dispatcher;
this.exceptionHandlerMapping = exceptionHandlerMapping;
this.responseConverter = responseConverter;
this.requestConverter = requestConverter;
Expand All @@ -34,7 +33,7 @@ public void run() {
try {

HttpRequest request = requestConverter.parseRequest(connection);
HttpResponse response = wasServlet.handle(request);
HttpResponse response = dispatcher.handle(request);
responseConverter.sendResponse(response, connection);

} catch (Exception e){
Expand Down
Loading