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 package org.apache.http.protocol;
29
30 import java.io.IOException;
31
32 import org.apache.http.ConnectionReuseStrategy;
33 import org.apache.http.HttpEntity;
34 import org.apache.http.HttpEntityEnclosingRequest;
35 import org.apache.http.HttpException;
36 import org.apache.http.HttpRequest;
37 import org.apache.http.HttpResponse;
38 import org.apache.http.HttpResponseFactory;
39 import org.apache.http.HttpServerConnection;
40 import org.apache.http.HttpStatus;
41 import org.apache.http.HttpVersion;
42 import org.apache.http.MethodNotSupportedException;
43 import org.apache.http.ProtocolException;
44 import org.apache.http.UnsupportedHttpVersionException;
45 import org.apache.http.annotation.Immutable;
46 import org.apache.http.entity.ByteArrayEntity;
47 import org.apache.http.params.HttpParams;
48 import org.apache.http.params.DefaultedHttpParams;
49 import org.apache.http.util.EncodingUtils;
50 import org.apache.http.util.EntityUtils;
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 @Immutable
72 public class HttpService {
73
74
75
76
77 private volatile HttpParams params = null;
78 private volatile HttpProcessor processor = null;
79 private volatile HttpRequestHandlerResolver handlerResolver = null;
80 private volatile ConnectionReuseStrategy connStrategy = null;
81 private volatile HttpResponseFactory responseFactory = null;
82 private volatile HttpExpectationVerifier expectationVerifier = null;
83
84
85
86
87
88
89
90
91
92
93
94
95
96 public HttpService(
97 final HttpProcessor processor,
98 final ConnectionReuseStrategy connStrategy,
99 final HttpResponseFactory responseFactory,
100 final HttpRequestHandlerResolver handlerResolver,
101 final HttpExpectationVerifier expectationVerifier,
102 final HttpParams params) {
103 super();
104 if (processor == null) {
105 throw new IllegalArgumentException("HTTP processor may not be null");
106 }
107 if (connStrategy == null) {
108 throw new IllegalArgumentException("Connection reuse strategy may not be null");
109 }
110 if (responseFactory == null) {
111 throw new IllegalArgumentException("Response factory may not be null");
112 }
113 if (params == null) {
114 throw new IllegalArgumentException("HTTP parameters may not be null");
115 }
116 this.processor = processor;
117 this.connStrategy = connStrategy;
118 this.responseFactory = responseFactory;
119 this.handlerResolver = handlerResolver;
120 this.expectationVerifier = expectationVerifier;
121 this.params = params;
122 }
123
124
125
126
127
128
129
130
131
132
133
134
135 public HttpService(
136 final HttpProcessor processor,
137 final ConnectionReuseStrategy connStrategy,
138 final HttpResponseFactory responseFactory,
139 final HttpRequestHandlerResolver handlerResolver,
140 final HttpParams params) {
141 this(processor, connStrategy, responseFactory, handlerResolver, null, params);
142 }
143
144
145
146
147
148
149
150
151
152
153
154 @Deprecated
155 public HttpService(
156 final HttpProcessor proc,
157 final ConnectionReuseStrategy connStrategy,
158 final HttpResponseFactory responseFactory) {
159 super();
160 setHttpProcessor(proc);
161 setConnReuseStrategy(connStrategy);
162 setResponseFactory(responseFactory);
163 }
164
165
166
167
168 @Deprecated
169 public void setHttpProcessor(final HttpProcessor processor) {
170 if (processor == null) {
171 throw new IllegalArgumentException("HTTP processor may not be null");
172 }
173 this.processor = processor;
174 }
175
176
177
178
179 @Deprecated
180 public void setConnReuseStrategy(final ConnectionReuseStrategy connStrategy) {
181 if (connStrategy == null) {
182 throw new IllegalArgumentException("Connection reuse strategy may not be null");
183 }
184 this.connStrategy = connStrategy;
185 }
186
187
188
189
190 @Deprecated
191 public void setResponseFactory(final HttpResponseFactory responseFactory) {
192 if (responseFactory == null) {
193 throw new IllegalArgumentException("Response factory may not be null");
194 }
195 this.responseFactory = responseFactory;
196 }
197
198
199
200
201 @Deprecated
202 public void setParams(final HttpParams params) {
203 this.params = params;
204 }
205
206
207
208
209 @Deprecated
210 public void setHandlerResolver(final HttpRequestHandlerResolver handlerResolver) {
211 this.handlerResolver = handlerResolver;
212 }
213
214
215
216
217 @Deprecated
218 public void setExpectationVerifier(final HttpExpectationVerifier expectationVerifier) {
219 this.expectationVerifier = expectationVerifier;
220 }
221
222 public HttpParams getParams() {
223 return this.params;
224 }
225
226
227
228
229
230
231
232
233
234
235
236 public void handleRequest(
237 final HttpServerConnection conn,
238 final HttpContext context) throws IOException, HttpException {
239
240 context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
241
242 HttpResponse response = null;
243
244 try {
245
246 HttpRequest request = conn.receiveRequestHeader();
247 request.setParams(
248 new DefaultedHttpParams(request.getParams(), this.params));
249
250 if (request instanceof HttpEntityEnclosingRequest) {
251
252 if (((HttpEntityEnclosingRequest) request).expectContinue()) {
253 response = this.responseFactory.newHttpResponse(HttpVersion.HTTP_1_1,
254 HttpStatus.SC_CONTINUE, context);
255 response.setParams(
256 new DefaultedHttpParams(response.getParams(), this.params));
257
258 if (this.expectationVerifier != null) {
259 try {
260 this.expectationVerifier.verify(request, response, context);
261 } catch (HttpException ex) {
262 response = this.responseFactory.newHttpResponse(HttpVersion.HTTP_1_0,
263 HttpStatus.SC_INTERNAL_SERVER_ERROR, context);
264 response.setParams(
265 new DefaultedHttpParams(response.getParams(), this.params));
266 handleException(ex, response);
267 }
268 }
269 if (response.getStatusLine().getStatusCode() < 200) {
270
271
272 conn.sendResponseHeader(response);
273 conn.flush();
274 response = null;
275 conn.receiveRequestEntity((HttpEntityEnclosingRequest) request);
276 }
277 } else {
278 conn.receiveRequestEntity((HttpEntityEnclosingRequest) request);
279 }
280 }
281
282 context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
283
284 if (response == null) {
285 response = this.responseFactory.newHttpResponse(HttpVersion.HTTP_1_1,
286 HttpStatus.SC_OK, context);
287 response.setParams(
288 new DefaultedHttpParams(response.getParams(), this.params));
289 this.processor.process(request, context);
290 doService(request, response, context);
291 }
292
293
294 if (request instanceof HttpEntityEnclosingRequest) {
295 HttpEntity entity = ((HttpEntityEnclosingRequest)request).getEntity();
296 EntityUtils.consume(entity);
297 }
298
299 } catch (HttpException ex) {
300 response = this.responseFactory.newHttpResponse
301 (HttpVersion.HTTP_1_0, HttpStatus.SC_INTERNAL_SERVER_ERROR,
302 context);
303 response.setParams(
304 new DefaultedHttpParams(response.getParams(), this.params));
305 handleException(ex, response);
306 }
307
308 context.setAttribute(ExecutionContext.HTTP_RESPONSE, response);
309
310 this.processor.process(response, context);
311 conn.sendResponseHeader(response);
312 conn.sendResponseEntity(response);
313 conn.flush();
314
315 if (!this.connStrategy.keepAlive(response, context)) {
316 conn.close();
317 }
318 }
319
320
321
322
323
324
325
326
327
328 protected void handleException(final HttpException ex, final HttpResponse response) {
329 if (ex instanceof MethodNotSupportedException) {
330 response.setStatusCode(HttpStatus.SC_NOT_IMPLEMENTED);
331 } else if (ex instanceof UnsupportedHttpVersionException) {
332 response.setStatusCode(HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED);
333 } else if (ex instanceof ProtocolException) {
334 response.setStatusCode(HttpStatus.SC_BAD_REQUEST);
335 } else {
336 response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
337 }
338 String message = ex.getMessage();
339 if (message == null) {
340 message = ex.toString();
341 }
342 byte[] msg = EncodingUtils.getAsciiBytes(message);
343 ByteArrayEntity entity = new ByteArrayEntity(msg);
344 entity.setContentType("text/plain; charset=US-ASCII");
345 response.setEntity(entity);
346 }
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365 protected void doService(
366 final HttpRequest request,
367 final HttpResponse response,
368 final HttpContext context) throws HttpException, IOException {
369 HttpRequestHandler handler = null;
370 if (this.handlerResolver != null) {
371 String requestURI = request.getRequestLine().getUri();
372 handler = this.handlerResolver.lookup(requestURI);
373 }
374 if (handler != null) {
375 handler.handle(request, response, context);
376 } else {
377 response.setStatusCode(HttpStatus.SC_NOT_IMPLEMENTED);
378 }
379 }
380
381 }