public void saveContent(final File file) throws IOException { assertNotConsumed(); final int status = response.getCode(); if (status >= HttpStatus.SC_REDIRECTION) { throw new HttpResponseException(status, response.getReasonPhrase()); } try (FileOutputStream out = new FileOutputStream(file)) { final HttpEntity entity = this.response.getEntity(); if (entity != null) { entity.writeTo(out); } } finally { this.consumed = true; } }
public static boolean semanticallyTransparent( final ClassicHttpResponse r1, final ClassicHttpResponse r2) throws Exception { final boolean entitiesEquivalent = equivalent(r1.getEntity(), r2.getEntity()); if (!entitiesEquivalent) { return false; } final boolean statusLinesEquivalent = LangUtils.equals(r1.getReasonPhrase(), r2.getReasonPhrase()) && r1.getCode() == r2.getCode(); if (!statusLinesEquivalent) { return false; } return isEndToEndHeaderSubset(r1, r2); }
@Test public void testStaleIfErrorInResponseYieldsToMustRevalidate() throws Exception{ final Date tenSecondsAgo = new Date(new Date().getTime() - 10 * 1000L); final ClassicHttpRequest req1 = HttpTestUtils.makeDefaultRequest(); final ClassicHttpResponse resp1 = HttpTestUtils.make200Response(tenSecondsAgo, "public, max-age=5, stale-if-error=60, must-revalidate"); backendExpectsAnyRequestAndReturn(resp1); final ClassicHttpRequest req2 = HttpTestUtils.makeDefaultRequest(); final ClassicHttpResponse resp2 = HttpTestUtils.make500Response(); backendExpectsAnyRequestAndReturn(resp2); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); assertTrue(HttpStatus.SC_OK != result.getCode()); }
@Test public void testIfOnlyIfCachedAndNoCacheEntryBackendNotCalled() throws Exception { impl = createCachingExecChain(new BasicHttpCache(), CacheConfig.DEFAULT); request.addHeader("Cache-Control", "only-if-cached"); final ClassicHttpResponse resp = execute(request); Assert.assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, resp.getCode()); }
@Test public void testSubrangeGETWithWeakETagIsNotAllowed() throws Exception { request = new BasicClassicHttpRequest("GET", "/"); request.setHeader("Range", "bytes=0-500"); request.setHeader("If-Range", "W/\"etag\""); final ClassicHttpResponse response = testRequestWithWeakETagValidatorIsNotAllowed("If-Range"); Assert.assertTrue(response.getCode() == HttpStatus.SC_BAD_REQUEST); }
@Test public void testStaleIfErrorInResponseYieldsToExplicitFreshnessRequest() throws Exception{ final Date tenSecondsAgo = new Date(new Date().getTime() - 10 * 1000L); final ClassicHttpRequest req1 = HttpTestUtils.makeDefaultRequest(); final ClassicHttpResponse resp1 = HttpTestUtils.make200Response(tenSecondsAgo, "public, max-age=5, stale-if-error=60"); backendExpectsAnyRequestAndReturn(resp1); final ClassicHttpRequest req2 = HttpTestUtils.makeDefaultRequest(); req2.setHeader("Cache-Control","min-fresh=2"); final ClassicHttpResponse resp2 = HttpTestUtils.make500Response(); backendExpectsAnyRequestAndReturn(resp2); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); assertTrue(HttpStatus.SC_OK != result.getCode()); }
@Test public void testMustIncludeAllowHeaderFromAnOrigin405Response() throws Exception { originResponse = new BasicClassicHttpResponse(405, "Method Not Allowed"); originResponse.setHeader("Allow", "GET, HEAD"); backendExpectsAnyRequest().andReturn(originResponse); replayMocks(); final ClassicHttpResponse result = execute(request); if (result.getCode() == 405) { Assert.assertNotNull(result.getFirstHeader("Allow")); } verifyMocks(); }
private void testDoesNotReturnStaleResponseOnError(final ClassicHttpRequest req2) throws Exception { final ClassicHttpRequest req1 = requestToPopulateStaleCacheEntry(); backendExpectsAnyRequest().andThrow(new IOException()); replayMocks(); execute(req1); ClassicHttpResponse result = null; try { result = execute(req2); } catch (final IOException acceptable) { } verifyMocks(); if (result != null) { assertFalse(result.getCode() == HttpStatus.SC_OK); } }
@Test public void testStaleIfErrorInResponseYieldsToProxyRevalidateForSharedCache() throws Exception{ assertTrue(config.isSharedCache()); final Date tenSecondsAgo = new Date(new Date().getTime() - 10 * 1000L); final ClassicHttpRequest req1 = HttpTestUtils.makeDefaultRequest(); final ClassicHttpResponse resp1 = HttpTestUtils.make200Response(tenSecondsAgo, "public, max-age=5, stale-if-error=60, proxy-revalidate"); backendExpectsAnyRequestAndReturn(resp1); final ClassicHttpRequest req2 = HttpTestUtils.makeDefaultRequest(); final ClassicHttpResponse resp2 = HttpTestUtils.make500Response(); backendExpectsAnyRequestAndReturn(resp2); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); assertTrue(HttpStatus.SC_OK != result.getCode()); }
@Test public void testMustIncludeWWWAuthenticateHeaderOnAnOrigin401Response() throws Exception { originResponse = new BasicClassicHttpResponse(401, "Unauthorized"); originResponse.setHeader("WWW-Authenticate", "x-scheme x-param"); EasyMock.expect( mockExecChain.proceed( EasyMock.isA(ClassicHttpRequest.class), EasyMock.isA(ExecChain.Scope.class))).andReturn(originResponse); replayMocks(); final ClassicHttpResponse result = execute(request); if (result.getCode() == 401) { Assert.assertNotNull(result.getFirstHeader("WWW-Authenticate")); } verifyMocks(); }
@Test public void testMustIncludeProxyAuthenticateHeaderFromAnOrigin407Response() throws Exception { originResponse = new BasicClassicHttpResponse(407, "Proxy Authentication Required"); originResponse.setHeader("Proxy-Authenticate", "x-scheme x-param"); EasyMock.expect( mockExecChain.proceed( EasyMock.isA(ClassicHttpRequest.class), EasyMock.isA(ExecChain.Scope.class))).andReturn(originResponse); replayMocks(); final ClassicHttpResponse result = execute(request); if (result.getCode() == 407) { Assert.assertNotNull(result.getFirstHeader("Proxy-Authenticate")); } verifyMocks(); }
@Test public void cacheMissResultsIn504WithOnlyIfCached() throws Exception { final ClassicHttpRequest req = HttpTestUtils.makeDefaultRequest(); req.setHeader("Cache-Control", "only-if-cached"); replayMocks(); final ClassicHttpResponse result = execute(req); verifyMocks(); assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, result.getCode()); }
protected void testGenerates504IfCannotRevalidateStaleResponse( final ClassicHttpResponse staleResponse) throws Exception { final ClassicHttpRequest req1 = new BasicClassicHttpRequest("GET", "/"); backendExpectsAnyRequestAndReturn(staleResponse); final ClassicHttpRequest req2 = new BasicClassicHttpRequest("GET", "/"); backendExpectsAnyRequest().andThrow(new SocketTimeoutException()); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); Assert.assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, result.getCode()); }
@Test public void testMayReturnStaleResponseIfClientExplicitlySpecifiesAcceptableMaxStale() throws Exception { final ClassicHttpRequest req1 = requestToPopulateStaleCacheEntry(); final ClassicHttpRequest req2 = new BasicClassicHttpRequest("GET", "/"); req2.setHeader("Cache-Control","max-stale=20"); backendExpectsAnyRequest().andThrow(new IOException()).times(0,1); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); assertEquals(HttpStatus.SC_OK, result.getCode()); assertNotNull(result.getFirstHeader("Warning")); }
@Test public void test206ContainsContentLocationIfA200ResponseWouldHaveIncludedIt() throws Exception { final ClassicHttpRequest req1 = new BasicClassicHttpRequest("GET", "/"); originResponse.addHeader("Cache-Control", "max-age=3600"); originResponse.addHeader("Content-Location", "http://foo.example.com/other/url"); final ClassicHttpRequest req2 = new BasicClassicHttpRequest("GET", "/"); req2.addHeader("Range", "bytes=0-50"); backendExpectsAnyRequest().andReturn(originResponse).times(1, 2); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); if (result.getCode() == HttpStatus.SC_PARTIAL_CONTENT) { Assert.assertNotNull(result.getFirstHeader("Content-Location")); } }
@Test public void test206ContainsETagIfA200ResponseWouldHaveIncludedIt() throws Exception { final ClassicHttpRequest req1 = new BasicClassicHttpRequest("GET", "/"); originResponse.addHeader("Cache-Control", "max-age=3600"); originResponse.addHeader("ETag", "\"etag1\""); final ClassicHttpRequest req2 = new BasicClassicHttpRequest("GET", "/"); req2.addHeader("Range", "bytes=0-50"); backendExpectsAnyRequest().andReturn(originResponse).times(1, 2); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); if (result.getCode() == HttpStatus.SC_PARTIAL_CONTENT) { Assert.assertNotNull(result.getFirstHeader("ETag")); } }
@Test public void testIfOnlyIfCachedAndEntryNotSuitableBackendNotCalled() throws Exception { request.setHeader("Cache-Control", "only-if-cached"); entry = HttpTestUtils.makeCacheEntry(new Header[] { new BasicHeader("Cache-Control", "must-revalidate") }); requestIsFatallyNonCompliant(null); requestPolicyAllowsCaching(true); getCacheEntryReturns(entry); cacheEntrySuitable(false); replayMocks(); final ClassicHttpResponse resp = execute(request); verifyMocks(); Assert.assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, resp.getCode()); }
@Test public void returns504ForStaleEntryWithOnlyIfCached() throws Exception { final ClassicHttpRequest req1 = HttpTestUtils.makeDefaultRequest(); final ClassicHttpResponse resp1 = HttpTestUtils.make200Response(); resp1.setHeader("Date", DateUtils.formatDate(tenSecondsAgo)); resp1.setHeader("Cache-Control","max-age=5"); backendExpectsAnyRequestAndReturn(resp1); final ClassicHttpRequest req2 = HttpTestUtils.makeDefaultRequest(); req2.setHeader("Cache-Control", "only-if-cached"); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, result.getCode()); }
@Test public void issues304EvenWithWeakETag() throws Exception { final ClassicHttpRequest req1 = HttpTestUtils.makeDefaultRequest(); final ClassicHttpResponse resp1 = HttpTestUtils.make200Response(); resp1.setHeader("Date", DateUtils.formatDate(tenSecondsAgo)); resp1.setHeader("Cache-Control", "max-age=300"); resp1.setHeader("ETag","W/\"weak-sauce\""); backendExpectsAnyRequestAndReturn(resp1); final ClassicHttpRequest req2 = HttpTestUtils.makeDefaultRequest(); req2.setHeader("If-None-Match","W/\"weak-sauce\""); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); assertEquals(HttpStatus.SC_NOT_MODIFIED, result.getCode()); }
@Test public void test206ResponseGeneratedFromCacheMustHaveDateHeader() throws Exception { final ClassicHttpRequest req1 = new BasicClassicHttpRequest("GET", "/"); final ClassicHttpResponse resp1 = HttpTestUtils.make200Response(); resp1.setHeader("ETag", "\"etag\""); resp1.setHeader("Cache-Control", "max-age=3600"); final ClassicHttpRequest req2 = new BasicClassicHttpRequest("GET", "/"); req2.setHeader("Range", "bytes=0-50"); backendExpectsAnyRequestAndReturn(resp1).times(1, 2); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); if (HttpStatus.SC_PARTIAL_CONTENT == result.getCode()) { Assert.assertNotNull(result.getFirstHeader("Date")); } }