diff --git a/build.gradle b/build.gradle index 039b2bc..f3e7889 100644 --- a/build.gradle +++ b/build.gradle @@ -23,4 +23,4 @@ dependencies { test { useJUnitPlatform() -} \ No newline at end of file +} diff --git a/src/main/java/controller/AbstractController.java b/src/main/java/controller/AbstractController.java new file mode 100644 index 0000000..a26dbdb --- /dev/null +++ b/src/main/java/controller/AbstractController.java @@ -0,0 +1,27 @@ +package controller; + +import webserver.HttpMethod; +import webserver.HttpRequest; +import webserver.HttpResponse; + +public abstract class AbstractController implements Controller { + + @Override + public void service(HttpRequest request, HttpResponse response) { + HttpMethod method = request.getMethod(); + + if (method.isPost()) { + doPost(request, response); + } else { + doGet(request, response); + } + } + + public void doPost(HttpRequest request, HttpResponse response) { + + } + + public void doGet(HttpRequest request, HttpResponse response) { + + } +} diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java new file mode 100644 index 0000000..a3dda1d --- /dev/null +++ b/src/main/java/controller/Controller.java @@ -0,0 +1,8 @@ +package controller; + +import webserver.HttpRequest; +import webserver.HttpResponse; + +public interface Controller { + void service(HttpRequest request, HttpResponse response); +} diff --git a/src/main/java/controller/CreateUserController.java b/src/main/java/controller/CreateUserController.java new file mode 100644 index 0000000..c1e9f6a --- /dev/null +++ b/src/main/java/controller/CreateUserController.java @@ -0,0 +1,23 @@ +package controller; + +import db.DataBase; +import model.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import webserver.HttpRequest; +import webserver.HttpResponse; + +public class CreateUserController extends AbstractController { + private static final Logger log = LoggerFactory.getLogger(CreateUserController.class); + + @Override + public void doPost(HttpRequest request, HttpResponse response) { + String userId = request.getParameter("userId"); + String password = request.getParameter("password"); + String name = request.getParameter("name"); + String email = request.getParameter("email"); + DataBase.addUser(new User(userId, password, name, email)); + response.sendRedirect("/index.html"); + log.debug("{}님이 회원가입에 성공하셨습니다.", userId); + } +} diff --git a/src/main/java/controller/ListUserController.java b/src/main/java/controller/ListUserController.java new file mode 100644 index 0000000..475d925 --- /dev/null +++ b/src/main/java/controller/ListUserController.java @@ -0,0 +1,62 @@ +package controller; + +import db.DataBase; +import model.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import util.HttpRequestUtils; +import webserver.HttpRequest; +import webserver.HttpResponse; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Collection; +import java.util.Map; + +public class ListUserController extends AbstractController { + private static final Logger log = LoggerFactory.getLogger(ListUserController.class); + + @Override + public void doGet(HttpRequest request, HttpResponse response) { + String cookies = request.getHeader("Cookie"); + Map cookieStringMap = HttpRequestUtils.parseCookies(cookies); + log.info("Cookie: {}", cookieStringMap.toString()); + if (cookieStringMap.get("logined").equals("false")) { + response.sendRedirect("/user/login.html"); + } else { + String url = "/user/list.html"; + byte[] body = new byte[0]; + try { + body = Files.readAllBytes(new File("./webapp" + url).toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + String bodyStr = new String(body); + int tbodyIndex = bodyStr.indexOf(""); + log.info("bodyStr : {}", bodyStr.substring(0, tbodyIndex + 7)); + + StringBuilder result = new StringBuilder(bodyStr.substring(0, tbodyIndex + 7)); + Collection users = DataBase.findAll(); + int id = 0; + for (User user : users) { + id++; + result.append("") + .append(id).append(" ") + .append(user.getUserId()).append(" ") + .append(user.getName()).append(" ") + .append(user.getEmail()).append(" ") + .append("수정"); + } + result.append(bodyStr.substring(tbodyIndex + 7)); + log.info("result: {}", result.toString()); + response.response200Header(result.toString().getBytes().length, "text/html"); + response.responseBody(result.toString().getBytes()); + } + } + + public boolean isLogin(String id) { + + return false; + } +} diff --git a/src/main/java/controller/LoginController.java b/src/main/java/controller/LoginController.java new file mode 100644 index 0000000..e47db39 --- /dev/null +++ b/src/main/java/controller/LoginController.java @@ -0,0 +1,28 @@ +package controller; + +import db.DataBase; +import model.User; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import webserver.HttpRequest; +import webserver.HttpResponse; + +public class LoginController extends AbstractController { + private static final Logger log = LoggerFactory.getLogger(LoginController.class); + + @Override + public void doPost(HttpRequest request, HttpResponse response) { + String userId = request.getParameter("userId"); + String password = request.getParameter("password"); + User targetUser = DataBase.findUserById(userId); + // todo : 세션의 작동원리를 깊히 생각해보기 + if (targetUser == null || !password.equals(targetUser.getPassword())) { + response.addHeader("Set-Cookie", "logined=false"); + response.sendRedirect("/user/login_failed.html"); + } else if (password.equals(targetUser.getPassword())) { + response.addHeader("Set-Cookie", "logined=true"); + response.sendRedirect("/index.html"); + log.info("{}님이 로그인하셨습니다.", userId); + } + } +} diff --git a/src/main/java/webserver/HttpMethod.java b/src/main/java/webserver/HttpMethod.java index 3db4524..a6214f9 100644 --- a/src/main/java/webserver/HttpMethod.java +++ b/src/main/java/webserver/HttpMethod.java @@ -2,4 +2,8 @@ public enum HttpMethod { GET, POST; + + public boolean isPost() { + return this == POST; + } } diff --git a/src/main/java/webserver/HttpRequest.java b/src/main/java/webserver/HttpRequest.java index 9be415f..df29087 100644 --- a/src/main/java/webserver/HttpRequest.java +++ b/src/main/java/webserver/HttpRequest.java @@ -5,28 +5,66 @@ import util.HttpRequestUtils; import util.IOUtils; -import java.io.BufferedReader; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; import java.util.Map; public class HttpRequest { private static final Logger log = LoggerFactory.getLogger(HttpRequest.class); - private String startLine; + private String requestLine; private Map headers; + private BufferedReader br; + private String RequestBody; + private Map parameters; - public HttpRequest(String startLine, Map headers) { - this.startLine = startLine; - this.headers = headers; + public HttpRequest(InputStream in) { + try { + br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); + requestLine = br.readLine(); + String line = requestLine; + if (line == null) { + return; + } + headers = new HashMap<>(); + while (!line.isEmpty()) { + log.info("headers : {}", line); + line = br.readLine(); + if (line == null) { + break; + } + String[] headerTokens = line.split(": "); + if (headerTokens.length == 2) { + headers.put(headerTokens[0], headerTokens[1]); + } + } + if (headers.get("Content-Length") == null) { + String tokens = requestLine.split(" ")[1]; + String queryString = tokens.substring(tokens.indexOf("?") + 1); + parameters = HttpRequestUtils.parseQueryString(queryString); + } + if (headers.get("Content-Length") != null) { + RequestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length"))); + parameters = HttpRequestUtils.parseQueryString(RequestBody); + } + log.info("parameters : {}", parameters.toString()); + } catch (IOException e) { + e.printStackTrace(); + } } public HttpMethod getMethod() { - String[] tokens = startLine.split(" "); + String[] tokens = requestLine.split(" "); String method = tokens[0]; return HttpMethod.valueOf(method); } public String getPath() { - String[] tokens = startLine.split(" "); + String[] tokens = requestLine.split(" "); + if (tokens[1].contains("?")) { + return tokens[1].substring(0, tokens[1].indexOf("?")); + } return tokens[1]; } @@ -34,10 +72,11 @@ public String getHeader(String fieldName) { return headers.get(fieldName); } - public String getParameter(String fieldName, BufferedReader br) throws Exception { - String RequestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length"))); - Map parameters = HttpRequestUtils.parseQueryString(RequestBody); - log.info("parameters : {}", parameters.toString()); + public Map headers() { + return headers; + } + + public String getParameter(String fieldName) { return parameters.get(fieldName); } } diff --git a/src/main/java/webserver/HttpResponse.java b/src/main/java/webserver/HttpResponse.java index fa2c929..08fd717 100644 --- a/src/main/java/webserver/HttpResponse.java +++ b/src/main/java/webserver/HttpResponse.java @@ -25,9 +25,11 @@ public void addHeader(String fieldName, String fieldValue) { public void forward(String url) throws IOException { byte[] body = Files.readAllBytes(new File("./webapp" + url).toPath()); if (url.endsWith(".css")) { - response200HeaderWithCss(body.length); + response200Header(body.length, "text/css"); + } else if (url.endsWith(".js")) { + response200Header(body.length, "application/javascript"); } else { - response200Header(body.length); + response200Header(body.length, "text/html"); } responseBody(body); } @@ -36,21 +38,10 @@ public void forwardBody(String string) { } - public void response200HeaderWithCss(int lengthOfBodyContent) { + public void response200Header(int lengthOfBodyContent, String contentType) { try { dos.writeBytes("HTTP/1.1 200 OK \r\n"); - dos.writeBytes("Content-Type: text/css;charset=utf-8\r\n"); - dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); - dos.writeBytes("\r\n"); - } catch (IOException e) { - log.error(e.getMessage()); - } - } - - public void response200Header(int lengthOfBodyContent) { - try { - dos.writeBytes("HTTP/1.1 200 OK \r\n"); - dos.writeBytes("Content-Type: text/html;charset=utf-8\r\n"); + dos.writeBytes("Content-Type:" + contentType + ";charset=utf-8\r\n"); dos.writeBytes("Content-Length: " + lengthOfBodyContent + "\r\n"); dos.writeBytes("\r\n"); } catch (IOException e) { @@ -73,7 +64,7 @@ public void sendRedirect(String url) { processHeaders(); dos.writeBytes("Location: " + url + "\r\n"); } catch (IOException e) { - + e.printStackTrace(); } } diff --git a/src/main/java/webserver/RequestHandler.java b/src/main/java/webserver/RequestHandler.java index 75f3e21..c45ac6b 100644 --- a/src/main/java/webserver/RequestHandler.java +++ b/src/main/java/webserver/RequestHandler.java @@ -2,20 +2,27 @@ import java.io.*; import java.net.Socket; -import java.nio.file.Files; -import java.util.*; +import java.util.HashMap; +import java.util.Map; -import db.DataBase; -import model.User; +import controller.Controller; +import controller.CreateUserController; +import controller.ListUserController; +import controller.LoginController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import util.HttpRequestUtils; -import util.IOUtils; public class RequestHandler extends Thread { private static final Logger log = LoggerFactory.getLogger(RequestHandler.class); - private Socket connection; + private static final Map CONTROLLER_MAP = new HashMap<>(); + private final Socket connection; + + static { + CONTROLLER_MAP.put("/create", new CreateUserController()); + CONTROLLER_MAP.put("/login", new LoginController()); + CONTROLLER_MAP.put("/list", new ListUserController()); + } public RequestHandler(Socket connectionSocket) { this.connection = connectionSocket; @@ -26,88 +33,19 @@ public void run() { connection.getPort()); try (InputStream in = connection.getInputStream(); OutputStream out = connection.getOutputStream()) { - // TODO 사용자 요청에 대한 처리는 이 곳에 구현하면 된다. - BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); - - String requestLine = br.readLine(); - String line = requestLine; - Map headers = new HashMap<>(); - while (!"".equals(line)) { - System.out.println(line); - line = br.readLine(); - String[] headerTokens = line.split(": "); - if (headerTokens.length == 2) { - headers.put(headerTokens[0], headerTokens[1]); - } - } - - HttpRequest httpRequest = new HttpRequest(requestLine, headers); + HttpRequest httpRequest = new HttpRequest(in); HttpResponse httpResponse = new HttpResponse(out); HttpMethod method = httpRequest.getMethod(); log.info("Http Method: {}", method.name()); String url = httpRequest.getPath(); log.info("path : {}", url); - DataOutputStream dos = new DataOutputStream(out); - - if (url.startsWith("/create")) { - String RequestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length"))); - Map parameters = HttpRequestUtils.parseQueryString(RequestBody); - log.info("user : {}", parameters.toString()); - DataBase.addUser(new User(parameters.get("userId"), parameters.get("password"), parameters.get("name"), parameters.get("email"))); - httpResponse.sendRedirect("/index.html"); - } else if (url.startsWith("/login")) { - String contentLength = headers.get("Content-Length"); - log.info("contentLength : {}", contentLength); - String RequestBody = IOUtils.readData(br, Integer.parseInt(headers.get("Content-Length"))); - - Map info = HttpRequestUtils.parseQueryString(RequestBody); - String userId = info.get("userId"); - String password = info.get("password"); - User targetUser = DataBase.findUserById(userId); - log.info("userId : {}", userId); - log.info("password : {}", password); - if (targetUser == null || !password.equals(targetUser.getPassword())) { - httpResponse.addHeader("Set-Cookie", "logined=false"); - httpResponse.sendRedirect("/user/login_failed.html"); - } else if (password.equals(targetUser.getPassword())) { - log.info("로그인 성공"); - httpResponse.addHeader("Set-Cookie", "logined=true"); - httpResponse.sendRedirect("/index.html"); - } - } else if (url.startsWith("/list")) { - String cookies = headers.get("Cookie"); - Map cookieStringMap = HttpRequestUtils.parseCookies(cookies); - log.info("Cookie: {}", cookieStringMap.toString()); - if (cookieStringMap.get("logined").equals("false")) { - httpResponse.sendRedirect("/user/login.html"); - } else { - url = "/user/list.html"; - byte[] body = Files.readAllBytes(new File("./webapp" + url).toPath()); - String bodyStr = new String(body); - int tbodyIndex = bodyStr.indexOf(""); - log.info("bodyStr : {}", bodyStr.substring(0, tbodyIndex + 7)); - - StringBuilder result = new StringBuilder(bodyStr.substring(0, tbodyIndex + 7)); - Collection users = DataBase.findAll(); - int id = 0; - for (User user : users) { - id++; - result.append("") - .append(id).append(" ") - .append(user.getUserId()).append(" ") - .append(user.getName()).append(" ") - .append(user.getEmail()).append(" ") - .append("수정"); - } - result.append(bodyStr.substring(tbodyIndex + 7)); - log.info("result: {}", result.toString()); - httpResponse.response200Header(result.toString().getBytes().length); - httpResponse.responseBody(result.toString().getBytes()); - } - } else { + if (!CONTROLLER_MAP.containsKey(url)) { httpResponse.forward(url); + return; } + Controller controller = CONTROLLER_MAP.get(url); + controller.service(httpRequest, httpResponse); } catch (IOException e) { log.error(e.getMessage()); } diff --git a/src/test/java/util/HttpRequestUtilsTest.java b/src/test/java/util/HttpRequestUtilsTest.java index a4265f5..fb83e0b 100644 --- a/src/test/java/util/HttpRequestUtilsTest.java +++ b/src/test/java/util/HttpRequestUtilsTest.java @@ -1,73 +1,71 @@ package util; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; - import java.util.Map; -import org.junit.Test; - +import org.junit.jupiter.api.Test; import util.HttpRequestUtils.Pair; +import static org.assertj.core.api.Assertions.assertThat; + public class HttpRequestUtilsTest { @Test public void parseQueryString() { String queryString = "userId=javajigi"; Map parameters = HttpRequestUtils.parseQueryString(queryString); - assertThat(parameters.get("userId"), is("javajigi")); - assertThat(parameters.get("password"), is(nullValue())); + assertThat(parameters.get("userId")).isEqualTo("javajigi"); + assertThat(parameters.get("password")).isNull(); queryString = "userId=javajigi&password=password2"; parameters = HttpRequestUtils.parseQueryString(queryString); - assertThat(parameters.get("userId"), is("javajigi")); - assertThat(parameters.get("password"), is("password2")); + assertThat(parameters.get("userId")).isEqualTo("javajigi"); + assertThat(parameters.get("password")).isEqualTo("password2"); } @Test public void parseQueryString_null() { Map parameters = HttpRequestUtils.parseQueryString(null); - assertThat(parameters.isEmpty(), is(true)); + assertThat(parameters.isEmpty()).isTrue(); parameters = HttpRequestUtils.parseQueryString(""); - assertThat(parameters.isEmpty(), is(true)); + assertThat(parameters.isEmpty()).isTrue(); parameters = HttpRequestUtils.parseQueryString(" "); - assertThat(parameters.isEmpty(), is(true)); + assertThat(parameters.isEmpty()).isTrue(); } @Test public void parseQueryString_invalid() { String queryString = "userId=javajigi&password"; Map parameters = HttpRequestUtils.parseQueryString(queryString); - assertThat(parameters.get("userId"), is("javajigi")); - assertThat(parameters.get("password"), is(nullValue())); + assertThat(parameters.get("userId")).isEqualTo("javajigi"); + assertThat(parameters.get("password")).isNull(); } @Test public void parseCookies() { String cookies = "logined=true; JSessionId=1234"; Map parameters = HttpRequestUtils.parseCookies(cookies); - assertThat(parameters.get("logined"), is("true")); - assertThat(parameters.get("JSessionId"), is("1234")); - assertThat(parameters.get("session"), is(nullValue())); + assertThat(parameters.get("logined")).isEqualTo("true"); + assertThat(parameters.get("JSessionId")).isEqualTo("1234"); + assertThat(parameters.get("session")).isNull(); } @Test - public void getKeyValue() throws Exception { + public void getKeyValue() { Pair pair = HttpRequestUtils.getKeyValue("userId=javajigi", "="); - assertThat(pair, is(new Pair("userId", "javajigi"))); + assertThat(pair).isEqualTo(new Pair("userId", "javajigi")); } @Test - public void getKeyValue_invalid() throws Exception { + public void getKeyValue_invalid() { Pair pair = HttpRequestUtils.getKeyValue("userId", "="); - assertThat(pair, is(nullValue())); + assertThat(pair).isNull(); } @Test - public void parseHeader() throws Exception { + public void parseHeader() { String header = "Content-Length: 59"; Pair pair = HttpRequestUtils.parseHeader(header); - assertThat(pair, is(new Pair("Content-Length", "59"))); + assertThat(pair).isEqualTo(new Pair("Content-Length", "59")); } } diff --git a/src/test/java/util/IOUtilsTest.java b/src/test/java/util/IOUtilsTest.java index 3c00cc4..eb8812b 100644 --- a/src/test/java/util/IOUtilsTest.java +++ b/src/test/java/util/IOUtilsTest.java @@ -3,7 +3,7 @@ import java.io.BufferedReader; import java.io.StringReader; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/test/java/webserver/HttpRequestTest.java b/src/test/java/webserver/HttpRequestTest.java new file mode 100644 index 0000000..8ff7196 --- /dev/null +++ b/src/test/java/webserver/HttpRequestTest.java @@ -0,0 +1,36 @@ +package webserver; + +import org.junit.jupiter.api.Test; + +import java.io.FileInputStream; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.assertThat; + +class HttpRequestTest { + + private String testDirectory = "./src/test/resources/"; + + @Test + public void request_GET() throws Exception { + InputStream in = new FileInputStream(testDirectory + "Http_GET.txt"); + HttpRequest request = new HttpRequest(in); + + assertThat("GET").isEqualTo(request.getMethod().name()); + assertThat("/user/create").isEqualTo(request.getPath()); + assertThat("keep-alive").isEqualTo(request.getHeader("Connection")); + assertThat("javajigi").isEqualTo(request.getParameter("userId")); + } + + @Test + public void request_POST() throws Exception { + InputStream in = new FileInputStream(testDirectory + "Http_POST.txt"); + HttpRequest request = new HttpRequest(in); + + assertThat("POST").isEqualTo(request.getMethod().name()); + assertThat("/user/create").isEqualTo(request.getPath()); + assertThat("keep-alive").isEqualTo(request.getHeader("Connection")); + assertThat("javajigi").isEqualTo(request.getParameter("userId")); + } + +} diff --git a/src/test/java/webserver/HttpResponseTest.java b/src/test/java/webserver/HttpResponseTest.java new file mode 100644 index 0000000..91514a5 --- /dev/null +++ b/src/test/java/webserver/HttpResponseTest.java @@ -0,0 +1,37 @@ +package webserver; + +import org.junit.jupiter.api.Test; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.OutputStream; + +public class HttpResponseTest { + private String testDirectory = "./src/test/resources/"; + + @Test + public void responseForward() throws Exception { + // Http_Forward.txt 결과는 응답 body에 index.html이 포함되어 있어야 한다. + HttpResponse response = new HttpResponse(createOutputStream("Http_Forward.txt")); + response.forward("/index.html"); + } + + @Test + public void responseRedirect() throws Exception { + // Http_Redirect.txt 결과는 응답 header에 Location 정보가 /index.html로 포함되어 있어야 한다. + HttpResponse response = new HttpResponse(createOutputStream("Http_Redirect.txt")); + response.sendRedirect("/index.html"); + } + + @Test + public void responseCookies() throws Exception { + // Http_Cookie.txt 결과는 응답 header에 Set-Cookie 값으로 logined=true 값이 포함되어 있어야 한다. + HttpResponse response = new HttpResponse(createOutputStream("Http_Cookie.txt")); + response.addHeader("Set-Cookie", "logined=true"); + response.sendRedirect("/index.html"); + } + + private OutputStream createOutputStream(String filename) throws FileNotFoundException { + return new FileOutputStream(testDirectory + filename); + } +} diff --git a/src/test/resources/Http_Cookie.txt b/src/test/resources/Http_Cookie.txt new file mode 100644 index 0000000..c0a4480 --- /dev/null +++ b/src/test/resources/Http_Cookie.txt @@ -0,0 +1,3 @@ +HTTP/1.1 302 Found +Set-Cookie: logined=true +Location: /index.html diff --git a/src/test/resources/Http_Forward.txt b/src/test/resources/Http_Forward.txt new file mode 100644 index 0000000..d2a8dcd --- /dev/null +++ b/src/test/resources/Http_Forward.txt @@ -0,0 +1,152 @@ +HTTP/1.1 200 OK +Content-Type: text/html;charset=utf-8 +Content-Length: 7049 + + + + + + + SLiPP Java Web Programming + + + + + + + + + + +
+
+
+ +
+
+
+ +
+ +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/src/test/resources/Http_GET.txt b/src/test/resources/Http_GET.txt new file mode 100644 index 0000000..bd2324b --- /dev/null +++ b/src/test/resources/Http_GET.txt @@ -0,0 +1,4 @@ +GET /user/create?userId=javajigi&password=password&name=JaeSung HTTP/1.1 +Host: localhost:8080 +Connection: keep-alive +Accept: */* diff --git a/src/test/resources/Http_POST.txt b/src/test/resources/Http_POST.txt new file mode 100644 index 0000000..2b62495 --- /dev/null +++ b/src/test/resources/Http_POST.txt @@ -0,0 +1,8 @@ +POST /user/create HTTP/1.1 +Host: localhost:8080 +Connection: keep-alive +Content-Length: 46 +Content-Type: application/x-www-form-urlencoded +Accept: */* + +userId=javajigi&password=password&name=JaeSung diff --git a/src/test/resources/Http_Redirect.txt b/src/test/resources/Http_Redirect.txt new file mode 100644 index 0000000..7f8efa9 --- /dev/null +++ b/src/test/resources/Http_Redirect.txt @@ -0,0 +1,2 @@ +HTTP/1.1 302 Found +Location: /index.html diff --git a/webapp/index.html b/webapp/index.html index 1675898..92f6b0b 100644 --- a/webapp/index.html +++ b/webapp/index.html @@ -40,7 +40,7 @@
  • Facebook
  • -
  • +
  • @@ -145,4 +145,4 @@ - \ No newline at end of file +