간략하게는 클래스는 하나의 책임을 져야 한다 라는 뜻이다. 위키 백과의 말을 따르면, 객체 지향 프로그래밍에서 단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다.
private InputStream inputStream;
private String url;
private RequestMethod method;
private Header header = new Header();
private Cookie cookie;
private Map<String, String> parameters;
private Map<String, String> requestBody;
public void run() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line = br.readLine();
if (line == null) {
return;
}
final String[] fistLine = line.split(" ");
this.method = RequestMethod.valueOf(fistLine[0]);
this.url = fistLine[1];
header.saveHeaders(br, line);
int queryStringStartIndex = url.indexOf("?");
if(queryStringStartIndex != -1) {
parameters = HttpRequestUtils.parseQueryString(url.substring(queryStringStartIndex + 1, url.length()));
url = url.substring(0, queryStringStartIndex);
}
if(!method.equals(RequestMethod.GET)) {
requestBody = HttpRequestUtils.parseQueryString(IOUtils.readData(br, Integer.parseInt(header.getAttribute("Content-Length"))));
}
if (header.isExistAttribute(COOKIE)) {
cookie.saveCookie(header.getAttribute(COOKIE));
}
}
package core;
import java.util.Map;
public class HttpRequestBuilder {
private String url;
private RequestMethod method;
private Header header = new Header();
private Cookie cookie;
private Map<String, String> parameters;
private Map<String, String> requestBody;
public HttpRequestBuilder setUrl(String url) {
this.url = url;
return this;
}
public HttpRequestBuilder setMethod(RequestMethod method) {
this.method = method;
return this;
}
public HttpRequestBuilder setHeader(Header header) {
this.header = header;
return this;
}
public HttpRequestBuilder addHeader(String key, String value) {
header.addHeader(key, value);
return this;
}
public HttpRequestBuilder setCookie(Cookie cookie) {
this.cookie = cookie;
return this;
}
public HttpRequestBuilder addCookie(String key, String value) {
cookie.addCookie(key, value);
return this;
}
public HttpRequestBuilder setParameters(Map<String, String> parameters) {
this.parameters = parameters;
return this;
}
public HttpRequestBuilder setRequestBody(Map<String,String> requestBody) {
this.requestBody = requestBody;
return this;
}
public HttpRequest build() {
return new HttpRequest(url, method, header, cookie, parameters, requestBody);
}
}
public class HttpRequestParser {
private final InputStream inputStream;
private String url;
private Header header = new Header();
private RequestMethod method;
private Cookie cookie;
private Map<String, String> parameters;
private Map<String, String> requestBody;
public HttpRequestParser(InputStream inputStream) {
this.inputStream = inputStream;
}
public HttpRequest parser() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
HttpRequestBuilder httpRequestBuilder = new HttpRequestBuilder();
String line = br.readLine();
final String[] fistLine = line.split(" ");
url = fistLine[1];
method = RequestMethod.valueOf(fistLine[0]);
header.saveHeaders(br, line);
int queryStringStartIndex = url.indexOf("?");
if(queryStringStartIndex != -1) {
parameters = HttpRequestUtils.parseQueryString(url.substring(queryStringStartIndex + 1, url.length()));
url = url.substring(0, queryStringStartIndex);
}
if(!method.equals(RequestMethod.GET)) {
requestBody = HttpRequestUtils.parseQueryString(IOUtils.readData(br, Integer.parseInt(header.getAttribute("Content-Length"))));
}
if (header.isExistAttribute(COOKIE)) {
cookie.saveCookie(header.getAttribute(COOKIE));
}
return httpRequestBuilder
.setUrl(url)
.setMethod(method)
.setHeader(header)
.setCookie(cookie)
.setParameters(parameters)
.setRequestBody(requestBody)
.build();
}
}
package core.request;
import core.Cookie;
import core.Header;
import core.RequestMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
/**
* HttpRequest 은 요청이 들어올 시 HttpRequest 정보를 저장하는 클래스 입니다.
* url, RequestMethod Header Cookie 등등.. 여러가지 정보등을 보관합니다.
* 현재는 HttpRequest 에서 InputStream 등의 작업을 수행하지만 Refactoring 후 다른곳에서 주입시켜줄 예정입니다.
*/
public class HttpRequest {
private static final Logger log = LoggerFactory.getLogger(HttpRequest.class);
private final String url;
private final RequestMethod method;
private final Header header;
private final Cookie cookie;
private Map<String, String> parameters;
private Map<String, String> requestBody;
public HttpRequest(String url, RequestMethod method, Header header, Cookie cookie, Map<String, String> parameters, Map<String, String> requestBody) {
this.url = url;
this.method = method;
this.header = header;
this.cookie = cookie;
this.parameters = parameters;
this.requestBody = requestBody;
}
public static Logger getLog() {
return log;
}
public String getUrl() {
return url;
}
public RequestMethod getMethod() {
return method;
}
public Map<String, String> getParameters() {
return parameters;
}
public Map<String, String> getRequestBody() {
return requestBody;
}
@Override
public String toString() {
return "HttpRequest{" +
", url='" + url + '\'' +
", method='" + method + '\'' +
", parameters=" + parameters +
", requestBody=" + requestBody +
'}';
}
}