package was.httpserver; import util.MyLogger; import java.io.BufferedReader; import java.io.IOException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import static java.nio.charset.StandardCharsets.UTF_8; import static util.MyLogger.log; public class HttpRequest { private String method; private String path; private Map queryParameters = new HashMap<>(); private Map headers = new HashMap<>(); public HttpRequest(BufferedReader reader) throws IOException{ parseRequestLine(reader); parseHeaders(reader); parseBody(reader); } private void parseBody(BufferedReader reader) throws IOException { if(!headers.containsKey("Content-Length")) return; int contentLength = Integer.parseInt(headers.get("Content-Length")); char[] bodyChars = new char[contentLength]; int read = reader.read(bodyChars); if(read != contentLength) { throw new IOException("Fail to read entrie body. Expected " + contentLength + " bytes, but read " + read); } String body = new String(bodyChars); log("HTTP Message Body: " + body); String contentType = headers.get("Content-Type"); if("application/x-www-form-urlencoded".equals(contentType)){ parseQueryParameters(body); } } private void parseRequestLine(BufferedReader reader) throws IOException { String requestLine = reader.readLine(); if (requestLine == null){ throw new IOException("EOF : No reuest line received"); } String[] parts = requestLine.split(" "); if(parts.length != 3){ throw new IOException("Invalid request line " + requestLine); } method = parts[0]; String[] pathParts = parts[1].split("\\?"); path = pathParts[0]; if(pathParts.length >1){ parseQueryParameters(pathParts[1]); } } private void parseQueryParameters(String queryString) { for (String param : queryString.split("&")) { String[] keyValue = param.split("="); String key = URLDecoder.decode(keyValue[0], UTF_8); String value = keyValue.length > 1 ? URLDecoder.decode(keyValue[1], UTF_8) : ""; queryParameters.put(key,value); } } private void parseHeaders(BufferedReader reader) throws IOException { String line; while(!(line = reader.readLine()).isEmpty()){ String[] headerParts = line.split(":"); headers.put(headerParts[0].trim(), headerParts[1].trim()); } } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public Map getQueryParameters() { return queryParameters; } public void setQueryParameters(Map queryParameters) { this.queryParameters = queryParameters; } public Map getHeaders() { return headers; } public void setHeaders(Map headers) { this.headers = headers; } public String getParameter(String name){ return queryParameters.get(name); } public String getHeader(String name){ return headers.get(name); } @Override public String toString() { return "HttpRequest{" + "method='" + method + '\'' + ", path='" + path + '\'' + ", queryParameters=" + queryParameters + ", headers=" + headers + '}'; } }