Skip to content
Open

done #47

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

public abstract class AbstractController implements Controller
{
@Override
public void service(HttpRequest request, HttpResponse response)
{
if (request.getMethod().equals("POST"))
doPost(request, response);
else if (request.getMethod().equals("GET"))
doGet(request, response);
}
public abstract void doPost(HttpRequest request, HttpResponse response);
public abstract void doGet(HttpRequest request, HttpResponse response);
}
5 changes: 5 additions & 0 deletions src/main/java/webserver/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package webserver;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import db.DataBase;
import model.User;

public class CreateUserController extends AbstractController{
private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
@Override
public void doPost(HttpRequest request, HttpResponse response)
{
User user = new User(request.getParameter("userId"), request.getParameter("password"), request.getParameter("name"),
request.getParameter("email"));
log.debug("user : {}", user);
DataBase.addUser(user);
response.sendRedirect("/index.html");
}
@Override
public void doGet(HttpRequest request, HttpResponse response) {}
}
86 changes: 86 additions & 0 deletions src/main/java/webserver/HttpRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package webserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import util.HttpRequestUtils;
import util.IOUtils;

public class HttpRequest extends Thread
{
private String method;
private String path;
private Map<String, String> headers = new HashMap<String, String>();
private Map<String, String> params = new HashMap<String, String>();

private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);
public HttpRequest(InputStream in)
{
try{
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line = br.readLine();
if (line == null)
return ;
processRequestLine(line);
line = br.readLine();
while (!line.equals(""))
{
log.debug("header : {}", line);
String[] tokens = line.split(":");
headers.put(tokens[0].trim(), tokens[1].trim());
line = br.readLine();
}
if ("POST".equals(method))
{
String body = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length")));
params = HttpRequestUtils.parseQueryString(body);
}
}catch (IOException e) {
log.error(e.getMessage());
}catch (Exception e){
log.error(e.getMessage());
}
}
private void processRequestLine(String requestLine)
{
log.debug("request line : {}", requestLine);
String[] tokens = requestLine.split(" ");
method = tokens[0];

if ("POST".equals(method))
{
path = tokens[1];
return ;
}
int index = tokens[1].indexOf("?");
if (index == -1)
path = tokens[1];
else
{
path = tokens[1].substring(0, index);
params = HttpRequestUtils.parseQueryString(tokens[1].substring(index + 1));
}
}
public String getMethod() {
return method;
}
public String getPath() {
return path;
}
public String getHeader(String name)
{
return headers.get(name);
}
public String getParameter(String name)
{
return params.get(name);
}
}
91 changes: 91 additions & 0 deletions src/main/java/webserver/HttpResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package webserver;

import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HttpResponse {
private static final Logger log = LoggerFactory.getLogger(HttpResponse.class);
private DataOutputStream dos = null;
private Map<String, String> headers = new HashMap<String, String>();

public HttpResponse(OutputStream out) {
dos = new DataOutputStream(out);
}
public void addHeader(String key, String value)
{
headers.put("key", "value");
}
public void forward(String url) {
try {
byte[] body = Files.readAllBytes(new File("./webapp" + url).toPath());
if (url.endsWith(".css"))
headers.put("Content-type", "text/css");
else if (url.endsWith(".js"))
headers.put("Content-type", "applicatoin/javascript");
else
headers.put("Content-type", "text/html;charset=utf-8");
headers.put("Content-length", body.length + "");
response200Header(body.length);
responseBody(body);
}catch (IOException e) {
log.error(e.getMessage());
}
}
public void forwardBody(String body)
{
byte[] contents = body.getBytes();
headers.put("Content-Type", "text/html;charset=utf-8");
headers.put("Content-Length", contents.length + "");
response200Header(contents.length);
responseBody(contents);
}
public void sendRedirect(String redirectUrl)
{
try {
dos.writeBytes("HTTP/1.1 302 Found \r\n");
processHeaders();
dos.writeBytes("Location: " + redirectUrl + " \r\n");
dos.writeBytes("\r\n");
}catch (IOException e){
log.error(e.getMessage());
}
}
private void response200Header(int lengthOfBodyContent)
{
try {
dos.writeBytes("HTTP/1.1 200 OK \r\n");
processHeaders();
dos.writeBytes("\r\n");
}catch (IOException e) {
log.error(e.getMessage());
}
}
private void responseBody(byte[] body) {
try {
dos.write(body, 0, body.length);
dos.writeBytes("\r\n");
dos.flush();
}catch (IOException e) {
log.error(e.getMessage());
}
}
private void processHeaders(){
try {
Set<String> keys = headers.keySet();
for (String key : keys) {
dos.writeBytes(key + ": " + headers.get(key) + " \r\n");
}
}catch (IOException e) {
log.error(e.getMessage());
}
}
}
40 changes: 40 additions & 0 deletions src/main/java/webserver/ListUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package webserver;

import java.util.Collection;
import java.util.Map;

import db.DataBase;
import model.User;
import util.HttpRequestUtils;

public class ListUserController extends AbstractController{
@Override
public void doGet(HttpRequest request, HttpResponse response)
{
if (!isLogin(request.getHeader("Cookie"))) {
response.sendRedirect("/user/login.html");
}
Collection<User> users = DataBase.findAll();
StringBuilder sb = new StringBuilder();
sb.append("<tabble border='1'>");
for (User user : users) {
sb.append("<tr>");
sb.append("<td>" + user.getUserId() + "</td>");
sb.append("<td>" + user.getName() + "</td>");
sb.append("<td>" + user.getEmail() + "</td>");
sb.append("</tr>");
}
response.forwardBody(sb.toString());
}
@Override
public void doPost(HttpRequest request, HttpResponse response){}
public boolean isLogin(String line)
{
String[] headerTokens = line.split(":");
Map<String, String> cookies = HttpRequestUtils.parseCookies(headerTokens[1].trim());
String value = cookies.get("logined");
if (value == null)
return false;
return Boolean.parseBoolean(value);
}
}
25 changes: 25 additions & 0 deletions src/main/java/webserver/LoginController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package webserver;

import db.DataBase;
import model.User;

public class LoginController extends AbstractController
{
@Override
public void doPost(HttpRequest request, HttpResponse response)
{
User user = DataBase.findUserById(request.getParameter("userId"));
if (user != null) {
if (user.login(request.getParameter("password"))) {
response.addHeader("Set-Cookie", "logined=true");
response.sendRedirect("/index.html");
} else {
response.sendRedirect("/user/login_failed.html");
}
}else {
response.sendRedirect("/user/login_failed.html");
}
}
@Override
public void doGet(HttpRequest request, HttpResponse response) {}
}
Loading