Index: httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolRequirements.java =================================================================== --- httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolRequirements.java (revision 1002242) +++ httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestProtocolRequirements.java (working copy) @@ -2592,9 +2592,11 @@ EasyMock.expect( mockBackend.execute(EasyMock.isA(HttpHost.class), EasyMock.capture(cap), (HttpContext) EasyMock.isNull())).andReturn(validated).times(0, 1); - EasyMock.expect(mockCache.updateCacheEntry(EasyMock.same(host), EasyMock.same(request), EasyMock.same(entry), + EasyMock.expect(mockCache.getCacheEntry(EasyMock.isA(HttpHost.class), EasyMock.isA(HttpRequest.class))) + .andReturn(entry).times(0, 1); + EasyMock.expect(mockCache.cacheAndReturnResponse(EasyMock.isA(HttpHost.class), EasyMock.isA(HttpRequest.class), EasyMock.same(validated), EasyMock.isA(Date.class), EasyMock.isA(Date.class))) - .andReturn(reconstructed).times(0, 1); + .andReturn(reconstructed).times(0, 1); replayMocks(); HttpResponse result = impl.execute(host, request); Index: httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheEntryUpdater.java =================================================================== --- httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheEntryUpdater.java (revision 1002701) +++ httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCacheEntryUpdater.java (working copy) @@ -65,7 +65,7 @@ public void testUpdateCacheEntryReturnsDifferentEntryInstance() throws IOException { HttpCacheEntry entry =HttpTestUtils.makeCacheEntry(); - BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); + BasicHttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_NOT_MODIFIED, ""); HttpCacheEntry newEntry = impl.updateCacheEntry(null, entry, requestDate, responseDate, response); @@ -162,7 +162,7 @@ HttpCacheEntry entry = HttpTestUtils.makeCacheEntry(tenSecondsAgo, eightSecondsAgo); - HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "OK"); + HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_NOT_MODIFIED, ""); HttpCacheEntry updated = impl.updateCacheEntry(null, entry, twoSecondsAgo, oneSecondAgo, response); Index: httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java =================================================================== --- httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java (revision 1002242) +++ httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java (working copy) @@ -432,8 +432,10 @@ getCurrentDateReturns(requestDate); backendCall(validate, originResponse); getCurrentDateReturns(responseDate); - EasyMock.expect(mockCache.updateCacheEntry(host, request, - entry, originResponse, requestDate, responseDate)) + responsePolicyAllowsCaching(true); + responseProtocolValidationIsCalled(); + EasyMock.expect(mockCache.getCacheEntry(host, validate)).andReturn(null); + EasyMock.expect(mockCache.cacheAndReturnResponse(host, validate, originResponse, requestDate, responseDate)) .andReturn(finalResponse); replayMocks(); @@ -483,9 +485,11 @@ backendCall(unconditional, originResponse2); final Date responseDate2 = new Date(); getCurrentDateReturns(responseDate2); - - EasyMock.expect(mockCache.updateCacheEntry(host, request, - entry, originResponse2, requestDate2, responseDate2)) + + responsePolicyAllowsCaching(true); + responseProtocolValidationIsCalled(); + EasyMock.expect(mockCache.getCacheEntry(host, validate)).andReturn(null); + EasyMock.expect(mockCache.cacheAndReturnResponse(host, validate, originResponse2, requestDate2, responseDate2)) .andReturn(finalResponse); replayMocks(); Index: httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java (revision 1002242) +++ httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CacheEntryUpdater.java (working copy) @@ -35,6 +35,7 @@ import org.apache.http.Header; import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; import org.apache.http.annotation.Immutable; import org.apache.http.client.cache.HeaderConstants; import org.apache.http.client.cache.HttpCacheEntry; @@ -46,7 +47,7 @@ /** * Update a {@link HttpCacheEntry} with new or updated information based on the latest - * 200 or 304 status responses from the Server. Use the {@link HttpResponse} to perform + * 304 status response from the Server. Use the {@link HttpResponse} to perform * the update. * * @since 4.1 @@ -66,7 +67,8 @@ } /** - * Update the entry with the new information from the response. + * Update the entry with the new information from the response. Should only be used for + * 304 responses. * * @param request id * @param entry The cache Entry to be updated @@ -82,7 +84,8 @@ Date requestDate, Date responseDate, HttpResponse response) throws IOException { - + if (response.getStatusLine().getStatusCode() != HttpStatus.SC_NOT_MODIFIED) + throw new IllegalArgumentException("Response must have 304 status code"); Header[] mergedHeaders = mergeHeaders(entry, response); Resource resource = resourceFactory.copy(requestId, entry.getResource()); return new HttpCacheEntry( Index: httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java (revision 1002242) +++ httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java (working copy) @@ -558,13 +558,16 @@ } } + backendResponse.addHeader("Via", generateViaHeader(backendResponse)); int statusCode = backendResponse.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_NOT_MODIFIED || statusCode == HttpStatus.SC_OK) { cacheUpdates.getAndIncrement(); setResponseStatus(context, CacheResponseStatus.VALIDATED); - return responseCache.updateCacheEntry(target, request, cacheEntry, - backendResponse, requestDate, responseDate); + if (statusCode == HttpStatus.SC_NOT_MODIFIED) { + return responseCache.updateCacheEntry(target, request, cacheEntry, + backendResponse, requestDate, responseDate); + } } return handleBackendResponse(target, conditionalRequest, requestDate, responseDate, Index: httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachedResponseSuitabilityChecker.java =================================================================== --- httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachedResponseSuitabilityChecker.java (revision 1002242) +++ httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachedResponseSuitabilityChecker.java (working copy) @@ -147,7 +147,7 @@ } if (HeaderConstants.CACHE_CONTROL_NO_STORE.equals(elt.getName())) { - log.debug("Response contained NO SORE directive, cache was not suitable"); + log.debug("Response contained NO STORE directive, cache was not suitable"); return false; }