[ 
https://issues.apache.org/jira/browse/HTTPCLIENT-1415?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

kyle leonhard updated HTTPCLIENT-1415:
--------------------------------------

    Description: 
When a response returns a content-location header, flushLocationCacheEntry is 
invoked on the content-location's URL.  flushLocationCacheEntry causes the 
cached entry to be flushed if the entry is older than the response and the 
etags differ.

However, the response and entry ETags are not considered different if either 
ETag header values are null(see:CacheInvalidator.responseAndEntryEtagsDiffer).  
This causes the resource referenced by the response's content-location header 
to remain cached.

I'm not familiar with the HTTP spec, but the responseAndEntryEtagsDiffer, ETag 
null checks seem iffy.

**Relevant code

***From CacheInvalidator.flushInvalidatedCacheEntries:
final URL contentLocation = getContentLocationURL(reqURL, response);
if (contentLocation != null) {
    flushLocationCacheEntry(reqURL, response, contentLocation);
}

***From CacheInvalidator.flushLocationCacheEntry
if (responseDateOlderThanEntryDate(response, entry)) {
   return;
}
if (!responseAndEntryEtagsDiffer(response, entry)) {
    return;
}

***From CacheInvalidator.responseAndEntryEtagsDiffer:
if (entryEtag == null || responseEtag == null) {
    return false;
}

  was:
When a response returns a content-location header, flushLocationCacheEntry is 
invoked on the content-location's URL.  flushLocationCacheEntry causes the 
cached entry to be flushed if the entry is older than the response and the 
etags differ.

However, the response and entry ETags are not considered different if either 
ETag header values are null(see:CacheInvalidator.responseAndEntryEtagsDiffer).

I'm not familiar with the HTTP spec, but the responseAndEntryEtagsDiffer, ETag 
null checks seem iffy.

**Relevant code

***From CacheInvalidator.flushInvalidatedCacheEntries:
final URL contentLocation = getContentLocationURL(reqURL, response);
if (contentLocation != null) {
    flushLocationCacheEntry(reqURL, response, contentLocation);
}

***From CacheInvalidator.flushLocationCacheEntry
if (responseDateOlderThanEntryDate(response, entry)) {
   return;
}
if (!responseAndEntryEtagsDiffer(response, entry)) {
    return;
}

***From CacheInvalidator.responseAndEntryEtagsDiffer:
if (entryEtag == null || responseEtag == null) {
    return false;
}


> Cached entry is not flushed when a response contains a content-location 
> header without an ETag header field
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: HTTPCLIENT-1415
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1415
>             Project: HttpComponents HttpClient
>          Issue Type: Bug
>          Components: HttpCache
>    Affects Versions: 4.3 Final
>         Environment: Windows 7, Tomcat
>            Reporter: kyle leonhard
>
> When a response returns a content-location header, flushLocationCacheEntry is 
> invoked on the content-location's URL.  flushLocationCacheEntry causes the 
> cached entry to be flushed if the entry is older than the response and the 
> etags differ.
> However, the response and entry ETags are not considered different if either 
> ETag header values are 
> null(see:CacheInvalidator.responseAndEntryEtagsDiffer).  This causes the 
> resource referenced by the response's content-location header to remain 
> cached.
> I'm not familiar with the HTTP spec, but the responseAndEntryEtagsDiffer, 
> ETag null checks seem iffy.
> **Relevant code
> ***From CacheInvalidator.flushInvalidatedCacheEntries:
> final URL contentLocation = getContentLocationURL(reqURL, response);
> if (contentLocation != null) {
>     flushLocationCacheEntry(reqURL, response, contentLocation);
> }
> ***From CacheInvalidator.flushLocationCacheEntry
> if (responseDateOlderThanEntryDate(response, entry)) {
>    return;
> }
> if (!responseAndEntryEtagsDiffer(response, entry)) {
>     return;
> }
> ***From CacheInvalidator.responseAndEntryEtagsDiffer:
> if (entryEtag == null || responseEtag == null) {
>     return false;
> }



--
This message was sent by Atlassian JIRA
(v6.1#6144)

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

Reply via email to