HTTPCLIENT-1092 If ClientPNames.VIRTUAL_HOST does not provide the port, derive it from the current request.
git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@1125566 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f3e7802196
commit
0e2b207489
|
@ -1,5 +1,8 @@
|
||||||
Changes since 4.1.1
|
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
|
* [HTTPCLIENT-1087] NTLM proxy authentication fails on retry if the underlying connection is closed
|
||||||
as a result of a target authentication failure.
|
as a result of a target authentication failure.
|
||||||
Contributed by Oleg Kalnichevski <olegk at apache.org>
|
Contributed by Oleg Kalnichevski <olegk at apache.org>
|
||||||
|
|
|
@ -100,11 +100,12 @@ public interface ClientPNames {
|
||||||
public static final String COOKIE_POLICY = "http.protocol.cookie-policy";
|
public static final String COOKIE_POLICY = "http.protocol.cookie-policy";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the virtual host name to be used in the <code>Host</code>
|
* Defines the virtual host to be used in the <code>Host</code>
|
||||||
* request header instead of the physical host name.
|
* request header instead of the physical host.
|
||||||
* <p>
|
* <p>
|
||||||
* This parameter expects a value of type {@link org.apache.http.HttpHost}.
|
* This parameter expects a value of type {@link org.apache.http.HttpHost}.
|
||||||
* </p>
|
* </p>
|
||||||
|
* If a port is not provided, it will be derived from the request URL.
|
||||||
*/
|
*/
|
||||||
public static final String VIRTUAL_HOST = "http.virtual-host";
|
public static final String VIRTUAL_HOST = "http.virtual-host";
|
||||||
|
|
||||||
|
|
|
@ -359,6 +359,14 @@ public class DefaultRequestDirector implements RequestDirector {
|
||||||
virtualHost = (HttpHost) orig.getParams().getParameter(
|
virtualHost = (HttpHost) orig.getParams().getParameter(
|
||||||
ClientPNames.VIRTUAL_HOST);
|
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);
|
RoutedRequest roureq = new RoutedRequest(origWrapper, origRoute);
|
||||||
|
|
||||||
boolean reuse = false;
|
boolean reuse = false;
|
||||||
|
|
|
@ -611,6 +611,90 @@ public class TestDefaultClientRequestDirector extends BasicServerTestBase {
|
||||||
Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
|
Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
@Test
|
||||||
public void testDefaultHostAtRequestLevel() throws Exception {
|
public void testDefaultHostAtRequestLevel() throws Exception {
|
||||||
int port = this.localServer.getServiceAddress().getPort();
|
int port = this.localServer.getServiceAddress().getPort();
|
||||||
|
|
|
@ -144,10 +144,12 @@ httpclient.getConnectionManager().shutdown();
|
||||||
<listitem>
|
<listitem>
|
||||||
<formalpara>
|
<formalpara>
|
||||||
<title><constant>ClientPNames.VIRTUAL_HOST</constant>='http.virtual-host':</title>
|
<title><constant>ClientPNames.VIRTUAL_HOST</constant>='http.virtual-host':</title>
|
||||||
<para>defines the virtual host name to be used in the <literal>Host</literal>
|
<para>defines the virtual host settings to be used in the <literal>Host</literal>
|
||||||
header instead of the physical host name. This parameter expects a value of
|
header instead of the physical host. This parameter expects a value of
|
||||||
type <classname>HttpHost</classname>. If this parameter is not set, the name or
|
type <classname>HttpHost</classname>. The HttpHost port does not have to
|
||||||
IP address of the target host will be used.</para>
|
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>
|
</formalpara>
|
||||||
</listitem>
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
|
Loading…
Reference in New Issue