public RequestStore parseInitialRequestLine(String line) throws UnsupportedEncodingException {
   String[] parts = line.split(" ");
   requestStore.setMethod(parts[0]);
   requestStore.setRequestUri(parts[1]);
   requestStore.setProtocolVersion(parts[2]);
   return requestStore;
 }
 @Test
 public void itShouldBeAbleToSetTheMimeType() throws IOException {
   StringReader request =
       new StringReader("GET /image.gif HTTP/1.1\nHost: www.Superawesome.com\nContent-Length: 45");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   requestParser.processRequest(in);
   assertEquals("image/gif", requestStore.getMimeType());
 }
 @Test
 public void itShouldBeAbleToSetTheContentLength() throws IOException {
   StringReader request =
       new StringReader("GET / HTTP/1.1\nHost: www.Superawesome.com\nContent-Length: 45");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   requestParser.readHeaders(in);
   Integer length = 45;
   assertEquals(length, requestStore.getRequestContentLength());
 }
 @Test
 public void itShouldBeAbleToGetTheBodyFromTheRequestIfThereIsOne() throws IOException {
   StringReader request = new StringReader("my = data value1 = hello\n");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   Integer length = 24;
   requestStore.setRequestContentLength(length);
   String body = "my = data value1 = hello";
   assertEquals(body, requestParser.readRequestBody(in, length));
 }
 @Test
 public void itShouldParseTheHeadersIntoKeyValuePairs() throws IOException {
   StringReader request =
       new StringReader("GET / HTTP/1.1\nHost: www.Superawesome.com\nContent-Length: 45");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   ArrayList<String> requestHeaders = requestParser.readHeaders(in);
   requestParser.parseInitialRequestLine(requestHeaders.remove(0));
   requestParser.parseHeadersIntoKeyValuePairs(requestHeaders);
   assertEquals("www.Superawesome.com", requestStore.getHeaders("Host"));
 }
 @Test
 public void itShouldBeAbleToSplitTheParamsAtTheAmpersand() {
   StringReader request = new StringReader("GET / HTTP/1.1\nHost: www.Superawesome.com\n");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   String queryStringParams = "my=data&cool=sweet";
   requestParser.splitRouteAtAmpersand(queryStringParams);
   HashMap expected = new HashMap();
   expected.put("cool", "sweet");
   expected.put("my", "data");
   assertEquals(expected, requestStore.getParams());
 }
 @Test
 public void itShouldBeAbleToParseTheInitialRequestLine() throws IOException {
   StringReader request = new StringReader("GET / HTTP/1.1\nHost: www.Superawesome.com");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   ArrayList<String> headers = requestParser.readHeaders(in);
   String initialRequestLine = headers.remove(0);
   requestParser.parseInitialRequestLine(initialRequestLine);
   assertEquals("HTTP/1.1", requestStore.getProtocolVersion());
   assertEquals("GET", requestStore.getMethod());
   assertEquals("/", requestStore.getRequestUri());
 }
 @Test
 public void itShouldBeAbleToSetTheStartAndEndOfARange() throws IOException {
   StringReader request =
       new StringReader("GET / HTTP/1.1\nHost: www.Superawesome.com\nRange: bytes=0-10");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   requestParser.readHeaders(in);
   Integer startLength = 0;
   Integer endLength = 10;
   assertEquals(startLength, requestStore.getStartRange());
   assertEquals(endLength, requestStore.getEndRange());
 }
 @Test
 public void itShouldBeAbleToParseTheHeadersIntoKeyValuePairs() throws IOException {
   StringReader request = new StringReader("GET / HTTP/1.1\nHost: www.Superawesome.com");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   ArrayList<String> headers = requestParser.readHeaders(in);
   headers.remove(0);
   requestParser.parseHeadersIntoKeyValuePairs(headers);
   HashMap testHeaders = new HashMap();
   testHeaders.put("Host", "www.Superawesome.com");
   assertEquals(testHeaders, requestStore.getAllHeaders());
 }
 public boolean checkForQueryStringParams() {
   String route = requestStore.getRequestUri();
   if (route.contains("?")) {
     return true;
   } else {
     return false;
   }
 }
 public RequestStore processRequest(BufferedReader in) throws IOException {
   ArrayList<String> requestHeaders = readHeaders(in);
   parseInitialRequestLine(requestHeaders.remove(0));
   if (checkForQueryStringParams()) {
     processQueryStringParams();
     seturiWithDetachedParams();
   }
   parseHeadersIntoKeyValuePairs(requestHeaders);
   setMimeType(requestStore.getRequestUri());
   if (requestStore.getRequestContentLength() != null) {
     String bodyContent =
         checkForBlankLines(in)
             + readRequestBody(in, (requestStore.getRequestContentLength() - 1));
     requestStore.setRequestBody(bodyContent);
   }
   return requestStore;
 }
 public void splitRouteAtAmpersand(String params) {
   HashMap<String, String> splitParams = new HashMap<String, String>();
   String queryStringParams[] = params.split("&");
   int i;
   for (i = 0; i < queryStringParams.length; i++) {
     String pairs[] = queryStringParams[i].split("=");
     splitParams.put(pairs[0], pairs[1]);
   }
   requestStore.setParams(splitParams);
 }
 public void processQueryStringParams() throws UnsupportedEncodingException {
   String params = splitOffQueryStringParams();
   if (params.contains("&")) {
     splitRouteAtAmpersand(params);
   } else {
     HashMap<String, String> splitParams = new HashMap<String, String>();
     String pairs[] = params.split("=");
     splitParams.put(decodeRequestUri(pairs[0]), decodeRequestUri(pairs[1]));
     requestStore.setParams(splitParams);
   }
 }
 @Test
 public void itShouldBeAbleToParseARequest() throws IOException {
   StringReader request =
       new StringReader(
           "POST /form HTTP/1.1\nHost: www.Superawesome.com\nContent-Length: 24\n\r\nmy = data value1 = hello\n");
   BufferedReader in = new BufferedReader(request);
   RequestStore requestStore = new RequestStore();
   RequestParser requestParser = new RequestParser(in, requestStore);
   Integer length = 24;
   requestParser.processRequest(in);
   assertEquals("POST", requestStore.getMethod());
   assertEquals("/form", requestStore.getRequestUri());
   assertEquals("HTTP/1.1", requestStore.getProtocolVersion());
   assertEquals(length, requestStore.getRequestContentLength());
   assertEquals("my = data value1 = hello", requestStore.getRequestBody());
 }
 public void setRequestContentLength(String line) {
   String[] parts = line.split(": ");
   Integer length = Integer.parseInt(parts[1]);
   requestStore.setRequestContentLength(length);
 }
 public String splitOffQueryStringParams() {
   String path = requestStore.getRequestUri();
   String[] parts = path.split("\\?");
   return (parts[1]);
 }
 public void parseHeadersIntoKeyValuePairs(ArrayList<String> headers) {
   for (String line : headers) {
     String[] parts = line.split(":");
     requestStore.setHeader(parts[0], parts[1].trim());
   }
 }
 public void setMimeType(String uri) {
   MimeTypeExtractor typeExtractor = new MimeTypeExtractor();
   String mimeType = typeExtractor.extractType(uri);
   requestStore.setMimeType(mimeType);
 }
 public void seturiWithDetachedParams() {
   String pairs[] = requestStore.getRequestUri().split("\\?");
   requestStore.setRequestUri(pairs[0]);
 }
 public void setRequestRanges(String line) {
   String[] parts = line.split("=");
   String[] rangeNumbers = parts[1].split("-");
   requestStore.setStartRange(Integer.parseInt(rangeNumbers[0]));
   requestStore.setEndRange(Integer.parseInt(rangeNumbers[1]));
 }