You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by se...@apache.org on 2011/05/20 22:51:24 UTC

svn commit: r1125566 - in /httpcomponents/httpclient/trunk: ./ httpclient/src/main/java/org/apache/http/client/params/ httpclient/src/main/java/org/apache/http/impl/client/ httpclient/src/test/java/org/apache/http/impl/client/ src/docbkx/

Author: sebb
Date: Fri May 20 20:51:24 2011
New Revision: 1125566

URL: http://svn.apache.org/viewvc?rev=1125566&view=rev
Log:
HTTPCLIENT-1092 If ClientPNames.VIRTUAL_HOST does not provide the port, derive it from the current request.

Modified:
    httpcomponents/httpclient/trunk/RELEASE_NOTES.txt
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/params/ClientPNames.java
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java
    httpcomponents/httpclient/trunk/src/docbkx/httpagent.xml

Modified: httpcomponents/httpclient/trunk/RELEASE_NOTES.txt
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/RELEASE_NOTES.txt?rev=1125566&r1=1125565&r2=1125566&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/RELEASE_NOTES.txt (original)
+++ httpcomponents/httpclient/trunk/RELEASE_NOTES.txt Fri May 20 20:51:24 2011
@@ -1,5 +1,8 @@
 Changes since 4.1.1
 
+* [HTTPCLIENT-1092] If ClientPNames.VIRTUAL_HOST does not provide the port, derive it from the current request.
+  Contributed by Sebastian Bazley <sebb at apache.org>
+
 * [HTTPCLIENT-1087] NTLM proxy authentication fails on retry if the underlying connection is closed
   as a result of a target authentication failure.
   Contributed by Oleg Kalnichevski <olegk at apache.org>

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/params/ClientPNames.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/params/ClientPNames.java?rev=1125566&r1=1125565&r2=1125566&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/params/ClientPNames.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/params/ClientPNames.java Fri May 20 20:51:24 2011
@@ -100,11 +100,12 @@ public interface ClientPNames {
     public static final String COOKIE_POLICY = "http.protocol.cookie-policy";
 
     /**
-     * Defines the virtual host name to be used in the <code>Host</code>
-     * request header instead of the physical host name.
+     * Defines the virtual host to be used in the <code>Host</code>
+     * request header instead of the physical host.
      * <p>
      * This parameter expects a value of type {@link org.apache.http.HttpHost}.
      * </p>
+     * If a port is not provided, it will be derived from the request URL.
      */
     public static final String VIRTUAL_HOST = "http.virtual-host";
 

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java?rev=1125566&r1=1125565&r2=1125566&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/impl/client/DefaultRequestDirector.java Fri May 20 20:51:24 2011
@@ -358,6 +358,14 @@ public class DefaultRequestDirector impl
 
         virtualHost = (HttpHost) orig.getParams().getParameter(
                 ClientPNames.VIRTUAL_HOST);
+        
+        // HTTPCLIENT-1092 - add the port if necessary
+        if (virtualHost != null && virtualHost.getPort() == -1) {
+            int port = target.getPort();
+            if (port != -1){
+                virtualHost = new HttpHost(virtualHost.getHostName(), port, virtualHost.getSchemeName());
+            }
+        }
 
         RoutedRequest roureq = new RoutedRequest(origWrapper, origRoute);
 

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java?rev=1125566&r1=1125565&r2=1125566&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/impl/client/TestDefaultClientRequestDirector.java Fri May 20 20:51:24 2011
@@ -612,6 +612,90 @@ public class TestDefaultClientRequestDir
     }
 
     @Test
