oglueck 2003/01/21 01:47:26
Modified: httpclient/src/java/org/apache/commons/httpclient
HostConfiguration.java HttpConnection.java
HttpConnectionManager.java
MultiThreadedHttpConnectionManager.java
SimpleHttpConnectionManager.java
httpclient/src/java/org/apache/commons/httpclient/protocol
Protocol.java
httpclient/src/test/org/apache/commons/httpclient
TestHttpConnectionManager.java
Log:
connection pool now includes protocol
Contributed by: Oleg Kalnichevski and Michael Becke
Revision Changes Path
1.6 +48 -13
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HostConfiguration.java
Index: HostConfiguration.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HostConfiguration.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- HostConfiguration.java 16 Jan 2003 13:28:39 -0000 1.5
+++ HostConfiguration.java 21 Jan 2003 09:47:26 -0000 1.6
@@ -300,24 +300,59 @@
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
- public boolean equals(Object o) {
+ public synchronized boolean equals(Object o) {
if ( o instanceof HostConfiguration ) {
+ // shortcut if we're comparing with ourselves
+ if ( o == this ) return true;
+
HostConfiguration config = (HostConfiguration)o;
- return (
- proxyPort == config.getProxyPort()
- && (
- proxyHost == null
- ? config.getProxyHost() == null
- : proxyHost.equals( config.getProxyHost() )
- )
- && getHostURL().equals( config.getHostURL() )
- );
+ if ( hostSet ) {
+ if (
+ !host.equalsIgnoreCase( config.getHost() )
+ || port != config.getPort()
+ || !protocol.equals( config.getProtocol() )
+ ) {
+ // either host, port or protocol don't match
+ return false;
+ }
+ } else if ( config.isHostSet() ) {
+ return false;
+ }
+ if ( proxyHost != null ) {
+ if (
+ !proxyHost.equalsIgnoreCase( config.getProxyHost() )
+ || proxyPort != config.getProxyPort()
+ ) {
+ // either proxyHost or proxyPort don't match
+ return false;
+ }
+ } else if ( config.getProxyHost() != null ) {
+ return false;
+ }
+
+ // everything matches
+ return true;
} else {
return false;
+ }
+
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+
+ if ( host != null ) {
+ return host.hashCode();
+ } else if ( proxyHost != null ) {
+ return proxyHost.hashCode();
+ } else {
+ return super.hashCode();
}
}
1.33 +19 -4
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java
Index: HttpConnection.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- HttpConnection.java 19 Jan 2003 15:05:15 -0000 1.32
+++ HttpConnection.java 21 Jan 2003 09:47:26 -0000 1.33
@@ -156,6 +156,21 @@
);
}
+ /**
+ * Creates a new HttpConnection.
+ *
+ * @param hostConfiguration the host/proxy/protocol to use
+ */
+ public HttpConnection( HostConfiguration hostConfiguration ) {
+ this(
+ hostConfiguration.getProxyHost(),
+ hostConfiguration.getProxyPort(),
+ hostConfiguration.getHost(),
+ hostConfiguration.getPort(),
+ hostConfiguration.getProtocol()
+ );
+ }
+
public HttpConnection(
String proxyHost,
int proxyPort,
1.13 +5 -7
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnectionManager.java
Index: HttpConnectionManager.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnectionManager.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- HttpConnectionManager.java 3 Dec 2002 05:46:15 -0000 1.12
+++ HttpConnectionManager.java 21 Jan 2003 09:47:26 -0000 1.13
@@ -62,7 +62,6 @@
package org.apache.commons.httpclient;
-import java.net.MalformedURLException;
/**
* An interface for classes that manage HttpConnections.
@@ -88,8 +87,7 @@
*
* @see HttpConnection#setHttpConnectionManager(HttpConnectionManager)
*/
- public HttpConnection getConnection(HostConfiguration hostConfiguration)
- throws MalformedURLException;
+ public HttpConnection getConnection(HostConfiguration hostConfiguration);
/**
* Gets an HttpConnection for a given host configuration. If a connection is
@@ -112,7 +110,7 @@
* @see HttpConnection#setHttpConnectionManager(HttpConnectionManager)
*/
public HttpConnection getConnection(HostConfiguration hostConfiguration, long
timeout)
- throws HttpException, MalformedURLException;
+ throws HttpException;
/**
* Releases the given HttpConnection for use by other requests.
1.5 +73 -80
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java
Index: MultiThreadedHttpConnectionManager.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- MultiThreadedHttpConnectionManager.java 16 Jan 2003 13:28:39 -0000 1.4
+++ MultiThreadedHttpConnectionManager.java 21 Jan 2003 09:47:26 -0000 1.5
@@ -64,18 +64,16 @@
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
-import java.net.MalformedURLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
-import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
- * Manages a set of HttpConnections for various host:ports.
+ * Manages a set of HttpConnections for various HostConfigurations.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Michael Becke</a>
* @author Eric Johnson
@@ -92,8 +90,8 @@
private Map mapHosts = new HashMap();
private int maxConnections = 2; // Per RFC 2616 sec 8.1.4
- // mapping from reference to hostPort
- private Map referenceToHostPort;
+ // mapping from reference to hostConfiguration
+ private Map referenceToHostConfig;
// the reference queue used to track when HttpConnections are lost to the
// garbage collector
private ReferenceQueue referenceQueue;
@@ -103,7 +101,7 @@
*/
public MultiThreadedHttpConnectionManager() {
- this.referenceToHostPort = Collections.synchronizedMap( new HashMap() );
+ this.referenceToHostConfig = Collections.synchronizedMap( new HashMap() );
this.referenceQueue = new ReferenceQueue();
new ReferenceQueueThread().start();
@@ -111,19 +109,22 @@
}
/**
- * Set the maximum number of connections allowed for a given host:port.
- * Per RFC 2616 section 8.1.4, this value defaults to 2.
+ * Sets the maximum number of connections allowed for a given
+ * HostConfiguration. Per RFC 2616 section 8.1.4, this value defaults to 2.
*
- * @param maxConnections - number of connections allowed for each host:port
+ * @param maxConnections the number of connections allowed for each
+ * hostConfiguration
*/
public void setMaxConnectionsPerHost(int maxConnections) {
this.maxConnections = maxConnections;
}
/**
- * Get the maximum number of connections allowed for a given host:port.
+ * Gets the maximum number of connections allowed for a given
+ * hostConfiguration.
*
- * @return The maximum number of connections allowed for a given host:port.
+ * @return The maximum number of connections allowed for a given
+ * hostConfiguration.
*/
public int getMaxConnectionsPerHost() {
return maxConnections;
@@ -132,8 +133,7 @@
/**
* @see HttpConnectionManager#getConnection(HostConfiguration)
*/
- public HttpConnection getConnection(HostConfiguration hostConfiguration)
- throws MalformedURLException {
+ public HttpConnection getConnection(HostConfiguration hostConfiguration) {
while( true ) {
try {
@@ -152,35 +152,23 @@
* @see HttpConnectionManager#getConnection(HostConfiguration, long)
*/
public HttpConnection getConnection(HostConfiguration hostConfiguration, long
timeout)
- throws HttpException, MalformedURLException {
+ throws HttpException {
log.trace("enter HttpConnectionManager.getConnection(HostConfiguration,
long)");
if (hostConfiguration == null) {
- throw new MalformedURLException("hostConfiguration is null");
+ throw new IllegalArgumentException("hostConfiguration is null");
}
- // Get the protocol and port (use default port if not specified)
- Protocol protocol = hostConfiguration.getProtocol();
- String host = hostConfiguration.getHost();
- int port = protocol.resolvePort( hostConfiguration.getPort() );
-
- String hostAndPort = host + ":" + port;
-
if (log.isDebugEnabled()) {
- log.debug("HttpConnectionManager.getConnection: key = "
- + hostAndPort);
+ log.debug("HttpConnectionManager.getConnection: config = "
+ + hostConfiguration + ", timeout = " + timeout);
}
- // Look for a list of connections for the given host:port
- HostConnectionPool connectionPool = getConnectionPool(hostAndPort);
-
+ // we get the connection pool with a clone of the hostConfiguration
+ // so that it cannot be changed once the connecton has been retrieved
HttpConnection conn = getConnection(
- connectionPool,
- host,
- port,
- protocol,
- hostConfiguration.getProxyHost(),
- hostConfiguration.getProxyPort(),
+ getConnectionPool( new HostConfiguration( hostConfiguration ) ),
+ hostConfiguration,
timeout
);
@@ -193,10 +181,7 @@
* maxConnections have been created in the connectionPool.
*
* @param connectionPool
- * @param host
- * @param port
- * @param proxyHost
- * @param proxyPort
+ * @param hostConfiguration
* @param timeout the number of milliseconds to wait for a connection, 0 to
* wait indefinitely
*
@@ -207,11 +192,7 @@
*/
private HttpConnection getConnection(
HostConnectionPool connectionPool,
- String host,
- int port,
- Protocol protocol,
- String proxyHost,
- int proxyPort,
+ HostConfiguration hostConfiguration,
long timeout
) throws HttpException {
@@ -226,23 +207,17 @@
if (connectionPool.freeConnections.size() > 0) {
connection =
(HttpConnection)connectionPool.freeConnections.removeFirst();
} else {
- // get number of connections to host:port
+ // get number of connections hostConfig
if (connectionPool.numConnections < maxConnections) {
// Create a new connection
- connection = new HttpConnection(
- proxyHost,
- proxyPort,
- host,
- port,
- protocol
- );
+ connection = new HttpConnection( hostConfiguration );
connection.setHttpConnectionManager( this );
connectionPool.numConnections++;
// add a weak reference to this connection
- referenceToHostPort.put(
+ referenceToHostConfig.put(
new WeakReference( connection, referenceQueue ),
- host + ":" + port
+ hostConfiguration
);
} else {
@@ -275,37 +250,37 @@
}
/**
- * Get the pool (list) of connections available for the given host and port
+ * Get the pool (list) of connections available for the given hostConfig.
*
- * @param hostAndPort the key for the connection pool
- * @return a pool (list) of connections available for the given key
+ * @param hostConfiguration the configuraton for the connection pool
+ * @return a pool (list) of connections available for the given config
*/
- private HostConnectionPool getConnectionPool(String hostAndPort) {
+ private HostConnectionPool getConnectionPool(HostConfiguration
hostConfiguration) {
log.trace("enter HttpConnectionManager.getConnections(String)");
- // Look for a list of connections for the given host:port
+ // Look for a list of connections for the given config
HostConnectionPool listConnections = null;
synchronized (mapHosts) {
- listConnections = (HostConnectionPool) mapHosts.get(hostAndPort);
+ listConnections = (HostConnectionPool) mapHosts.get(hostConfiguration);
if (listConnections == null) {
- // First time for this host:port
+ // First time for this config
listConnections = new HostConnectionPool();
- mapHosts.put(hostAndPort, listConnections);
+ mapHosts.put(hostConfiguration, listConnections);
}
}
return listConnections;
}
/**
- * Get the number of connections in use for the key
+ * Get the number of connections in use for this configuration.
*
- * @param hostAndPort the key that connections are tracked on
- * @return the number of connections in use for the given key
+ * @param hostConfiguration the key that connections are tracked on
+ * @return the number of connections in use
*/
- public int getConnectionsInUse(String hostAndPort) {
+ public int getConnectionsInUse(HostConfiguration hostConfiguration) {
log.trace("enter HttpConnectionManager.getConnectionsInUse(String)");
- HostConnectionPool connectionPool = getConnectionPool(hostAndPort);
+ HostConnectionPool connectionPool = getConnectionPool(hostConfiguration);
synchronized( connectionPool ) {
return connectionPool.numConnections;
}
@@ -314,31 +289,48 @@
/**
* Make the given HttpConnection available for use by other requests.
- * If another thread is blocked in getConnection() waiting for a connection
- * for this host:port, they will be woken up.
+ * If another thread is blocked in getConnection() that could use this
+ * connection, it will be woken up.
*
- * @param conn - The HttpConnection to make available.
+ * @param conn the HttpConnection to make available.
*/
public void releaseConnection(HttpConnection conn) {
log.trace("enter HttpConnectionManager.releaseConnection(HttpConnection)");
// make sure that the response has been read.
SimpleHttpConnectionManager.finishLastResponse(conn);
- String host = conn.getHost();
- int port = conn.getPort();
- String key = host + ":" + port;
+
+ HostConfiguration connectionConfiguration = new HostConfiguration();
+ connectionConfiguration.setHost(
+ conn.getHost(),
+ conn.getPort(),
+ conn.getProtocol()
+ );
+ if ( conn.getProxyHost() != null ) {
+ connectionConfiguration.setProxy(
+ conn.getProxyHost(),
+ conn.getProxyPort()
+ );
+ }
if(log.isDebugEnabled()){
- log.debug("HttpConnectionManager.releaseConnection: Release connection
for " + host + ":" + port);
+ log.debug(
+ "HttpConnectionManager.releaseConnection: Release connection for "
+ + connectionConfiguration
+ );
}
- HostConnectionPool listConnections = getConnectionPool(key);
+ HostConnectionPool listConnections = getConnectionPool(
+ connectionConfiguration
+ );
synchronized(listConnections){
// Put the connect back in the available list and notify a waiter
listConnections.freeConnections.addFirst(conn);
if ( listConnections.numConnections == 0 ) {
// for some reason this connection pool didn't already exist
- log.error("connection pool not found for host: " + key);
+ log.error(
+ "connection pool not found for: " + connectionConfiguration
+ );
listConnections.numConnections = 1;
}
listConnections.notify();
@@ -377,9 +369,10 @@
Reference ref = referenceQueue.remove();
if ( ref != null ) {
- String hostPort = (String)referenceToHostPort.get(ref);
- referenceToHostPort.remove(ref);
- HostConnectionPool connectionPool =
getConnectionPool(hostPort);
+ HostConfiguration config = (HostConfiguration)
+ referenceToHostConfig.get(ref);
+ referenceToHostConfig.remove(ref);
+ HostConnectionPool connectionPool =
getConnectionPool(config);
synchronized( connectionPool ) {
connectionPool.numConnections--;
connectionPool.notify();
1.6 +6 -10
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/SimpleHttpConnectionManager.java
Index: SimpleHttpConnectionManager.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/SimpleHttpConnectionManager.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SimpleHttpConnectionManager.java 16 Jan 2003 13:28:39 -0000 1.5
+++ SimpleHttpConnectionManager.java 21 Jan 2003 09:47:26 -0000 1.6
@@ -61,9 +61,8 @@
*/
package org.apache.commons.httpclient;
-import java.net.MalformedURLException;
-import java.io.InputStream;
import java.io.IOException;
+import java.io.InputStream;
import org.apache.commons.httpclient.protocol.Protocol;
@@ -92,17 +91,14 @@
/**
* @see
org.apache.commons.httpclient.HttpConnectionManager#getConnection(HostConfiguration)
*/
- public HttpConnection getConnection(HostConfiguration hostConfiguration)
- throws MalformedURLException {
-
+ public HttpConnection getConnection(HostConfiguration hostConfiguration) {
return getConnection(hostConfiguration, 0);
}
/**
* @see
org.apache.commons.httpclient.HttpConnectionManager#getConnection(HostConfiguration,
long)
*/
- public HttpConnection getConnection(HostConfiguration hostConfiguration, long
timeout)
- throws MalformedURLException {
+ public HttpConnection getConnection(HostConfiguration hostConfiguration, long
timeout) {
Protocol protocol = hostConfiguration.getProtocol();
String host = hostConfiguration.getHost();
1.2 +31 -2
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/protocol/Protocol.java
Index: Protocol.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/protocol/Protocol.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Protocol.java 16 Jan 2003 13:28:40 -0000 1.1
+++ Protocol.java 21 Jan 2003 09:47:26 -0000 1.2
@@ -301,4 +301,33 @@
return scheme + ":" + defaultPort;
}
+ /**
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+
+ if ( obj instanceof Protocol ) {
+
+ Protocol p = (Protocol)obj;
+
+ return (
+ defaultPort == p.getDefaultPort()
+ && scheme.equalsIgnoreCase( p.getScheme() )
+ && secure == p.isSecure()
+ && socketFactory.equals( p.getSocketFactory() )
+ );
+
+ } else {
+ return false;
+ }
+
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ return scheme.hashCode();
+ }
+
}
1.3 +42 -54
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestHttpConnectionManager.java
Index: TestHttpConnectionManager.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestHttpConnectionManager.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestHttpConnectionManager.java 3 Dec 2002 05:46:16 -0000 1.2
+++ TestHttpConnectionManager.java 21 Jan 2003 09:47:26 -0000 1.3
@@ -63,7 +63,6 @@
package org.apache.commons.httpclient;
import java.io.IOException;
-import java.net.MalformedURLException;
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -118,36 +117,31 @@
HostConfiguration hostConfiguration = new HostConfiguration();
hostConfiguration.setHost("www.nosuchserver.com", 80, "http");
- try{
- // Create a new connection
- HttpConnection conn = mgr.getConnection(hostConfiguration);
- // Validate the connection properties
- assertEquals("Host", "www.nosuchserver.com", conn.getHost());
- assertEquals("Port", 80, conn.getPort());
- // Release the connection
- mgr.releaseConnection(conn);
-
- // Create a new connection
- hostConfiguration.setHost("www.nosuchserver.com", -1, "https");
- conn = mgr.getConnection(hostConfiguration);
- // Validate the connection properties
- assertEquals("Host", "www.nosuchserver.com", conn.getHost());
- assertEquals("Port", 443, conn.getPort());
- // Release the connection
- mgr.releaseConnection(conn);
-
- // Create a new connection
- hostConfiguration.setHost("www.nowhere.org", 8080, "http");
- conn = mgr.getConnection(hostConfiguration);
- // Validate the connection properties
- assertEquals("Host", "www.nowhere.org", conn.getHost());
- assertEquals("Port", 8080, conn.getPort());
- // Release the connection
- mgr.releaseConnection(conn);
-
- }catch(MalformedURLException e){
- fail("Caught unexpected MalformedURLException (" + e.toString() + ")");
- }
+ // Create a new connection
+ HttpConnection conn = mgr.getConnection(hostConfiguration);
+ // Validate the connection properties
+ assertEquals("Host", "www.nosuchserver.com", conn.getHost());
+ assertEquals("Port", 80, conn.getPort());
+ // Release the connection
+ mgr.releaseConnection(conn);
+
+ // Create a new connection
+ hostConfiguration.setHost("www.nosuchserver.com", -1, "https");
+ conn = mgr.getConnection(hostConfiguration);
+ // Validate the connection properties
+ assertEquals("Host", "www.nosuchserver.com", conn.getHost());
+ assertEquals("Port", 443, conn.getPort());
+ // Release the connection
+ mgr.releaseConnection(conn);
+
+ // Create a new connection
+ hostConfiguration.setHost("www.nowhere.org", 8080, "http");
+ conn = mgr.getConnection(hostConfiguration);
+ // Validate the connection properties
+ assertEquals("Host", "www.nowhere.org", conn.getHost());
+ assertEquals("Port", 8080, conn.getPort());
+ // Release the connection
+ mgr.releaseConnection(conn);
}
@@ -317,24 +311,20 @@
HostConfiguration hostConfig3 = new HostConfiguration();
hostConfig3.setHost("www.nosuchserver.com", -1, "http");
- try{
- // Create a new connection
- HttpConnection conn1 = mgr.getConnection(hostConfig1);
- // Release the connection
- mgr.releaseConnection(conn1);
-
- // Get the same connection again
- HttpConnection conn2 = mgr.getConnection(hostConfig2);
- assertEquals("Same connection", conn1, conn2);
- // don't release yet
-
- // Get another new connection
- HttpConnection conn3 = mgr.getConnection(hostConfig3);
- assertTrue(conn2 != conn3);
+ // Create a new connection
+ HttpConnection conn1 = mgr.getConnection(hostConfig1);
+ // Release the connection
+ mgr.releaseConnection(conn1);
+
+ // Get the same connection again
+ HttpConnection conn2 = mgr.getConnection(hostConfig2);
+ assertEquals("Same connection", conn1, conn2);
+ // don't release yet
+
+ // Get another new connection
+ HttpConnection conn3 = mgr.getConnection(hostConfig3);
+ assertTrue(conn2 != conn3);
- }catch(MalformedURLException e){
- fail("Caught unexpected MalformedURLException (" + e.toString() + ")");
- }
}
public void testTimeout()
@@ -350,8 +340,6 @@
HttpConnection conn3 = mgr.getConnection(hostConfig, 5000);
fail("Expected an HttpException.");
- }catch(MalformedURLException e){
- fail("Caught unexpected MalformedURLException (" + e.toString() + ")");
}catch(HttpException e){
//Expected result
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>