클라이언트의 요청 데이터를 처리하는 로직을 별도의 클래스로 분리
- 클라이언트의 요청 데이터를 담고 있는 InputStream을 생성자로 받아 HTTP 메서드, URL, 헤더, 본문을 분리
- Http Header는 Map<String, String>에 저장해 관리하고, getHeader( String key ) 메서드를 통해 접근 가능
- GET과 POST 메서드에 따라 전달되는 인자를 Map<String, String>에 저장해 관리하고, getParameter( String key ) 메서드를 통해 접근 가능하도록 구현
public class HttpRequest {
private static final Logger log = LoggerFactory.getLogger(HttpRequest.class);
private Map<String, String> httpHeader = new HashMap<>();
private Map<String, String> httpParameter = new HashMap<>();
private String method;
private String path;
public HttpRequest( InputStream in ) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String line = br.readLine();
String[] tokens = line.split(" ");
this.method = tokens[0];
while( (line = br.readLine()) != null ) {
if( line.equals("")) {
break;
}
String[] header = line.split(": ");
httpHeader.put(header[0], header[1]);
}
if( this.method.equals("GET")) {
String[] url = tokens[1].split("\\?");
this.path = url[0];
httpParameter = HttpRequestUtils.parseQueryString(url[1]);
} else if(this.method.equals("POST")) {
this.path = tokens[1];
String requestBody = IOUtils.readData(br, Integer.parseInt(httpHeader.get("Content-Length")));
httpParameter = HttpRequestUtils.parseQueryString(requestBody);
}
}
public String getMethod() {
return method;
}
public String getPath() {
return path;
}
public String getHeader(String key) {
return httpHeader.get(key);
}
public String getParameter(String key) {
return httpParameter.get(key);
}
테스트 코드
- GET/POST 요청 데이터를 담고 있는 텍스트 파일 생성
- JUnit test case 클래스 생성
Http.GET.txt
GET /user/create?userId=javajigi&password=password&name=JaeSung HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Accept: */*
Http.POST.txt
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
HttpRequestTest.java
package http;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.junit.Test;
public class HttpRequestTest {
private String testDirectory = "./src/test/java/";
@Test
public void Get_HttpRequest() throws Exception {
InputStream in = new FileInputStream(new File(testDirectory
+"Http_GET.txt"));
HttpRequest request = new HttpRequest(in);
assertEquals("GET", request.getMethod());
assertEquals("/user/create", request.getPath());
assertEquals("javajigi", request.getParameter("userId") );
assertEquals("localhost:8080", request.getHeader("Host"));
assertEquals("keep-alive", request.getHeader("Connection"));
}
@Test
public void Post_HttpRequest() throws Exception {
InputStream in = new FileInputStream(new File(testDirectory
+"Http_POST.txt"));
HttpRequest request = new HttpRequest(in);
assertEquals("POST", request.getMethod());
assertEquals("/user/create", request.getPath());
assertEquals("javajigi", request.getParameter("userId") );
assertEquals("localhost:8080", request.getHeader("Host"));
assertEquals("keep-alive", request.getHeader("Connection"));
}
}
'Java' 카테고리의 다른 글
[Java] 다형성을 활용해 클라이언트 요청 URL에 대한 분기 처리를 제거 (0) | 2023.03.20 |
---|---|
[Java] 응답 데이터를 처리하는 로직을 HttpResponse 클래스로 분리 및 리팩토링 (0) | 2023.03.19 |
[Java] HTTP 웹 서버 구현 / CSS 지원하기 (0) | 2023.03.17 |
[Java] HTTP 웹 서버 구현 / 로그인 구현 (0) | 2023.03.17 |
[Java] HTTP 웹 서버 구현 / 302 status code 적용 (0) | 2023.03.17 |
댓글