On Mon, 2013-12-23 at 10:21 +0100, Francois-Xavier Bonnet wrote:
> Hi,
> 
> I am trying to migrate to HttpClient 4.3 and I cannot find a way to do what
> I used to do before with virtual hosts without using any deprecated api.
> My goal is to be able to send a request to a server but using a "Host"
> header with a different server name.
> 
> I am using a HttpClient with cache and calling
> method org.apache.http.client.HttpClient.execute(HttpHost, HttpRequest,
> HttpContext)
> I found 4 different places I can set a host:
> 
>    - as the first parameter of execute method
>    - in the URI of the request

Hi Francois-Xavier

The first parameter represents a physical connection point, that is, the
opposite endpoint of the outgoing connection. The host of the request
URI represents a 'virtual' address and can be just about anything the
target server is willing to accept as a valid host. The latter will end
up in the execution context as the target host attribute  

---
CloseableHttpClient client = HttpClients.createSystem();
HttpHost target = new HttpHost("www.google.com");
HttpGet get = new HttpGet("http://www.google.ru/";);
client.execute(target, get);
---

>    - by calling
>    method org.apache.http.protocol.HttpCoreContext.setTargetHost(HttpHost)

This should produce the same result as above
---
CloseableHttpClient client = HttpClients.createSystem();
HttpHost target = new HttpHost("www.google.com");
HttpGet get = new HttpGet("/");
HttpClientContext context = HttpClientContext.create();
context.setTargetHost(new HttpHost("www.google.ru"));
client.execute(target, get, context);
---

>    - by setting a Host header in the request
> 

This is also valid but may produce side effects as HttpClient may be
unable to match host specific details to the correct host.

> I have tried to debug and it looks like when send a request, the
> destination server is identified by using 1) the one ine the URI 2) the
> first parameter of execute method if no host is set in the uri 3) the
> targetHost in HttpContext. This host is then used to set targetHost is
> HttpContext and to determine the HttpRoute to the destination.
> 
> My problems:
> 
>    - the cookies domains are matched against the targetHost (not the Host
>    header) so the cookies are rejected

As I said if one manually overrides the 'Host' header in the outgoing
request this indeed can happen. In the normal course of request
execution the 'Host' header is generated based on the target host
attribute and cookie domain of origin should be correctly matched. 

>    - the cache key uses the host name in the HttpRoute which is also the
>    targetHost so the cache entries for different virtual hosts on the same
>    server are going to be mixed
> 

This sounds like a bug and should be fixed. 

Oleg



---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org

Reply via email to