1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 package org.apache.commons.httpclient.server;
32
33 import java.io.ByteArrayOutputStream;
34 import java.io.IOException;
35 import java.io.InputStream;
36 import java.util.Iterator;
37
38 import org.apache.commons.httpclient.ChunkedInputStream;
39 import org.apache.commons.httpclient.ContentLengthInputStream;
40 import org.apache.commons.httpclient.Header;
41 import org.apache.commons.httpclient.HeaderElement;
42 import org.apache.commons.httpclient.HeaderGroup;
43 import org.apache.commons.httpclient.NameValuePair;
44
45 /***
46 * A generic HTTP request.
47 *
48 * @author Oleg Kalnichevski
49 */
50 public class SimpleRequest {
51
52 public static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1";
53
54 private RequestLine requestLine = null;
55 private HeaderGroup headers = new HeaderGroup();
56 private InputStream entity = null;
57
58 public SimpleRequest() {
59 super();
60 }
61
62 public SimpleRequest(
63 final RequestLine requestLine,
64 final Header[] headers,
65 final InputStream content) throws IOException
66 {
67 super();
68 if (requestLine == null) {
69 throw new IllegalArgumentException("Request line may not be null");
70 }
71 this.requestLine = requestLine;
72 if (headers != null) {
73 this.headers.setHeaders(headers);
74 }
75 if (content != null) {
76
77 String methodname = requestLine.getMethod();
78 if ("POST".equalsIgnoreCase(methodname) || "PUT".equalsIgnoreCase(methodname)) {
79 Header contentLength = this.headers.getFirstHeader("Content-Length");
80 Header transferEncoding = this.headers.getFirstHeader("Transfer-Encoding");
81 InputStream in = content;
82 if (transferEncoding != null) {
83 if (transferEncoding.getValue().indexOf("chunked") != -1) {
84 in = new ChunkedInputStream(in);
85 }
86 } else if (contentLength != null) {
87 long len = getContentLength();
88 if (len >= 0) {
89 in = new ContentLengthInputStream(in, len);
90 }
91 }
92 this.entity = in;
93 }
94 }
95 }
96
97 public SimpleRequest(final RequestLine requestLine, final Header[] headers)
98 throws IOException {
99 this(requestLine, headers, null);
100 }
101
102 public RequestLine getRequestLine() {
103 return this.requestLine;
104 }
105
106 public void setRequestLine(final RequestLine requestline) {
107 if (requestline == null) {
108 throw new IllegalArgumentException("Request line may not be null");
109 }
110 this.requestLine = requestline;
111 }
112
113 public boolean containsHeader(final String name) {
114 return this.headers.containsHeader(name);
115 }
116
117 public Header[] getHeaders() {
118 return this.headers.getAllHeaders();
119 }
120
121 public Header getFirstHeader(final String s) {
122 return this.headers.getFirstHeader(s);
123 }
124
125 public void removeHeaders(final String s) {
126 if (s == null) {
127 return;
128 }
129 Header[] headers = this.headers.getHeaders(s);
130 for (int i = 0; i < headers.length; i++) {
131 this.headers.removeHeader(headers[i]);
132 }
133 }
134
135 public void addHeader(final Header header) {
136 if (header == null) {
137 return;
138 }
139 this.headers.addHeader(header);
140 }
141
142 public void setHeader(final Header header) {
143 if (header == null) {
144 return;
145 }
146 removeHeaders(header.getName());
147 addHeader(header);
148 }
149
150 public Iterator getHeaderIterator() {
151 return this.headers.getIterator();
152 }
153
154 public String getContentType() {
155 Header contenttype = this.headers.getFirstHeader("Content-Type");
156 if (contenttype != null) {
157 return contenttype.getValue();
158 } else {
159 return "text/plain";
160 }
161 }
162
163 public String getCharset() {
164 String charset = null;
165 Header contenttype = this.headers.getFirstHeader("Content-Type");
166 if (contenttype != null) {
167 HeaderElement values[] = contenttype.getElements();
168 if (values.length == 1) {
169 NameValuePair param = values[0].getParameterByName("charset");
170 if (param != null) {
171 charset = param.getValue();
172 }
173 }
174 }
175 if (charset != null) {
176 return charset;
177 } else {
178 return DEFAULT_CONTENT_CHARSET;
179 }
180 }
181
182 public long getContentLength() {
183 Header contentLength = this.headers.getFirstHeader("Content-Length");
184 if (contentLength != null) {
185 try {
186 return Long.parseLong(contentLength.getValue());
187 } catch (NumberFormatException e) {
188 return -1;
189 }
190 } else {
191 return -1;
192 }
193 }
194
195 public InputStream getBody() {
196 return this.entity;
197 }
198
199 public byte[] getBodyBytes() throws IOException {
200 InputStream in = getBody();
201 if (in != null) {
202 byte[] tmp = new byte[4096];
203 int bytesRead = 0;
204 ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024);
205 while ((bytesRead = in.read(tmp)) != -1) {
206 buffer.write(tmp, 0, bytesRead);
207 }
208 return buffer.toByteArray();
209 } else {
210 return null;
211 }
212 }
213
214 public String getBodyString() throws IOException {
215 byte[] raw = getBodyBytes();
216 if (raw != null) {
217 return new String(raw, getCharset());
218 } else {
219 return null;
220 }
221 }
222 }