package org.deftserver.util; import java.nio.ByteBuffer; import java.util.Collection; import java.util.HashMap; import java.util.Map; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; /** * This class can be used to create HttpRequests (and corresponding byte representations) */ public class HttpRequestHelper { //Default request will look like this: /* GET / HTTP/1.0 Host: localhost:8080 User-Agent: Mozilla/5.0 From: abcde@qwert.com */ enum ParameterDelimMode { AMPERSAND, SEMICOLON, MIXED } private ParameterDelimMode paramDelimMode = ParameterDelimMode.MIXED; private String protocol = "HTTP"; private String method = "GET"; private String version = "1.1"; private String requestedPath = "/"; private Map<String, String> headers = new HashMap<String, String>(); private Multimap<String, String> getParameters = HashMultimap.create(); public HttpRequestHelper() { headers.put("Host", "localhost:8080"); headers.put("User-Agent", "Mozilla/5.0"); headers.put("From", "abcde@qwert.com"); } public String getRequestAsString() { String requestLine = createRequestLine(); String headerString = createHeaders(); //TODO Body String request = requestLine + headerString; return request; } public byte[] getRequestAsBytes() { String request = getRequestAsString(); return request.getBytes(); } public ByteBuffer getRequestAsByteBuffer() { return ByteBuffer.wrap(getRequestAsBytes()); } public String addHeader(String name, String value) { return headers.put(name, value); } public String removeHeader(String name) { return headers.remove(name); } public boolean addGetParameter(String name, String value) { return getParameters.put(name, value); } public void setRequestedPath(String path) { requestedPath = path; } public void setVersion(String version) { this.version = version; } public void setParameterDelimMode(ParameterDelimMode mode) { paramDelimMode = mode; } private String getParameterDelimiter() { String delim; switch (paramDelimMode) { case AMPERSAND : delim = "&"; break; case SEMICOLON : delim = ";"; break; case MIXED: if (Math.random() > 0.5) { delim ="&"; } else { delim = ";"; } break; default : delim = ";"; } return delim; } /** * Creates the initial request line, i.e: * GET / HTTP/1.0 * * It also add \r\n to the end of the line */ private String createRequestLine() { String requestedPathWithParams = requestedPath; if (!getParameters.isEmpty()) { //Add get parameters requestedPathWithParams += "?"; for (String paramName : getParameters.keySet()) { String delimiter = getParameterDelimiter(); Collection<String> values = getParameters.get(paramName); for (String value : values) { //A single param can have multiple values String val = value == null? "" : value; requestedPathWithParams += paramName + "=" + val + delimiter; } } //Remove last & requestedPathWithParams = requestedPathWithParams.substring(0, requestedPathWithParams.length()-1); } String reqLine = method + " " + requestedPathWithParams + " " + protocol + "/" + version + "\r\n"; return reqLine; } /** * Creates the header lines, i.e: * Host: localhost:8080 * User-Agent: Mozilla/5.0 * From: abcde@qwert.com * * It also add \r\n to the end of the line */ private String createHeaders() { String result = ""; for(String headerKey : headers.keySet()) { String headerValue = headers.get(headerKey); result += headerKey + ": " + headerValue + "\r\n"; } result += "\r\n"; return result; } }