diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java index 9a1e0ae6532..dd5f26e8fb4 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/HttpExchange.java @@ -97,6 +97,8 @@ public class HttpExchange private HttpEventListener _listener = new Listener(); private volatile HttpConnection _connection; + private Address _localAddress = null; + // a timeout for this exchange private long _timeout = -1; @@ -408,6 +410,19 @@ public class HttpExchange return _address; } + /** + * the local address used by the connection + * + * Note: this method will not be populated unless the exchange + * has been executed by the HttpClient + * + * @return the local address used for the running of the exchange if available, null otherwise. + */ + public Address getLocalAddress() + { + return _localAddress; + } + /** * @param scheme the scheme of the URL (for example 'http') */ @@ -660,6 +675,11 @@ public class HttpExchange void associate(HttpConnection connection) { + if ( connection.getEndPoint().getLocalHost() != null ) + { + _localAddress = new Address( connection.getEndPoint().getLocalHost(), connection.getEndPoint().getLocalPort() ); + } + _connection = connection; if (getStatus() == STATUS_CANCELLING) abort(); @@ -699,6 +719,8 @@ public class HttpExchange */ protected void onRequestCommitted() throws IOException { + _connection.getEndPoint(); + } /** diff --git a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpExchangeTest.java b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpExchangeTest.java index 6c3c249d8ae..46e2523fa94 100644 --- a/jetty-client/src/test/java/org/eclipse/jetty/client/HttpExchangeTest.java +++ b/jetty-client/src/test/java/org/eclipse/jetty/client/HttpExchangeTest.java @@ -261,6 +261,29 @@ public class HttpExchangeTest extends TestCase } } + public void testLocalAddressAvailabilityWithContentExchange() throws Exception + { + for (int i=0;i<10;i++) + { + ContentExchange httpExchange=new ContentExchange(); + httpExchange.setURL(_scheme+"localhost:"+_port+"/?i="+i); + httpExchange.setMethod(HttpMethods.GET); + _httpClient.send(httpExchange); + int status = httpExchange.waitForDone(); + + assertNotNull(httpExchange.getLocalAddress()); + + //System.out.println("Local Address: " + httpExchange.getLocalAddress()); + + //httpExchange.waitForStatus(HttpExchange.STATUS_COMPLETED); + String result=httpExchange.getResponseContent(); + assertEquals("i="+i,0,result.indexOf("")); + assertEquals("i="+i,result.length()-10,result.indexOf("")); + assertEquals(HttpExchange.STATUS_COMPLETED, status); + Thread.sleep(5); + } + } + public void testShutdownWithExchange() throws Exception { final AtomicReference throwable=new AtomicReference();