001 package org.shiftone.jrat.http; 002 003 import org.shiftone.jrat.util.log.Logger; 004 005 import java.io.BufferedReader; 006 import java.io.InputStream; 007 import java.io.InputStreamReader; 008 import java.util.HashMap; 009 import java.util.Map; 010 011 /** 012 * This object us mutable. 013 * I want to be able to modify a request and then redispatch it. I could have done that by 014 * wrapping the request in another implementation of a request, but that's a bit too complex for 015 * such a simple http server. The handler owns the request. If it wants to change the data and 016 * redispatch it, then it can, without any need to wrap it. 017 * 018 * @author jeff@shiftone.org (Jeff Drost) 019 */ 020 public class Request { 021 022 private static final Logger LOG = Logger.getLogger(Request.class); 023 024 private String method; 025 private String requestUri; 026 private String httpVersion; 027 private String queryString; 028 029 private Map headers = new HashMap(); 030 031 public Request(InputStream inputStream) throws Exception { 032 033 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 034 String line = reader.readLine(); 035 036 parseRequestLine(line); 037 038 // this code is not expecially robust 039 while (((line = reader.readLine()) != null) && (line.length() > 0)) { 040 parseHeaderField(line); 041 } 042 043 } 044 045 046 private void parseRequestLine(String line) { 047 048 LOG.info(line); 049 int a = line.indexOf(' '); 050 int b = line.lastIndexOf(' '); 051 052 method = line.substring(0, a); 053 httpVersion = line.substring(b + 1); 054 requestUri = line.substring(a + 1, b); 055 056 // query string 057 int q = requestUri.indexOf('?'); 058 if (q != -1) { 059 queryString = requestUri.substring(q + 1); // get just the query string 060 requestUri = requestUri.substring(0, q); // remove the query string and ? 061 } 062 063 } 064 065 private void parseHeaderField(String line) { 066 int a = line.indexOf(':'); 067 String key = line.substring(0, a); 068 String value = line.substring(a + 2); // remove ": " 069 headers.put(key, value); 070 } 071 072 073 public String getMethod() { 074 return method; 075 } 076 077 078 public void setRequestUri(String requestUri) { 079 this.requestUri = requestUri; 080 } 081 082 public String getRequestUri() { 083 return requestUri; 084 } 085 086 public String getHttpVersion() { 087 return httpVersion; 088 } 089 090 public String getQueryString() { 091 return queryString; 092 } 093 094 public Map getHeaders() { 095 return headers; 096 } 097 }