+    public void testDefaultHostHeader() throws Exception {
+        int port = this.localServer.getServiceAddress().getPort();
+        this.localServer.register("*", new SimpleService());
+
+        HttpContext context = new BasicHttpContext();
+
+        String s = "http://localhost:" + port;
+        HttpGet httpget = new HttpGet(s);
+
+        DefaultHttpClient client = new DefaultHttpClient();
+        HttpResponse response = client.execute(getServerHttp(), httpget, context);
+        EntityUtils.consume(response.getEntity());
+
+        HttpRequest reqWrapper = (HttpRequest) context.getAttribute(
+                ExecutionContext.HTTP_REQUEST);
+
+        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+        // Check that Host header is generated as expected
+        Header[] headers = reqWrapper.getHeaders("host");
+        Assert.assertNotNull(headers);
+        Assert.assertEquals(1, headers.length);
+        Assert.assertEquals("localhost:"+port,headers[0].getValue());
+    }
+
+    @Test
+    // HTTPCLIENT-1092
+    public void testVirtualHostHeader() throws Exception {
+        int port = this.localServer.getServiceAddress().getPort();
+        this.localServer.register("*", new SimpleService());
+
+        HttpContext context = new BasicHttpContext();
+
+        String s = "http://localhost:" + port;
+        HttpGet httpget = new HttpGet(s);
+
+        DefaultHttpClient client = new DefaultHttpClient();
+        String virtHost = "virtual";
+        httpget.getParams().setParameter(ClientPNames.VIRTUAL_HOST, new HttpHost(virtHost, port));
+        HttpResponse response = client.execute(getServerHttp(), httpget, context);
+        EntityUtils.consume(response.getEntity());
+
+        HttpRequest reqWrapper = (HttpRequest) context.getAttribute(
+                ExecutionContext.HTTP_REQUEST);
+
+        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+        // Check that Host header is generated as expected
+        Header[] headers = reqWrapper.getHeaders("host");
+        Assert.assertNotNull(headers);
+        Assert.assertEquals(1, headers.length);
+        Assert.assertEquals(virtHost+":"+port,headers[0].getValue());
+    }
+
+    @Test
+    // Test that virtual port is propagated if provided
+    // This is not expected to be used much, if ever
+    // HTTPCLIENT-1092
+    public void testVirtualHostPortHeader() throws Exception {
+        int port = this.localServer.getServiceAddress().getPort();
+        this.localServer.register("*", new SimpleService());
+
+        HttpContext context = new BasicHttpContext();
+
+        String s = "http://localhost:" + port;
+        HttpGet httpget = new HttpGet(s);
+
+        DefaultHttpClient client = new DefaultHttpClient();
+        String virtHost = "virtual";
+        int virtPort = 9876;
+        httpget.getParams().setParameter(ClientPNames.VIRTUAL_HOST, new HttpHost(virtHost, virtPort));
+        HttpResponse response = client.execute(getServerHttp(), httpget, context);
+        EntityUtils.consume(response.getEntity());
+
+        HttpRequest reqWrapper = (HttpRequest) context.getAttribute(
+                ExecutionContext.HTTP_REQUEST);
+
+        Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
+        // Check that Host header is generated as expected
+        Header[] headers = reqWrapper.getHeaders("host");
+        Assert.assertNotNull(headers);
+        Assert.assertEquals(1, headers.length);
+        Assert.assertEquals(virtHost+":"+virtPort,headers[0].getValue());
+    }
+
+    @Test
     public void testDefaultHostAtRequestLevel() throws Exception {
         int port = this.localServer.getServiceAddress().getPort();
         this.localServer.register("*", new SimpleService());

Modified: httpcomponents/httpclient/trunk/src/docbkx/httpagent.xml
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/src/docbkx/httpagent.xml?rev=1125566&r1=1125565&r2=1125566&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/src/docbkx/httpagent.xml (original)
+++ httpcomponents/httpclient/trunk/src/docbkx/httpagent.xml Fri May 20 20:51:24 2011
@@ -144,10 +144,12 @@ httpclient.getConnectionManager().shutdo
             <listitem>
                 <formalpara>
                     <title><constant>ClientPNames.VIRTUAL_HOST</constant>='http.virtual-host':</title>
-                    <para>defines the virtual host name to be used in the <literal>Host</literal>
-                        header instead of the physical host name. This parameter expects a value of
-                        type <classname>HttpHost</classname>. If this parameter is not set, the name or
-                        IP address of the target host will be used.</para>
+                    <para>defines the virtual host settings to be used in the <literal>Host</literal>
+                        header instead of the physical host. This parameter expects a value of
+                        type <classname>HttpHost</classname>. The HttpHost port does not have to
+                        be specified as it will be derived from the target.
+                        If this parameter is not set, the name or
+                        IP address (and port if required) of the target host will be used.</para>
                 </formalpara>
             </listitem>
             <listitem>