@Override public boolean containsHeader(final String name) { return response.containsHeader(name); }
@Test public void testReturns304ForIfModifiedSinceHeaderIf304ResponseInCache() throws Exception { final Date now = new Date(); final Date oneHourAgo = new Date(now.getTime() - 3600 * 1000L); final Date inTenMinutes = new Date(now.getTime() + 600 * 1000L); impl = createCachingExecChain(new BasicHttpCache(), CacheConfig.DEFAULT); final ClassicHttpRequest req1 = new HttpGet("http://foo.example.com/"); req1.addHeader("If-Modified-Since", DateUtils.formatDate(oneHourAgo)); final ClassicHttpRequest req2 = new HttpGet("http://foo.example.com/"); req2.addHeader("If-Modified-Since", DateUtils.formatDate(oneHourAgo)); final ClassicHttpResponse resp1 = HttpTestUtils.make304Response(); resp1.setHeader("Date", DateUtils.formatDate(now)); resp1.setHeader("Cache-control", "max-age=600"); resp1.setHeader("Expires", DateUtils.formatDate(inTenMinutes)); expect( mockExecChain.proceed(isA(ClassicHttpRequest.class), isA(ExecChain.Scope.class))).andReturn(resp1).once(); expect( mockExecChain.proceed(isA(ClassicHttpRequest.class), isA(ExecChain.Scope.class))).andThrow( new AssertionFailedError("Should have reused cached 304 response")).anyTimes(); replayMocks(); execute(req1); final ClassicHttpResponse result = execute(req2); verifyMocks(); Assert.assertEquals(HttpStatus.SC_NOT_MODIFIED, result.getCode()); Assert.assertFalse(result.containsHeader("Last-Modified")); }
@Test public void testReadResponseHead() throws Exception { final String s = "HTTP/1.1 200 OK\r\nUser-Agent: test\r\n\r\n"; final ByteArrayInputStream inStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII)); Mockito.when(socket.getInputStream()).thenReturn(inStream); conn.bind(socket); Assert.assertEquals(0, conn.getEndpointDetails().getResponseCount()); final ClassicHttpResponse response = conn.receiveResponseHeader(); Assert.assertNotNull(response); Assert.assertEquals(200, response.getCode()); Assert.assertTrue(response.containsHeader("User-Agent")); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); }
@Test(expected = NotImplementedException.class) public void testReadResponseEntityIdentity() throws Exception { final String s = "HTTP/1.1 200 OK\r\nServer: test\r\nTransfer-Encoding: identity\r\n\r\n123"; final ByteArrayInputStream inStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII)); Mockito.when(socket.getInputStream()).thenReturn(inStream); conn.bind(socket); Assert.assertEquals(0, conn.getEndpointDetails().getResponseCount()); final ClassicHttpResponse response = conn.receiveResponseHeader(); Assert.assertNotNull(response); Assert.assertEquals(200, response.getCode()); Assert.assertTrue(response.containsHeader("Server")); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); conn.receiveResponseEntity(response); }
@Test public void testReadResponseNoEntity() throws Exception { final String s = "HTTP/1.1 200 OK\r\nServer: test\r\n\r\n"; final ByteArrayInputStream inStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII)); Mockito.when(socket.getInputStream()).thenReturn(inStream); conn.bind(socket); Assert.assertEquals(0, conn.getEndpointDetails().getResponseCount()); final ClassicHttpResponse response = conn.receiveResponseHeader(); Assert.assertNotNull(response); Assert.assertEquals(200, response.getCode()); Assert.assertTrue(response.containsHeader("Server")); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); conn.receiveResponseEntity(response); final HttpEntity entity = response.getEntity(); Assert.assertNotNull(entity); final InputStream content = entity.getContent(); Assert.assertNotNull(content); Assert.assertTrue(content instanceof IdentityInputStream); }
@Test public void testReadResponseEntityWithoutContentLength() throws Exception { final String s = "HTTP/1.1 200 OK\r\nServer: test\r\n\r\n123"; final ByteArrayInputStream inStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII)); Mockito.when(socket.getInputStream()).thenReturn(inStream); conn.bind(socket); Assert.assertEquals(0, conn.getEndpointDetails().getResponseCount()); final ClassicHttpResponse response = conn.receiveResponseHeader(); Assert.assertNotNull(response); Assert.assertEquals(200, response.getCode()); Assert.assertTrue(response.containsHeader("Server")); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); conn.receiveResponseEntity(response); final HttpEntity entity = response.getEntity(); Assert.assertNotNull(entity); Assert.assertEquals(-1, entity.getContentLength()); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); final InputStream content = entity.getContent(); Assert.assertNotNull(content); Assert.assertEquals(3, content.available()); Assert.assertEquals('1', content.read()); Assert.assertEquals('2', content.read()); Assert.assertEquals('3', content.read()); }
@Test public void testReadResponseEntityWithContentLength() throws Exception { final String s = "HTTP/1.1 200 OK\r\nServer: test\r\nContent-Length: 3\r\n\r\n123"; final ByteArrayInputStream inStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII)); Mockito.when(socket.getInputStream()).thenReturn(inStream); conn.bind(socket); Assert.assertEquals(0, conn.getEndpointDetails().getResponseCount()); final ClassicHttpResponse response = conn.receiveResponseHeader(); Assert.assertNotNull(response); Assert.assertEquals(200, response.getCode()); Assert.assertTrue(response.containsHeader("Server")); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); conn.receiveResponseEntity(response); final HttpEntity entity = response.getEntity(); Assert.assertNotNull(entity); Assert.assertEquals(3, entity.getContentLength()); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); final InputStream content = entity.getContent(); Assert.assertNotNull(content); Assert.assertTrue(content instanceof ContentLengthInputStream); }
@Test public void testReadResponseEntityChunkCoded() throws Exception { final String s = "HTTP/1.1 200 OK\r\nServer: test\r\nTransfer-Encoding: " + "chunked\r\n\r\n3\r\n123\r\n0\r\n\r\n"; final ByteArrayInputStream inStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.US_ASCII)); Mockito.when(socket.getInputStream()).thenReturn(inStream); conn.bind(socket); Assert.assertEquals(0, conn.getEndpointDetails().getResponseCount()); final ClassicHttpResponse response = conn.receiveResponseHeader(); Assert.assertNotNull(response); Assert.assertEquals(200, response.getCode()); Assert.assertTrue(response.containsHeader("Server")); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); conn.receiveResponseEntity(response); final HttpEntity entity = response.getEntity(); Assert.assertNotNull(entity); Assert.assertEquals(-1, entity.getContentLength()); Assert.assertEquals(true, entity.isChunked()); Assert.assertEquals(1, conn.getEndpointDetails().getResponseCount()); final InputStream content = entity.getContent(); Assert.assertNotNull(content); Assert.assertTrue(content instanceof ChunkedInputStream); }