More investigation. The problem seems to arise in BasicHttpCache:
void storeVariantEntry(
final HttpHost target,
final HttpRequest req,
final HttpCacheEntry entry) throws IOException {
final String parentURI = uriExtractor.getURI(target, req);
final String variantURI = uriExtractor.getVariantURI(target, req,
entry);
storage.putEntry(variantURI, entry);
HttpCacheUpdateCallback callback = new HttpCacheUpdateCallback() {
public HttpCacheEntry update(HttpCacheEntry existing) throws
IOException {
return doGetUpdatedParentEntry(
req.getRequestLine().getUri(), existing, entry,
uriExtractor.getVariantKey(req, entry),
variantURI);
}
};
try {
storage.updateEntry(parentURI, callback);
} catch (HttpCacheUpdateException e) {
log.warn("Could not update key [" + parentURI + "]", e);
}
}
the variantURI and parentURI are different. In my storage implementation my
updateEntry looks like:
@Override
public void updateEntry(String arg0, HttpCacheUpdateCallback arg1) throws
IOException, HttpCacheUpdateException {
try {
SurespotLog.v(TAG, "updating entry, url: " + arg0);
putEntry(arg0, arg1.update(getEntry(arg0)));
}
catch (Exception e) {
SurespotLog.w(TAG, "updateEntry", e);
}
}
so it ended up adding 2 entries in my cache, one for the parentURI and one
for the variantURI which had the prepended {Accept-Encoding=}.
My updateEntry implementation is probably flawed in that I should get the
entry and check it exists before blindly updating it, but I am curious as
to why BasicHttpCache would put the entry with one key and update the entry
with a different key?
Thanks,
Adam
On Thu, Apr 11, 2013 at 12:12 PM, Adam Patacchiola <[email protected]> wrote:
> I have done some more research on this and it appears that the caching is
> working, however it is adding 2 entries to the backing cache: one each with
> and without the url pre-pended by {Accept-Encoding=}. This results in a
> cache miss for the get with the pre-pended url, and uses double the storage
> space in whatever mechanism you are backing the client with. There was a
> bug in my backing store which led to me initially believing it was not
> caching the (correct) url.
>
> tl;dr it is caching but adding a duplicate invalid entry that never gets
> hit.
>
>
>
>
>
>
> On Thu, Apr 11, 2013 at 10:13 AM, Adam Patacchiola <[email protected]>wrote:
>
>> I'm using 4.2.3 with gzip compression and CachingHttpClient. Initially I
>> implemented the custom request/response interceptors as described here:
>> https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java
>> which
>> did not work, resulting in the issue described here:
>> https://issues.apache.org/jira/browse/HTTPCLIENT-1163.
>>
>>
>>
>> It appeared to me from reading this issue that using the
>> "CompressionDecorator" would resolve the issue so I modified my code to use
>> DecompressingHttpClient (
>> https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/DecompressingHttpClient.html)
>> but the issue still persists as we can see from the below log output. It is
>> caching using one (broken?) key but then looking it up using a different
>> (correct?) key which is consistent with the bug above:
>>
>> 04-11 09:32:54.760: ... putting cache entry, url: {Accept-Encoding=}
>> https://www.surespot.me:8080/images/b:f1/165
>> 04-11 09:32:55.965: ... Cache miss [host: https://www.surespot.me:8080;
>> uri: https://www.surespot.me:8080/images/b:f1/165]
>>
>> Am I missing something or is this still broken?
>>
>> Thanks,
>>
>> Adam
>>
>
>