private void decrementOPTIONSMaxForwardsIfGreaterThen0(final HttpRequest request) { if (!HeaderConstants.OPTIONS_METHOD.equals(request.getMethod())) { return; } final Header maxForwards = request.getFirstHeader(HeaderConstants.MAX_FORWARDS); if (maxForwards == null) { return; } request.removeHeaders(HeaderConstants.MAX_FORWARDS); final int currentMaxForwards = Integer.parseInt(maxForwards.getValue()); request.setHeader(HeaderConstants.MAX_FORWARDS, Integer.toString(currentMaxForwards - 1)); }
@Test public void testDoesNotInvalidateRequestsWithClientCacheControlHeaders() throws Exception { final HttpRequest request = new BasicHttpRequest("GET","/"); request.setHeader("Cache-Control","no-cache"); impl.flushCacheEntriesInvalidatedByRequest(host, request, cacheKeyResolver, mockStorage, operationCallback); verify(mockStorage).getEntry(ArgumentMatchers.eq("http://foo.example.com:80/"), ArgumentMatchers.<FutureCallback<HttpCacheEntry>>any()); verifyNoMoreInteractions(mockStorage); }
@Test public void testDoesNotInvalidateRequestsWithClientPragmaHeaders() throws Exception { final HttpRequest request = new BasicHttpRequest("GET","/"); request.setHeader("Pragma","no-cache"); impl.flushCacheEntriesInvalidatedByRequest(host, request, cacheKeyResolver, mockStorage, operationCallback); verify(mockStorage).getEntry(ArgumentMatchers.eq("http://foo.example.com:80/"), ArgumentMatchers.<FutureCallback<HttpCacheEntry>>any()); verifyNoMoreInteractions(mockStorage); }
@Test public void testDoesNotInvalidateRequestsWithClientCacheControlHeaders() throws Exception { final HttpRequest request = new BasicHttpRequest("GET","/"); request.setHeader("Cache-Control","no-cache"); impl.flushCacheEntriesInvalidatedByRequest(host, request, cacheKeyResolver, mockStorage); verify(mockStorage).getEntry("http://foo.example.com:80/"); verifyNoMoreInteractions(mockStorage); }
@Test public void testRequestWithWeekETagForPUTOrDELETEIfMatch() throws Exception { final HttpRequest req = new BasicHttpRequest("PUT", "http://example.com/"); req.setHeader("If-Match", "W/\"weak\""); assertEquals(1, impl.requestIsFatallyNonCompliant(req).size()); }
@Test public void testRequestContainsNoCacheDirectiveWithFieldName() throws Exception { final HttpRequest req = new BasicHttpRequest("GET", "/"); req.setHeader("Cache-Control", "no-cache=false"); assertEquals(1, impl.requestIsFatallyNonCompliant(req).size()); }
@Test public void testRequestWithWeekETagForPUTOrDELETEIfMatchAllowed() throws Exception { final HttpRequest req = new BasicHttpRequest("PUT", "http://example.com/"); req.setHeader("If-Match", "W/\"weak\""); impl = new RequestProtocolCompliance(true); assertEquals(Arrays.asList(), impl.requestIsFatallyNonCompliant(req)); }
@Test public void testResponsesToRequestsWithNoStoreAreNotCacheable() { request.setHeader("Cache-Control","no-store"); response.setHeader("Cache-Control","public"); Assert.assertFalse(policy.isResponseCacheable(request,response)); }
@Test public void testAuthorizedResponsesWithCacheControlPublicAreCacheable() { request = new BasicHttpRequest("GET","/"); request.setHeader("Authorization","Basic dXNlcjpwYXNzd2Q="); response.setHeader("Cache-Control","public"); Assert.assertTrue(policy.isResponseCacheable(request,response)); }
@Test public void testAuthorizedResponsesWithCacheControlMaxAgeAreNotCacheable() { request = new BasicHttpRequest("GET","/"); request.setHeader("Authorization","Basic dXNlcjpwYXNzd2Q="); response.setHeader("Cache-Control","max-age=3600"); Assert.assertFalse(policy.isResponseCacheable(request,response)); }
@Test public void testVaryStarIsNotCacheableUsingSharedPublicCache() { policy = new ResponseCachingPolicy(0, true, false, false); request.setHeader("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); response.setHeader("Cache-Control", "public"); response.setHeader("Vary", "*"); Assert.assertFalse(policy.isResponseCacheable(request, response)); }
@Test public void test206ResponseCodeIsNotCacheableUsingSharedPublicCache() { policy = new ResponseCachingPolicy(0, true, false, false); request.setHeader("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); response.setCode(HttpStatus.SC_PARTIAL_CONTENT); response.setHeader("Cache-Control", "public"); Assert.assertFalse(policy.isResponseCacheable(request, response)); }
@Test public void correctlyStripsMinFreshFromMiddleIfNoCache() throws Exception { final HttpRequest req = new BasicHttpRequest("GET", "/"); req.setHeader("Cache-Control", "no-cache,min-fresh=10,no-store"); final HttpRequest wrapper = RequestCopier.INSTANCE.copy(req); impl.makeRequestCompliant(wrapper); assertEquals("no-cache,no-store", wrapper.getFirstHeader("Cache-Control").getValue()); }
@Test public void testResponsesWithMultipleAgeHeadersAreNotCacheableUsingSharedPublicCache() { policy = new ResponseCachingPolicy(0, true, false, false); request.setHeader("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); response.setHeader("Cache-Control", "public"); response.addHeader("Age", "3"); response.addHeader("Age", "5"); Assert.assertFalse(policy.isResponseCacheable(request, response)); }
@Test public void stripsMaxAgeFromRequestIfNoCachePresent() throws Exception { final HttpRequest req = new BasicHttpRequest("GET", "/"); req.setHeader("Cache-Control", "no-cache, max-age=10"); final HttpRequest wrapper = RequestCopier.INSTANCE.copy(req); impl.makeRequestCompliant(wrapper); assertEquals("no-cache", wrapper.getFirstHeader("Cache-Control").getValue()); }
@Test public void doesNotStripMinFreshFromRequestWithoutNoCache() throws Exception { final HttpRequest req = new BasicHttpRequest("GET", "/"); req.setHeader("Cache-Control", "min-fresh=10"); final HttpRequest wrapper = RequestCopier.INSTANCE.copy(req); impl.makeRequestCompliant(wrapper); assertEquals("min-fresh=10", wrapper.getFirstHeader("Cache-Control").getValue()); }
@Test public void testMayReturnStaleIfErrorInRequestIsTrueWithinStaleness(){ final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatDate(tenSecondsAgo)), new BasicHeader("Cache-Control", "max-age=5") }; final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers); final HttpRequest req = new BasicHttpRequest("GET","/"); req.setHeader("Cache-Control","stale-if-error=15"); assertTrue(impl.mayReturnStaleIfError(req, entry, now)); }
@Test public void testMayNotReturnStaleIfErrorInResponseAndAfterRequestWindow(){ final Header[] headers = new Header[] { new BasicHeader("Date", DateUtils.formatDate(tenSecondsAgo)), new BasicHeader("Cache-Control", "max-age=5") }; final HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(now, now, headers); final HttpRequest req = new BasicHttpRequest("GET","/"); req.setHeader("Cache-Control","stale-if-error=1"); assertFalse(impl.mayReturnStaleIfError(req, entry, now)); }
@Test public void testResponsesWithMultipleDateHeadersAreNotCacheableUsingSharedPublicCache() { policy = new ResponseCachingPolicy(0, true, false, false); request.setHeader("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); response.setHeader("Cache-Control", "public"); response.addHeader("Date", DateUtils.formatDate(now)); response.addHeader("Date", DateUtils.formatDate(sixSecondsAgo)); Assert.assertFalse(policy.isResponseCacheable(request, response)); }
@Test public void testResponsesWithMultipleExpiresHeadersAreNotCacheableUsingSharedPublicCache() { policy = new ResponseCachingPolicy(0, true, false, false); request.setHeader("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); response.setHeader("Cache-Control", "public"); response.addHeader("Expires", DateUtils.formatDate(now)); response.addHeader("Expires", DateUtils.formatDate(sixSecondsAgo)); Assert.assertFalse(policy.isResponseCacheable(request, response)); }