1 /*
2 * $Header: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/server/SimpleHttpServerConnection.java,v 1.1.2.4 2003/11/24 23:16:42 oglueck Exp $
3 * $Revision: 1.1.2.4 $
4 * $Date: 2003/11/24 23:16:42 $
5 *
6 * ====================================================================
7 *
8 * The Apache Software License, Version 1.1
9 *
10 * Copyright (c) 1999-2003 The Apache Software Foundation. All rights
11 * reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 *
17 * 1. Redistributions of source code must retain the above copyright
18 * notice, this list of conditions and the following disclaimer.
19 *
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in
22 * the documentation and/or other materials provided with the
23 * distribution.
24 *
25 * 3. The end-user documentation included with the redistribution, if
26 * any, must include the following acknowlegement:
27 * "This product includes software developed by the
28 * Apache Software Foundation (http://www.apache.org/)."
29 * Alternately, this acknowlegement may appear in the software itself,
30 * if and wherever such third-party acknowlegements normally appear.
31 *
32 * 4. The names "The Jakarta Project", "Commons", and "Apache Software
33 * Foundation" must not be used to endorse or promote products derived
34 * from this software without prior written permission. For written
35 * permission, please contact apache@apache.org.
36 *
37 * 5. Products derived from this software may not be called "Apache"
38 * nor may "Apache" appear in their names without prior written
39 * permission of the Apache Group.
40 *
41 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
42 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
43 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
45 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
47 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
48 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
49 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
51 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 * ====================================================================
54 *
55 * This software consists of voluntary contributions made by many
56 * individuals on behalf of the Apache Software Foundation. For more
57 * information on the Apache Software Foundation, please see
58 * <http://www.apache.org/>.
59 *
60 * [Additional notices, if required by prior licensing conditions]
61 *
62 */
63
64 package org.apache.commons.httpclient.server;
65
66 import java.io.IOException;
67 import java.io.InputStream;
68 import java.io.OutputStream;
69 import java.io.UnsupportedEncodingException;
70 import java.net.Socket;
71 import java.net.SocketException;
72
73 import org.apache.commons.httpclient.Header;
74 import org.apache.commons.httpclient.HttpParser;
75 import org.apache.commons.httpclient.HttpStatus;
76 import org.apache.commons.logging.Log;
77 import org.apache.commons.logging.LogFactory;
78
79 /***
80 * A connection to the SimpleHttpServer.
81 *
82 * @author Christian Kohlschuetter
83 */
84 public class SimpleHttpServerConnection implements Runnable {
85
86 private static final Log LOG = LogFactory.getLog(SimpleHttpServerConnection.class);
87
88 private SimpleHttpServer server;
89 private Socket socket;
90 private InputStream in;
91 private OutputStream out;
92
93 private int requestNo = 0;
94
95 private boolean keepAlive = false;
96
97 private RequestLine requestLine;
98
99 private Header[] headers;
100
101 public SimpleHttpServerConnection(SimpleHttpServer server, Socket socket) throws IOException {
102 this.server = server;
103 this.socket = socket;
104 this.in = socket.getInputStream();
105 this.out = socket.getOutputStream();
106 }
107
108 public void destroy() {
109 try {
110 if(socket != null) {
111 in.close();
112 out.close();
113 socket.close();
114 socket = null;
115 }
116 } catch(IOException e) {
117 // fail("Unexpected exception: " + e);
118 }
119 server.removeConnection(this);
120 }
121
122 public void run() {
123 requestNo = 0;
124 try {
125 do {
126 keepAlive = false;
127
128 ++this.requestNo;
129 readRequest();
130 } while(keepAlive);
131 } catch (SocketException ignore) {
132 } catch (IOException e) {
133 LOG.error("ServerConnection read error", e);
134 throw new RuntimeException(e.getMessage());
135 } finally {
136 destroy();
137 }
138 }
139
140 /***
141 * Requests to close connection after processing this request.
142 */
143 public void connectionClose() {
144 keepAlive = false;
145 }
146
147 /***
148 * Requests to keep the connection alive after processing this request
149 * (must be re-issued for every request if permanent keep-alive is desired).
150 *
151 */
152 public void connectionKeepAlive() {
153 keepAlive = true;
154 }
155
156 /***
157 * Returns the ResponseWriter used to write the output to the socket.
158 *
159 * @return This connection's ResponseWriter
160 */
161 public ResponseWriter getWriter() {
162 try {
163 return new ResponseWriter(out);
164 } catch (UnsupportedEncodingException e) {
165 throw new RuntimeException(e.toString());
166 }
167 }
168
169 /***
170 * Returns the number of requests processed (including the current one)
171 * for this connection.
172 *
173 * @return
174 */
175 public int getRequestNumber() {
176 return requestNo;
177 }
178
179 private void readRequest() throws IOException {
180 String line;
181 do {
182 line = HttpParser.readLine(in);
183 } while(line != null && line.length() == 0);
184
185 if(line == null) {
186 connectionClose();
187 return;
188 }
189
190 try {
191 requestLine = RequestLine.parseLine(line);
192 headers = HttpParser.parseHeaders(in);
193 } catch(IOException e) {
194 connectionClose();
195 ErrorResponse.getInstance().getResponse(HttpStatus.SC_BAD_REQUEST).processRequest(this);
196 return;
197 }
198 server.processRequest(this);
199 out.flush();
200 }
201
202 public Header[] getHeaders() {
203 Header[] copy = new Header[headers.length];
204 System.arraycopy(headers, 0, copy, 0, headers.length);
205 return copy;
206 }
207
208 public RequestLine getRequestLine() {
209 return requestLine;
210 }
211
212 public InputStream getInputStream() {
213 return in;
214 }
215
216 public OutputStream getOutputStream() {
217 return out;
218 }
219 }
This page was automatically generated by Maven