KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > commons > httpclient > server > HttpServiceHandler


1 /*
2  * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/test/org/apache/commons/httpclient/server/HttpServiceHandler.java,v 1.9 2004/11/13 22:38:27 mbecke Exp $
3  * $Revision: 480424 $
4  * $Date: 2006-11-29 05:56:49 +0000 (Wed, 29 Nov 2006) $
5  *
6  * ====================================================================
7  *
8  * Licensed to the Apache Software Foundation (ASF) under one or more
9  * contributor license agreements. See the NOTICE file distributed with
10  * this work for additional information regarding copyright ownership.
11  * The ASF licenses this file to You under the Apache License, Version 2.0
12  * (the "License"); you may not use this file except in compliance with
13  * the License. You may obtain a copy of the License at
14  *
15  * http://www.apache.org/licenses/LICENSE-2.0
16  *
17  * Unless required by applicable law or agreed to in writing, software
18  * distributed under the License is distributed on an "AS IS" BASIS,
19  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20  * See the License for the specific language governing permissions and
21  * limitations under the License.
22  * ====================================================================
23  *
24  * This software consists of voluntary contributions made by many
25  * individuals on behalf of the Apache Software Foundation. For more
26  * information on the Apache Software Foundation, please see
27  * <http://www.apache.org/>.
28  *
29  */

30
31 package org.apache.commons.httpclient.server;
32
33 import java.io.IOException JavaDoc;
34 import java.io.InputStream JavaDoc;
35
36 import org.apache.commons.httpclient.Header;
37 import org.apache.commons.httpclient.HttpVersion;
38
39 /**
40  * This request handler provides service interface similar to that of Servlet API.
41  *
42  * @author Oleg Kalnichevski
43  */

44 public class HttpServiceHandler implements HttpRequestHandler {
45
46     private HttpService service = null;
47     
48     public HttpServiceHandler(final HttpService service) {
49         super();
50         if (service == null) {
51             throw new IllegalArgumentException JavaDoc("Service may not be null");
52         }
53         this.service = service;
54     }
55     
56     public boolean processRequest(
57         final SimpleHttpServerConnection conn,
58         final SimpleRequest request) throws IOException JavaDoc {
59         if (conn == null) {
60             throw new IllegalArgumentException JavaDoc("Connection may not be null");
61         }
62         if (request == null) {
63             throw new IllegalArgumentException JavaDoc("Request may not be null");
64         }
65         boolean complete = false;
66         SimpleResponse response = new SimpleResponse();
67         this.service.process(request, response);
68         
69         // Nake sure the request if fully consumed
70
request.getBodyBytes();
71         
72         // Ensure there's a content type header
73
if (!response.containsHeader("Content-Type")) {
74             response.addHeader(new Header("Content-Type", "text/plain"));
75         }
76         
77         // Ensure there's a content length or transfer encoding header
78
if (!response.containsHeader("Content-Length") && !response.containsHeader("Transfer-Encoding")) {
79             InputStream JavaDoc content = response.getBody();
80             if (content != null) {
81                 long len = response.getContentLength();
82                 if (len < 0) {
83                     if (response.getHttpVersion().lessEquals(HttpVersion.HTTP_1_0)) {
84                         throw new IOException JavaDoc("Chunked encoding not supported for HTTP version "
85                                 + response.getHttpVersion());
86                     }
87                     Header header = new Header("Transfer-Encoding", "chunked");
88                     response.addHeader(header);
89                 } else {
90                     Header header = new Header("Content-Length", Long.toString(len));
91                     response.setHeader(header);
92                 }
93             } else {
94                 Header header = new Header("Content-Length", "0");
95                 response.addHeader(header);
96             }
97         }
98
99         if (!response.containsHeader("Connection")) {
100             // See if the the client explicitly handles connection persistence
101
Header connheader = request.getFirstHeader("Connection");
102             if (connheader != null) {
103                 if (connheader.getValue().equalsIgnoreCase("keep-alive")) {
104                     Header header = new Header("Connection", "keep-alive");
105                     response.addHeader(header);
106                     conn.setKeepAlive(true);
107                 }
108                 if (connheader.getValue().equalsIgnoreCase("close")) {
109                     Header header = new Header("Connection", "close");
110                     response.addHeader(header);
111                     conn.setKeepAlive(false);
112                 }
113             } else {
114                 // Use protocol default connection policy
115
if (response.getHttpVersion().greaterEquals(HttpVersion.HTTP_1_1)) {
116                     conn.setKeepAlive(true);
117                 } else {
118                     conn.setKeepAlive(false);
119                 }
120             }
121         }
122         if ("HEAD".equalsIgnoreCase(request.getRequestLine().getMethod())) {
123             // this is a head request, we don't want to send the actualy content
124
response.setBody(null);
125         }
126         conn.writeResponse(response);
127         return true;
128     }
129     
130 }
131
Popular Tags