From 1295814dba27659fe01399c508e3bd0609db4992 Mon Sep 17 00:00:00 2001 From: haerong22 Date: Thu, 1 Sep 2022 03:36:35 +0900 Subject: [PATCH] #19 was : HttpRequest, HttpResponse --- .../example/CustomWebApplicationServer.java | 31 +++++++++++++++- .../main/java/org/example/HttpRequest.java | 25 +++++++++++++ .../main/java/org/example/HttpResponse.java | 37 +++++++++++++++++++ my-framework/was-practice/test.http | 2 +- 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 my-framework/was-practice/src/main/java/org/example/HttpRequest.java create mode 100644 my-framework/was-practice/src/main/java/org/example/HttpResponse.java diff --git a/my-framework/was-practice/src/main/java/org/example/CustomWebApplicationServer.java b/my-framework/was-practice/src/main/java/org/example/CustomWebApplicationServer.java index e8c5820a..8133039c 100644 --- a/my-framework/was-practice/src/main/java/org/example/CustomWebApplicationServer.java +++ b/my-framework/was-practice/src/main/java/org/example/CustomWebApplicationServer.java @@ -1,11 +1,14 @@ package org.example; +import org.example.calculator.domain.Calculator; +import org.example.calculator.domain.PositiveNumber; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; +import java.io.*; import java.net.ServerSocket; import java.net.Socket; +import java.nio.charset.StandardCharsets; public class CustomWebApplicationServer { @@ -26,6 +29,32 @@ public class CustomWebApplicationServer { while ((clientSocket = serverSocket.accept()) != null) { logger.info("[CustomWebApplicationServer] client connected!"); + + /** + * Step1 - 사용자 요청을 메인 Thread 가 처리하도록 한다. + */ + + try (InputStream in = clientSocket.getInputStream(); OutputStream out = clientSocket.getOutputStream()) { + BufferedReader br = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8)); + DataOutputStream dos = new DataOutputStream(out); + + HttpRequest httpRequest = new HttpRequest(br); + + if (httpRequest.isGetRequest() && httpRequest.matchPath("/calculate")) { + QueryStrings queryStrings = httpRequest.getQueryStrings(); + + int operand1 = Integer.parseInt(queryStrings.getValue("operand1")); + String operator = queryStrings.getValue("operator"); + int operand2 = Integer.parseInt(queryStrings.getValue("operand2")); + + int result = Calculator.calculate(new PositiveNumber(operand1), operator, new PositiveNumber(operand2)); + byte[] body = String.valueOf(result).getBytes(); + + HttpResponse response = new HttpResponse(dos); + response.response200Header("application/json", body.length); + response.responseBody(body); + } + } } } } diff --git a/my-framework/was-practice/src/main/java/org/example/HttpRequest.java b/my-framework/was-practice/src/main/java/org/example/HttpRequest.java new file mode 100644 index 00000000..200a2e01 --- /dev/null +++ b/my-framework/was-practice/src/main/java/org/example/HttpRequest.java @@ -0,0 +1,25 @@ +package org.example; + +import java.io.BufferedReader; +import java.io.IOException; + +public class HttpRequest { + + private final RequestLine requestLine; + + public HttpRequest(BufferedReader br) throws IOException { + this.requestLine = new RequestLine(br.readLine()); + } + + public QueryStrings getQueryStrings() { + return requestLine.getQueryStrings(); + } + + public boolean isGetRequest() { + return requestLine.isGetRequest(); + } + + public boolean matchPath(String requestPath) { + return requestLine.matchPath(requestPath); + } +} diff --git a/my-framework/was-practice/src/main/java/org/example/HttpResponse.java b/my-framework/was-practice/src/main/java/org/example/HttpResponse.java new file mode 100644 index 00000000..7341bb69 --- /dev/null +++ b/my-framework/was-practice/src/main/java/org/example/HttpResponse.java @@ -0,0 +1,37 @@ +package org.example; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.DataOutputStream; +import java.io.IOException; + +public class HttpResponse { + private static final Logger logger = LoggerFactory.getLogger(HttpResponse.class); + + private final DataOutputStream dos; + + public HttpResponse(DataOutputStream dos) { + this.dos = dos; + } + + public void response200Header(String contentType, int lengthOfBodyContent) { + try { + dos.writeBytes("HTTP/1.1 200 OK \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) { + logger.error(e.getMessage()); + } + } + + public void responseBody(byte[] body) { + try { + dos.write(body, 0, body.length); + dos.flush(); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } +} \ No newline at end of file diff --git a/my-framework/was-practice/test.http b/my-framework/was-practice/test.http index df96b3b5..bdf7c7d2 100644 --- a/my-framework/was-practice/test.http +++ b/my-framework/was-practice/test.http @@ -1 +1 @@ -GET http://localhost:8080 \ No newline at end of file +GET http://localhost:8080/calculate?operand1=10&operator=-&operand2=20 \ No newline at end of file