You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by "Nicolas Richeton (JIRA)" <ji...@apache.org> on 2013/08/09 09:48:48 UTC
[jira] [Comment Edited] (HTTPCLIENT-1384) Expose CacheInvalidator
in CachingHttpClientBuilder
[ https://issues.apache.org/jira/browse/HTTPCLIENT-1384?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13723948#comment-13723948 ]
Nicolas Richeton edited comment on HTTPCLIENT-1384 at 8/9/13 7:47 AM:
----------------------------------------------------------------------
Here is the failing unit test for TestProtocolRecommandations :
@Test
public void testCacheNotInvalidatedOnError() throws Exception {
final HttpRequestWrapper req1 = HttpRequestWrapper.wrap(new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1));
final HttpResponse resp1 = HttpTestUtils.make200Response();
resp1.setHeader("Cache-Control", "max-age=3600");
backendExpectsAnyRequestAndReturn(resp1);
final HttpRequestWrapper req1_2 = HttpRequestWrapper
.wrap(new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1));
// No call to backend expected : served from cache
final HttpRequestWrapper req2 = HttpRequestWrapper
.wrap(new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1));
// Returns an error : shoud not invalidate cache
final HttpResponse resp2 = HttpTestUtils.make500Response();
backendExpectsAnyRequestAndReturn(resp2);
final HttpRequestWrapper req3 = HttpRequestWrapper.wrap(new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1));
// No call to backend expected : served from cache
replayMocks();
final HttpResponse result1 = impl.execute(route, req1, context, null);
final HttpResponse result1_2 = impl.execute(route, req1_2, context, null);
impl.execute(route, req2, context, null);
// Will fail with NPE if request is sent to backend
final HttpResponse result3 = impl.execute(route, req3, context, null);
verifyMocks();
// Ensure comparing results works
assertTrue(HttpTestUtils.semanticallyTransparent(result1, result1));
// Ensure cached before POST w/ error
assertTrue(HttpTestUtils.semanticallyTransparent(result1, result1_2));
//Ensure cached after POST w/ error
assertTrue(HttpTestUtils.semanticallyTransparent(result1, result3));
}
was (Author: nricheton):
Here is the failing unit test for TestProtocolRecommandations :
@Test
public void testCacheNotInvalidatedOnError() throws Exception {
final HttpRequestWrapper req1 = HttpRequestWrapper.wrap(new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1));
final HttpResponse resp1 = HttpTestUtils.make200Response();
resp1.setHeader("Cache-Control", "max-age=3600");
backendExpectsAnyRequestAndReturn(resp1);
final HttpRequestWrapper req1_2 = HttpRequestWrapper
.wrap(new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1));
// No call to backend expected : served from cache
final HttpRequestWrapper req2 = HttpRequestWrapper
.wrap(new BasicHttpRequest("POST", "/", HttpVersion.HTTP_1_1));
// Returns an error : shoud not invalidate cache
final HttpResponse resp2 = HttpTestUtils.make500Response();
backendExpectsAnyRequestAndReturn(resp2);
final HttpRequestWrapper req3 = HttpRequestWrapper.wrap(new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1));
// No call to backend expected : served from cache
replayMocks();
final HttpResponse result1 = impl.execute(route, req1, context, null);
final HttpResponse result1_2 = impl.execute(route, req1_2, context, null);
impl.execute(route, req2, context, null);
// Will fail with NPE is request is sent to backend.
final HttpResponse result3 = impl.execute(route, req3, context, null);
verifyMocks();
assertTrue(HttpTestUtils.semanticallyTransparent(result1, result1));
assertTrue(HttpTestUtils.semanticallyTransparent(result1, result1_2));
assertTrue(HttpTestUtils.semanticallyTransparent(result1, result3));
}
> Expose CacheInvalidator in CachingHttpClientBuilder
> ---------------------------------------------------
>
> Key: HTTPCLIENT-1384
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1384
> Project: HttpComponents HttpClient
> Issue Type: Wish
> Components: HttpCache
> Affects Versions: 4.2.5, 4.3 Beta2
> Reporter: Nicolas Richeton
> Fix For: 4.3 Final
>
>
> There is currently no way to customize the CacheInvalidator. Could it be possible to allow setting a CacheInvalidator in CachingHttpClientBuilder (eg. CachingHttpClientBuilder#setCacheInvalidator())
> Our use case :
> - HttpClientCache is used in a Caching Reverse Proxy (shared cache, exposed to public connections)
> - We have to ensure the cache cannot be flush by a random user.
> - The default CacheInvalidator flushes all variants of an URI when receiving anything other than GET, HEAD (compliant with RFC)
> - It is currently possible for a user to flush the whole cache by sending POST requests of all uri (this may be harmful even only on a home page).
> While it is not RFC-compliant, we need at least the ability to prevent invalidation in CacheInvalidator#flushInvalidatedCacheEntriesFor and/or control invalidation with custom method (PURGE) and other criteria (like remote ip)
> The same applies to HttpClientCache 4.2.5: CachingHttpClient which does not allow provide a custom CacheInvalidator
> Would this sound ok for you ?
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org