[Httpunit-commit] CVS: httpunit/src/com/meterware/pseudoserver HttpRequest.java,NONE,1.1 PseudoServe
Brought to you by:
russgold
|
From: Russell G. <rus...@us...> - 2003-03-18 19:35:37
|
Update of /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver
In directory sc8-pr-cvs1:/tmp/cvs-serv12900/src/com/meterware/pseudoserver
Modified Files:
PseudoServer.java PseudoServlet.java WebResource.java
Added Files:
HttpRequest.java
Removed Files:
HttpRequestStream.java
Log Message:
refactoring to support persistent connections
***** Error reading new file[Errno 2] No such file or directory: 'HttpRequest.java'
Index: PseudoServer.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/PseudoServer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- PseudoServer.java 22 Nov 2002 17:19:35 -0000 1.5
+++ PseudoServer.java 18 Mar 2003 19:35:33 -0000 1.6
@@ -2,7 +2,7 @@
/********************************************************************************************************************
* $Id$
*
-* Copyright (c) 2000-2002, Russell Gold
+* Copyright (c) 2000-2003, Russell Gold
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
@@ -40,8 +40,8 @@
public void run() {
while (_active) {
try {
- handleConnection();
- Thread.sleep( 50 );
+ handleNewConnection( getServerSocket().accept() );
+ Thread.sleep( 20 );
} catch (InterruptedIOException e) {
_active = false;
} catch (IOException e) {
@@ -192,15 +192,40 @@
}
- private void handleConnection() throws IOException {
- Socket socket = getServerSocket().accept();
+ private void handleNewConnection( final Socket socket ) {
+ Thread t = new Thread() {
+ public void run() {
+ try {
+ serveRequests( socket );
+ } catch (IOException e) {
+ e.printStackTrace(); //To change body of catch statement use Options | File Templates.
+ }
+ }
+ };
+ t.start();
+ }
+
+
+ private void serveRequests( Socket socket ) throws IOException {
socket.setSoTimeout( 1000 );
socket.setTcpNoDelay( true );
- HttpRequestStream request = new HttpRequestStream( socket.getInputStream() );
- HttpResponseStream response = new HttpResponseStream( socket.getOutputStream() );
+ final BufferedInputStream inputStream = new BufferedInputStream( socket.getInputStream() );
+ final HttpResponseStream outputStream = new HttpResponseStream( socket.getOutputStream() );
+
+ HttpRequest request;
+ do {
+ request = new HttpRequest( inputStream );
+ respondToRequest( request, outputStream );
+ } while (!request.requestedCloseConnection() );
+ outputStream.close();
+ socket.close();
+ }
+
+ private void respondToRequest( HttpRequest request, HttpResponseStream response ) {
try {
+ response.setProtocol( request.getProtocol() );
WebResource resource = getResource( request );
if (resource == null) {
response.setResponse( HttpURLConnection.HTTP_NOT_FOUND, "unable to find " + request.getURI() );
@@ -216,20 +241,14 @@
}
} catch (UnknownMethodException e) {
response.setResponse( HttpURLConnection.HTTP_BAD_METHOD, "unsupported method: " + e.getMethod() );
- } catch (IOException e) {
- e.fillInStackTrace();
- throw e;
} catch (Throwable t) {
t.printStackTrace();
response.setResponse( HttpURLConnection.HTTP_INTERNAL_ERROR, t.toString() );
- } finally {
- response.close();
- socket.close();
}
}
- private WebResource getResource( HttpRequestStream request ) throws IOException {
+ private WebResource getResource( HttpRequest request ) throws IOException {
Object resource = _resources.get( request.getURI() );
if (request.getCommand().equals( "GET" ) && resource instanceof WebResource) {
@@ -268,7 +287,7 @@
}
- private WebResource getResource( PseudoServlet servlet, HttpRequestStream request ) throws IOException {
+ private WebResource getResource( PseudoServlet servlet, HttpRequest request ) throws IOException {
servlet.init( request );
return servlet.getResponse( request.getCommand() );
}
@@ -311,6 +330,11 @@
}
+ void setProtocol( String protocol ) {
+ _protocol = protocol;
+ }
+
+
void setResponse( int responseCode, String responseText ) {
_responseCode = responseCode;
_responseText = responseText;
@@ -347,6 +371,7 @@
for (Enumeration e = _headers.elements(); e.hasMoreElements();) {
sendLine( (String) e.nextElement() );
}
+ sendLine( "Connection: close" ); // TODO get rid of this
sendText( CRLF );
_headersWritten = true;
_pw.flush();
@@ -355,7 +380,7 @@
private void sendResponse( int responseCode, String responseText ) {
- sendLine( "HTTP/1.0 " + responseCode + ' ' + responseText );
+ sendLine( _protocol + ' ' + responseCode + ' ' + responseText );
}
@@ -374,6 +399,7 @@
private PrintWriter _pw;
private Vector _headers = new Vector();
+ private String _protocol = "HTTP/1.0";
private int _responseCode = HttpURLConnection.HTTP_OK;
private String _responseText = "OK";
Index: PseudoServlet.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/PseudoServlet.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PseudoServlet.java 24 Jul 2002 17:28:56 -0000 1.1
+++ PseudoServlet.java 18 Mar 2003 19:35:33 -0000 1.2
@@ -72,7 +72,7 @@
}
- void init( HttpRequestStream requestStream ) {
+ void init( HttpRequest requestStream ) {
_requestStream = requestStream;
}
@@ -107,7 +107,7 @@
}
- private HttpRequestStream _requestStream;
+ private HttpRequest _requestStream;
}
Index: WebResource.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/WebResource.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- WebResource.java 15 Nov 2002 00:07:33 -0000 1.3
+++ WebResource.java 18 Mar 2003 19:35:33 -0000 1.4
@@ -24,6 +24,7 @@
import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.util.Vector;
@@ -57,6 +58,7 @@
public void addHeader( String header ) {
_headers.addElement( header );
if (header.toLowerCase().startsWith( "content-type" )) _hasExplicitContentTypeHeader = true;
+ if (header.toLowerCase().startsWith( "content-length" )) _hasExplicitContentLengthHeader = true;
}
@@ -96,9 +98,10 @@
}
- String[] getHeaders() {
+ String[] getHeaders() throws UnsupportedEncodingException {
final Vector effectiveHeaders = (Vector) _headers.clone();
if (!_hasExplicitContentTypeHeader) effectiveHeaders.add( getContentTypeHeader() );
+ if (_stream == null && !_hasExplicitContentLengthHeader) effectiveHeaders.add( getContentLengthHeader() );
String[] headers = new String[ effectiveHeaders.size() ];
effectiveHeaders.copyInto( headers );
return headers;
@@ -106,10 +109,8 @@
void writeTo( OutputStream outputStream ) throws IOException {
- if (_string != null) {
- outputStream.write( _string.getBytes( getCharacterSet() ) );
- } else if (_contents != null) {
- outputStream.write( _contents );
+ if (_stream == null) {
+ outputStream.write( getContentsAsBytes() );
} else if (_stream != null) {
byte[] buffer = new byte[8 * 1024];
int count = 0;
@@ -121,8 +122,24 @@
}
+ private byte[] getContentsAsBytes() throws UnsupportedEncodingException {
+ if (_contents != null) {
+ return _contents;
+ } else if (_string != null) {
+ return _string.getBytes( getCharacterSet() );
+ } else {
+ throw new IllegalStateException( "Cannot get bytes from stream" );
+ }
+ }
+
+
private String getContentTypeHeader() {
- return "Content-type: " + _contentType + getCharacterSetParameter();
+ return "Content-Type: " + _contentType + getCharacterSetParameter();
+ }
+
+
+ private String getContentLengthHeader() throws UnsupportedEncodingException {
+ return "Content-Length: " + getContentsAsBytes().length;
}
@@ -168,6 +185,7 @@
private String _contentType = DEFAULT_CONTENT_TYPE;
private String _characterSet = DEFAULT_CHARACTER_SET;
private boolean _hasExplicitContentTypeHeader;
+ private boolean _hasExplicitContentLengthHeader;
private Vector _headers = new Vector();
}
|