[Httpunit-commit] CVS: httpunit/src/com/meterware/pseudoserver PseudoServlet.java,1.2,1.3 WebResourc
Brought to you by:
russgold
|
From: Russell G. <rus...@us...> - 2003-09-15 12:01:36
|
Update of /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver
In directory sc8-pr-cvs1:/tmp/cvs-serv5813/src/com/meterware/pseudoserver
Modified Files:
PseudoServlet.java WebResource.java HttpRequest.java
PseudoServer.java
Log Message:
Added server socket pooling
Index: PseudoServlet.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/PseudoServlet.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PseudoServlet.java 18 Mar 2003 19:35:33 -0000 1.2
+++ PseudoServlet.java 15 Sep 2003 12:01:32 -0000 1.3
@@ -43,7 +43,7 @@
} else if (methodType.equalsIgnoreCase( "POST" )) {
return getPostResponse();
} else {
- throw new RuntimeException( methodType + " not implemented" );
+ throw new UnknownMethodException( methodType );
}
}
@@ -52,7 +52,7 @@
* Returns a resource object as a result of a get request.
**/
public WebResource getGetResponse() throws IOException {
- throw new RuntimeException( "get not implemented" );
+ throw new UnknownMethodException( "GET" );
}
@@ -60,7 +60,7 @@
* Returns a resource object as a result of a post request.
**/
public WebResource getPostResponse() throws IOException {
- throw new RuntimeException( "post not implemented" );
+ throw new UnknownMethodException( "POST" );
}
@@ -68,7 +68,7 @@
* Returns a resource object as a result of a put request.
**/
public WebResource getPutResponse() throws IOException {
- throw new RuntimeException( "put not implemented" );
+ throw new UnknownMethodException( "PUT" );
}
Index: WebResource.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/WebResource.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- WebResource.java 19 Mar 2003 15:26:06 -0000 1.6
+++ WebResource.java 15 Sep 2003 12:01:32 -0000 1.7
@@ -131,6 +131,16 @@
}
+ static String toString( byte[] contentsAsBytes ) {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < contentsAsBytes.length; i++) {
+ byte contentsAsByte = contentsAsBytes[i];
+ sb.append( Integer.toHexString( contentsAsByte ) ).append( ' ' );
+ }
+ return sb.toString();
+ }
+
+
private byte[] getContentsAsBytes() throws UnsupportedEncodingException {
if (_contents != null) {
return _contents;
Index: HttpRequest.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/HttpRequest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- HttpRequest.java 24 Jun 2003 22:39:41 -0000 1.4
+++ HttpRequest.java 15 Sep 2003 12:01:32 -0000 1.5
@@ -55,9 +55,6 @@
_uri = st.nextToken();
_protocol = st.nextToken();
- if (!_command.equals( "GET" ) && !_command.equals( "POST" ) && !_command.equals( "PUT" )) {
- throw new UnknownMethodException( _command );
- }
readHeaders( inputStream );
readContent( inputStream );
}
Index: PseudoServer.java
===================================================================
RCS file: /cvsroot/httpunit/httpunit/src/com/meterware/pseudoserver/PseudoServer.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- PseudoServer.java 24 Jun 2003 22:39:41 -0000 1.10
+++ PseudoServer.java 15 Sep 2003 12:01:32 -0000 1.11
@@ -36,6 +36,48 @@
private String _maxProtocolLevel = "1.1";
+ /** Time in msec to wait for an outstanding server socket to be released before creating a new one. **/
+ private static int _socketReleaseWaitTime = 50;
+
+ /** Number of outstanding server sockets that must be present before trying to wait for one to be released. **/
+ private static int _waitThreshhold = 10;
+
+
+ /**
+ * Returns the amount of time the pseudo server will wait for a server socket to be released (in msec)
+ * before allocating a new one. See also #getWaitThreshhold.
+ */
+ public static int getSocketReleaseWaitTime() {
+ return _socketReleaseWaitTime;
+ }
+
+
+ /**
+ * Returns the amount of time the pseudo server will wait for a server socket to be released (in msec)
+ * before allocating a new one. See also #getWaitThreshhold.
+ */
+ public static void setSocketReleaseWaitTime( int socketReleaseWaitTime ) {
+ _socketReleaseWaitTime = socketReleaseWaitTime;
+ }
+
+
+ /**
+ * Returns the number of server sockets that must have been allocated and not returned before waiting for one
+ * to be returned.
+ */
+ public static int getWaitThreshhold() {
+ return _waitThreshhold;
+ }
+
+
+ /**
+ * Specifies the number of server sockets that must have been allocated and not returned before waiting for one
+ * to be returned.
+ */
+ public static void setWaitThreshhold( int waitThreshhold ) {
+ _waitThreshhold = waitThreshhold;
+ }
+
public PseudoServer() {
Thread t = new Thread() {
@@ -55,7 +97,7 @@
}
}
try {
- if (_serverSocket != null) _serverSocket.close();
+ if (_serverSocket != null) ServerSocketFactory.release( _serverSocket );
_serverSocket = null;
} catch (IOException e) {
}
@@ -330,8 +372,7 @@
private ServerSocket getServerSocket() throws IOException {
synchronized (this) {
- if (_serverSocket == null) _serverSocket = new ServerSocket(0);
- _serverSocket.setSoTimeout( 1000 );
+ if (_serverSocket == null) _serverSocket = ServerSocketFactory.newServerSocket();
}
return _serverSocket;
}
@@ -446,4 +487,36 @@
private String _responseText = "OK";
private boolean _headersWritten;
+
+}
+
+
+
+class ServerSocketFactory {
+
+ static private ArrayList _sockets = new ArrayList();
+
+ static private int _outstandingSockets;
+
+ static private Object _releaseSemaphore = new Object();
+
+ static synchronized ServerSocket newServerSocket() throws IOException {
+ if (_sockets.isEmpty() && _outstandingSockets > PseudoServer.getWaitThreshhold()) {
+ try { synchronized( _releaseSemaphore) {_releaseSemaphore.wait( PseudoServer.getSocketReleaseWaitTime() ); } } catch (InterruptedException e) {};
+ }
+ _outstandingSockets++;
+ if (!_sockets.isEmpty()) {
+ return (ServerSocket) _sockets.remove(0);
+ } else {
+ ServerSocket serverSocket = new ServerSocket(0);
+ serverSocket.setSoTimeout( 1000 );
+ return serverSocket;
+ }
+ }
+
+ static synchronized void release( ServerSocket serverSocket ) throws IOException {
+ _sockets.add( serverSocket );
+ _outstandingSockets--;
+ synchronized (_releaseSemaphore) { _releaseSemaphore.notify(); }
+ }
}
|