[Httpunit-commit] CVS: httpunit/src/com/meterware/pseudoserver ReceivedHttpMessage.java,NONE,1.1 Htt
Brought to you by:
russgold
|
From: Russell G. <rus...@us...> - 2003-09-17 01:21:21
|
Update of /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver
In directory sc8-pr-cvs1:/tmp/cvs-serv15606/src/com/meterware/pseudoserver
Modified Files:
HttpRequest.java PseudoServer.java PseudoServlet.java
WebResource.java
Added Files:
ReceivedHttpMessage.java
Log Message:
PseudoServer support for chunked messages
***** Error reading new file[Errno 2] No such file or directory: 'ReceivedHttpMessage.java'
Index: HttpRequest.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/HttpRequest.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- HttpRequest.java 15 Sep 2003 12:01:32 -0000 1.5
+++ HttpRequest.java 17 Sep 2003 01:21:15 -0000 1.6
@@ -21,49 +21,42 @@
*******************************************************************************************************************/
import com.meterware.httpunit.HttpUnitUtils;
-import java.io.ByteArrayInputStream;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.IOException;
-import java.io.Reader;
import java.util.StringTokenizer;
import java.util.Hashtable;
-import java.util.Enumeration;
/**
* Represents a single HTTP request, extracted from the input stream.
*/
-class HttpRequest {
+class HttpRequest extends ReceivedHttpMessage {
- private static final int CR = 13;
- private static final int LF = 10;
-
- private Reader _reader;
private String _protocol;
private String _command;
private String _uri;
- private Hashtable _headers = new Hashtable();
private Hashtable _parameters;
- private byte[] _requestBody;
HttpRequest( InputStream inputStream ) throws IOException {
- StringTokenizer st = new StringTokenizer( readHeaderLine( inputStream ) );
+ super( inputStream );
+ }
+
+
+ protected void interpretMessageHeader( String messageHeader ) {
+ StringTokenizer st = new StringTokenizer( messageHeader );
_command = st.nextToken();
_uri = st.nextToken();
_protocol = st.nextToken();
-
- readHeaders( inputStream );
- readContent( inputStream );
}
- Reader getReader() {
- return _reader;
+ protected void appendMessageHeader( StringBuffer sb ) {
+ sb.append( _command ).append( ' ' ).append( _uri ).append( ' ' ).append( _protocol );
}
+
String getCommand() {
return _command;
}
@@ -78,85 +71,26 @@
}
- String getHeader( String name ) {
- return (String) _headers.get( name.toUpperCase() );
- }
-
-
- byte[] getBody() {
- return _requestBody;
- }
-
-
/**
* Returns the parameter with the specified name. If no such parameter exists, will
* return null.
**/
String[] getParameter( String name ) {
if (_parameters == null) {
- _parameters = readParameters( new String( _requestBody ) );
+ _parameters = readParameters( new String( getBody() ) );
}
return (String[]) _parameters.get( name );
}
- public String toString() {
- StringBuffer sb = new StringBuffer( "HttpRequest[ ");
- sb.append( _command ).append( ' ' ).append( _uri ).append( ' ' ).append( _protocol ).append( "\n" );
- for (Enumeration e = _headers.keys(); e.hasMoreElements();) {
- Object key = e.nextElement();
- sb.append( " " ).append( key ).append( ": " ).append( _headers.get( key ) ).append( "\n" );
- }
- sb.append( " body contains " ).append( getBody().length ).append( " byte(s) ]" );
- return sb.toString();
- }
-
-
- private void readContent( InputStream inputStream ) throws IOException {
- _requestBody = new byte[ getContentLength() ];
- inputStream.read( _requestBody );
- _reader = new InputStreamReader( new ByteArrayInputStream( _requestBody ) );
- }
-
-
- private int getContentLength() {
- try {
- return Integer.parseInt( getHeader( "Content-Length" ) );
- } catch (NumberFormatException e) {
- return 0;
- }
- }
-
-
- private void readHeaders( InputStream inputStream ) throws IOException {
- String lastHeader = null;
-
- String header = readHeaderLine( inputStream );
- while (header.length() > 0) {
- if (header.charAt(0) <= ' ') {
- if (lastHeader == null) continue;
- _headers.put( lastHeader, _headers.get( lastHeader ) + header.trim() );
- } else {
- lastHeader = header.substring( 0, header.indexOf(':') ).toUpperCase();
- _headers.put( lastHeader, header.substring( header.indexOf(':')+1 ).trim() );
- }
- header = readHeaderLine( inputStream );
- }
- }
-
-
- private String readHeaderLine( InputStream inputStream ) throws IOException {
- StringBuffer sb = new StringBuffer();
- int b = inputStream.read();
- while (b != CR) {
- sb.append( (char) b );
- b = inputStream.read();
+ boolean wantsKeepAlive() {
+ if ("Keep-alive".equalsIgnoreCase( getConnectionHeader() )) {
+ return true;
+ } else if (_protocol.equals( "HTTP/1.1" )) {
+ return !"Close".equalsIgnoreCase( getConnectionHeader() );
+ } else {
+ return false;
}
-
- b = inputStream.read();
- if (b != LF) throw new IOException( "Bad header line termination: " + b );
-
- return sb.toString();
}
@@ -188,20 +122,10 @@
}
- boolean wantsKeepAlive() {
- if ("Keep-alive".equalsIgnoreCase( getConnectionHeader() )) {
- return true;
- } else if (_protocol.equals( "HTTP/1.1" )) {
- return !"Close".equalsIgnoreCase( getConnectionHeader() );
- } else {
- return false;
- }
- }
-
-
private String getConnectionHeader() {
return getHeader( "Connection" );
}
+
}
Index: PseudoServer.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/PseudoServer.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- PseudoServer.java 15 Sep 2003 12:01:32 -0000 1.11
+++ PseudoServer.java 17 Sep 2003 01:21:15 -0000 1.12
@@ -515,8 +515,61 @@
}
static synchronized void release( ServerSocket serverSocket ) throws IOException {
- _sockets.add( serverSocket );
- _outstandingSockets--;
- synchronized (_releaseSemaphore) { _releaseSemaphore.notify(); }
+ if (_sockets.size() >= 2 * PseudoServer.getWaitThreshhold()) {
+ serverSocket.close();
+ } else {
+ _sockets.add( serverSocket );
+ _outstandingSockets--;
+ synchronized (_releaseSemaphore) { _releaseSemaphore.notify(); }
+ }
}
}
+
+
+class RecordingOutputStream extends OutputStream {
+
+ private OutputStream _nestedStream;
+ private PrintStream _log;
+
+
+ public RecordingOutputStream( OutputStream nestedStream, PrintStream log ) {
+ _nestedStream = nestedStream;
+ _log = log;
+ }
+
+
+ public void write( int b ) throws IOException {
+ _nestedStream.write( b );
+ _log.println( "sending " + Integer.toHexString( b ) );
+ }
+
+
+ public void write( byte b[], int offset, int len ) throws IOException {
+ _nestedStream.write( b, offset, len );
+ _log.print( "sending" );
+ for (int i = offset; i < offset+len; i++) {
+ _log.print( ' ' + Integer.toHexString( b[i] ) );
+ }
+ _log.println();
+ }
+}
+
+
+class RecordingInputStream extends InputStream {
+
+ private InputStream _nestedStream;
+ private PrintStream _log;
+
+
+ public RecordingInputStream( InputStream nestedStream, PrintStream log ) {
+ _nestedStream = nestedStream;
+ _log = log;
+ }
+
+
+ public int read() throws IOException {
+ int value = _nestedStream.read();
+ if (value != -1) _log.print( ' ' + Integer.toHexString( value ) );
+ return value;
+ }
+}
\ No newline at end of file
Index: PseudoServlet.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/PseudoServlet.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PseudoServlet.java 15 Sep 2003 12:01:32 -0000 1.3
+++ PseudoServlet.java 17 Sep 2003 01:21:15 -0000 1.4
@@ -107,7 +107,13 @@
}
+ protected HttpRequest getRequest() {
+ return _requestStream;
+ }
+
+
private HttpRequest _requestStream;
+
}
Index: WebResource.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/WebResource.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- WebResource.java 15 Sep 2003 12:01:32 -0000 1.7
+++ WebResource.java 17 Sep 2003 01:21:15 -0000 1.8
@@ -62,6 +62,8 @@
if (header.toLowerCase().startsWith( "content-length" )) _hasExplicitContentLengthHeader = true;
if (header.trim().toLowerCase().startsWith( "connection" ) &&
header.trim().toLowerCase().endsWith( "close") ) _closesConnection = true;
+ if (header.trim().toLowerCase().startsWith( "transfer-encoding" ) &&
+ header.trim().toLowerCase().endsWith( "chunked") ) _isChunked = true;
}
@@ -105,13 +107,18 @@
String[] getHeaders() throws UnsupportedEncodingException {
final Vector effectiveHeaders = (Vector) _headers.clone();
if (!_hasExplicitContentTypeHeader) effectiveHeaders.add( getContentTypeHeader() );
- if (_stream == null && !_hasExplicitContentLengthHeader) effectiveHeaders.add( getContentLengthHeader() );
+ if (_stream == null && !_hasExplicitContentLengthHeader && !isChunked()) effectiveHeaders.add( getContentLengthHeader() );
String[] headers = new String[ effectiveHeaders.size() ];
effectiveHeaders.copyInto( headers );
return headers;
}
+ private boolean isChunked() {
+ return _isChunked;
+ }
+
+
boolean closesConnection() {
return _closesConnection;
}
@@ -206,6 +213,7 @@
private boolean _hasExplicitContentTypeHeader;
private boolean _hasExplicitContentLengthHeader;
private Vector _headers = new Vector();
+ private boolean _isChunked;
}
|