Joseph Walton created HTTPCLIENT-1542:
-----------------------------------------

             Summary: Caching HttpClients uses absolute URIs for validation
                 Key: HTTPCLIENT-1542
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1542
             Project: HttpComponents HttpClient
          Issue Type: Bug
          Components: HttpCache
    Affects Versions: 4.3.5
            Reporter: Joseph Walton


{{HttpClient}} instances constructed through {{CachingHttpClients}} use 
absolute URIs when validating a resource.

I'm constructing a caching {{HttpClient}} and requesting a resource that has a 
{{Cache-Control}} allowing for caching. Subsequent requests are served from the 
cache. On the first attempt to validate it, the absolute URI is passed rather 
than the relative URI that appeared in the original request.

As with HTTPCLIENT-1447, this absolute URI is forbidden by the current HTTP RFC 
(RFC 7230, 5.3.1). (The spec also states that this only causes problems for a 
non-compliant server. I have one of those.)

The example here uses {{Cache-control: max-age=0}} to force immediate 
validation.

{noformat:title=Request}
GET /resource HTTP/1.1
Host: localhost:50732
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.3.5 (java 1.5)
Accept-Encoding: gzip,deflate
Via: 1.1 localhost (Apache-HttpClient/4.3.5 (cache))
{noformat}

{noformat:title=Response}
HTTP/1.1 200 OK
Cache-control: max-age=0
Content-type: text/plain
Content-length: 16
Date: Thu, 14 Aug 2014 09:17:46 GMT

XXXXXXXXXXXXXXXX
{noformat}

{noformat:title=Request}
GET http://localhost:50732/resource HTTP/1.1
Host: localhost:50732
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.3.5 (java 1.5)
Accept-Encoding: gzip,deflate
Via: 1.1 localhost (Apache-HttpClient/4.3.5 (cache))
{noformat}

{noformat:title=Response}
HTTP/1.1 200 OK
Cache-control: max-age=0
Content-type: text/plain
Content-length: 16
Date: Thu, 14 Aug 2014 09:17:46 GMT

XXXXXXXXXXXXXXXX
{noformat}


The {{rewriteRequestURI}} method in {{ProtocolExec}} would fix this, but this 
is added after {{decorateMainExec}} adds the caching layer, so the 
{{CachingExec}}'s backend, used for validation, doesn't include that processing 
step.
As a simple fix, renaming {{decorateMainExec}} to {{decorateProtocolExec}} in 
{{CachingHttpClientBuilder}} ensures that the underlying backend carries out 
this transformation.
However, this means that the validation requests will also participate in 
content decoding and cookie handling. A better fix may be to move 
{{rewriteRequestURI}} into {{MainClientExec}}.



--
This message was sent by Atlassian JIRA
(v6.2#6252)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to