You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by mb...@apache.org on 2003/05/12 04:42:42 UTC
cvs commit: jakarta-commons/httpclient/src/java/org/apache/commons/httpclient HttpConnection.java SimpleHttpConnectionManager.java HostConfiguration.java HttpClient.java
mbecke 2003/05/11 19:42:42
Modified: httpclient/src/java/org/apache/commons/httpclient
HttpConnection.java
SimpleHttpConnectionManager.java
HostConfiguration.java HttpClient.java
Log:
Added support for setting HttpConnection local address.
PR: 19827
Submitted by: Laura Werner
Revision Changes Path
1.66 +41 -6 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.65
retrieving revision 1.66
diff -u -r1.65 -r1.66
--- HttpConnection.java 8 May 2003 17:33:51 -0000 1.65
+++ HttpConnection.java 12 May 2003 02:42:42 -0000 1.66
@@ -70,6 +70,7 @@
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.lang.reflect.Method;
+import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
@@ -109,6 +110,7 @@
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
* @author Michael Becke
* @author Eric E Johnson
+ * @author Laura Werner
*
* @version $Revision$ $Date$
*/
@@ -217,6 +219,7 @@
hostConfiguration.getVirtualHost(),
hostConfiguration.getPort(),
hostConfiguration.getProtocol());
+ this.localAddress = hostConfiguration.getLocalAddress();
}
/**
@@ -446,6 +449,27 @@
}
/**
+ * Return the local address used when creating the connection.
+ * If <tt>null</tt>, the default address is used.
+ *
+ * @return InetAddress the local address to be used when creating Sockets
+ */
+ public InetAddress getLocalAddress() {
+ return this.localAddress;
+ }
+
+ /**
+ * Set the local address used when creating the connection.
+ * If unset or <tt>null</tt>, the default address is used.
+ *
+ * @param localAddress the local address to use
+ */
+ public void setLocalAddress(InetAddress localAddress) {
+ assertNotOpen();
+ this.localAddress = localAddress;
+ }
+
+ /**
* Return <tt>true</tt> if I am connected,
* <tt>false</tt> otherwise.
*
@@ -636,11 +660,19 @@
: protocolInUse.getSocketFactory());
if (connectTimeout == 0) {
- socket = socketFactory.createSocket(host, port);
+ if (localAddress != null) {
+ socket = socketFactory.createSocket(host, port, localAddress, 0);
+ } else {
+ socket = socketFactory.createSocket(host, port);
+ }
} else {
SocketTask task = new SocketTask() {
public void doit() throws IOException {
- setSocket(socketFactory.createSocket(host, port));
+ if (localAddress != null) {
+ setSocket(socketFactory.createSocket(host, port, localAddress, 0));
+ } else {
+ setSocket(socketFactory.createSocket(host, port));
+ }
}
};
TimeoutController.execute(task, connectTimeout);
@@ -1394,4 +1426,7 @@
/** the connection manager that created this connection or null */
private HttpConnectionManager httpConnectionManager;
+
+ /** The local interface on which the connection is created, or null for the default */
+ private InetAddress localAddress;
}
1.12 +11 -34 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.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- SimpleHttpConnectionManager.java 9 Apr 2003 18:37:59 -0000 1.11
+++ SimpleHttpConnectionManager.java 12 May 2003 02:42:42 -0000 1.12
@@ -66,9 +66,6 @@
import java.io.IOException;
import java.io.InputStream;
-import org.apache.commons.httpclient.protocol.Protocol;
-
-
/**
* A connection manager that provides access to a single HttpConnection. This
* manager makes no attempt to provide exclusive access to the contained
@@ -78,7 +75,8 @@
* @author Eric Johnson
* @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
- *
+ * @author Laura Werner
+ *
* @since 2.0
*/
public class SimpleHttpConnectionManager implements HttpConnectionManager {
@@ -106,30 +104,8 @@
public HttpConnection getConnection(
HostConfiguration hostConfiguration, long timeout) {
- Protocol protocol = hostConfiguration.getProtocol();
- String host = hostConfiguration.getHost();
- String virtualHost = hostConfiguration.getVirtualHost();
- int port = hostConfiguration.getPort();
-
if (httpConnection == null) {
-
- if (hostConfiguration.isProxySet()) {
- httpConnection = new HttpConnection(
- hostConfiguration.getProxyHost(),
- hostConfiguration.getProxyPort(),
- host,
- virtualHost,
- port,
- protocol
- );
- } else {
- httpConnection = new HttpConnection(
- host,
- virtualHost,
- port,
- protocol);
- }
-
+ httpConnection = new HttpConnection(hostConfiguration);
} else {
// make sure the host and proxy are correct for this connection
@@ -141,10 +117,11 @@
httpConnection.close();
}
- httpConnection.setHost(host);
- httpConnection.setVirtualHost(virtualHost);
- httpConnection.setPort(port);
- httpConnection.setProtocol(protocol);
+ httpConnection.setHost(hostConfiguration.getHost());
+ httpConnection.setVirtualHost(hostConfiguration.getVirtualHost());
+ httpConnection.setPort(hostConfiguration.getPort());
+ httpConnection.setProtocol(hostConfiguration.getProtocol());
+ httpConnection.setLocalAddress(hostConfiguration.getLocalAddress());
httpConnection.setProxyHost(hostConfiguration.getProxyHost());
httpConnection.setProxyPort(hostConfiguration.getProxyPort());
1.11 +51 -4 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.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- HostConfiguration.java 19 Apr 2003 22:29:31 -0000 1.10
+++ HostConfiguration.java 12 May 2003 02:42:42 -0000 1.11
@@ -65,11 +65,15 @@
import org.apache.commons.httpclient.protocol.Protocol;
+import java.net.InetAddress;
+
/**
*
* @author <a href="mailto:becke@u.washington.edu">Michael Becke</a>
* @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
* @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
+ * @author Laura Werner
+ *
* @since 2.0
*/
public class HostConfiguration implements Cloneable {
@@ -98,6 +102,9 @@
/** True if a proxy server has been set */
private boolean proxySet;
+ /** The local address to use when creating the socket, or null to use the default */
+ private InetAddress localAddress;
+
/**
* Constructor for HostConfiguration.
*/
@@ -112,7 +119,7 @@
this.proxyHost = null;
this.proxyPort = -1;
this.proxySet = false;
-
+ this.localAddress = null;
}
/**
@@ -134,6 +141,7 @@
this.proxyHost = hostConfiguration.getProxyHost();
this.proxyPort = hostConfiguration.getProxyPort();
this.proxySet = hostConfiguration.isProxySet();
+ this.localAddress = hostConfiguration.getLocalAddress();
}
}
@@ -177,6 +185,15 @@
if (!this.protocol.equals(connection.getProtocol())) {
return false;
}
+ if (this.localAddress != null) {
+ if (!this.localAddress.equals(connection.getLocalAddress())) {
+ return false;
+ }
+ } else {
+ if (connection.getLocalAddress() != null) {
+ return false;
+ }
+ }
return true;
} else {
return false;
@@ -389,6 +406,27 @@
}
/**
+ * Set the local address to be used when creating connections.
+ * If this is unset, the default address will be used.
+ * This is useful for specifying the interface to use on multi-homed or clustered systems.
+ *
+ * @param localAddress the local address to use
+ */
+ public synchronized void setLocalAddress(InetAddress localAddress) {
+ this.localAddress = localAddress;
+ }
+
+ /**
+ * Return the local address to be used when creating connections.
+ * If this is unset, the default address should be used.
+ *
+ * @return InetAddress the local address to be used when creating Sockets
+ */
+ public synchronized InetAddress getLocalAddress() {
+ return this.localAddress;
+ }
+
+ /**
* @see java.lang.Object#equals(java.lang.Object)
*/
public synchronized boolean equals(Object o) {
@@ -433,6 +471,15 @@
} else if (config.getProxyHost() != null) {
return false;
}
+ if (localAddress != null) {
+ if (!localAddress.equals(config.getLocalAddress())) {
+ return false;
+ }
+ } else {
+ if (config.getLocalAddress() != null) {
+ return false;
+ }
+ }
// everything matches
return true;
1.76 +10 -5 jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpClient.java
Index: HttpClient.java
===================================================================
RCS file: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpClient.java,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -r1.75 -r1.76
--- HttpClient.java 8 May 2003 18:39:07 -0000 1.75
+++ HttpClient.java 12 May 2003 02:42:42 -0000 1.76
@@ -87,10 +87,10 @@
* @author <a href="mailto:becke@u.washington.edu">Michael Becke</a>
* @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
* @author Sam Maloney
+ * @author Laura Werner
*
* @version $Revision$ $Date$
*/
-
public class HttpClient {
@@ -593,6 +593,11 @@
defaultHostConfiguration.getProxyHost(),
defaultHostConfiguration.getProxyPort()
);
+ }
+ if (methodConfiguration.getLocalAddress() == null
+ && defaultHostConfiguration.getLocalAddress() != null) {
+
+ methodConfiguration.setLocalAddress(defaultHostConfiguration.getLocalAddress());
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org