[
https://issues.apache.org/jira/browse/HTTPCLIENT-1789?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Oleg Kalnichevski resolved HTTPCLIENT-1789.
-------------------------------------------
Fix Version/s: 5.4-alpha1
(was: Stuck)
Resolution: Fixed
[~sewe] Fixed as a result of the cache protocol layer refactoring in 5.4.x
Oleg
> 200 Response with Vary header does not invalidate cached 404 response without
> -----------------------------------------------------------------------------
>
> Key: HTTPCLIENT-1789
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1789
> Project: HttpComponents HttpClient
> Issue Type: Bug
> Components: HttpCache
> Environment: Tested with the org.apache.httpcomponents.httpclient
> 4.3.6 OSGi bundle distributed by Eclipse Orbit:
> <http://download.eclipse.org/tools/orbit/downloads/drops/R20160520211859/>
> Reporter: Andreas Sewe
> Assignee: Jonathan Moore
> Priority: Minor
> Labels: stuck, volunteers-wanted
> Fix For: 5.4-alpha1
>
>
> While implementing my own {{HttpCacheStorage}} I noticed the following
> problematic cache revalidation behavior. FYI, this behavior also occurs with
> {{BasicHttpCacheStorage}} (created through
> {{CachingHttpClients.createMemoryBound()}}), so it is not caused by my
> {{HttpCacheStorage}} implementation. Consider this sequence of requests and
> responses:
> * {{GET /something HTTP/1.1}}
> * {{Accept: application/json}}
> * {{404 Not Found HTTP/1.1}}
> * {{Cache-Control: max-age=60}}
> This response is cached under the key {{/something}}. After 60 seconds,
> another {{GET}} request is performed and send over the network, as the cached
> {{404}} response is stale.
> * {{GET /something HTTP/1.1}}
> * {{Accept: application/json}}
> * {{200 OK HTTP/1.1}}
> * {{Vary: Accept}}
> * {{Cache-Control: max-age=120}}
> This response is cached under the key
> {{\{Accept:application/json\}/something}} and key {{/something}}’s
> {{variantMap}} is updated to refer to this key. After another 60 seconds, a
> third {{GET}} request is performed which again performs *network I/O* – even
> though it IMHO should not.
> * {{GET /something HTTP/1.1}}
> * {{Accept: application/json}}
> * {{200 OK HTTP/1.1}}
> * {{Vary: Accept}}
> * {{Cache-Control: max-age=120}}
> This re-validation occurs because a stale {{404}} response for {{/something}}
> was cached – although its {{variantMap}} contains a fresh, selectable {{200}}
> response.
> FWIW, [RFC 7234|https://tools.ietf.org/html/rfc7234#page-9] has this to say
> about the subject:
> {quote}
> The stored response with matching selecting header fields is known as
> the selected response.
> If multiple selected responses are available (potentially including
> responses without a Vary header field), the cache will need to choose
> one to use. When a selecting header field has a known mechanism for
> doing so (e.g., qvalues on Accept and similar request header fields),
> that mechanism MAY be used to select preferred responses; of the
> remainder, the most recent response (as determined by the Date header
> field) is used, as per Section 4.
> {quote}
> According to this, the {{200}} response should have been selected, as its
> {{Date}} is newer than the {{404}}'s responses. Instead, another request for
> {{/something}} is send to the server, even though the most recent cache entry
> is still fresh.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org