[prev in list] [next in list] [prev in thread] [next in thread] 

List:       httpcomponents-commits
Subject:    svn commit: r1051206 - in
From:       jonm () apache ! org
Date:       2010-12-20 16:55:03
Message-ID: 20101220165503.F3E20238899C () eris ! apache ! org
[Download RAW message or body]

Author: jonm
Date: Mon Dec 20 16:55:03 2010
New Revision: 1051206

URL: http://svn.apache.org/viewvc?rev=1051206&view=rev
Log:
HTTPCLIENT-975: stale-if-error now yields to higher-priority
directives, like must-revalidate, proxy-revalidate, and requests
with explicit freshness constraints.

Modified:
    httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java
  httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestRFC5861Compliance.java


Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src \
/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java?rev=1051206&r1=1051205&r2=1051206&view=diff
 ==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java \
                (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/main/java/org/apache/http/impl/client/cache/CachingHttpClient.java \
Mon Dec 20 16:55:03 2010 @@ -506,11 +506,16 @@ public class CachingHttpClient \
implement  }
 
     private void recordCacheHit(HttpHost target, HttpRequest request) {
+        cacheHits.getAndIncrement();
         if (log.isDebugEnabled()) {
             RequestLine rl = request.getRequestLine();
             log.debug("Cache hit [host: " + target + "; uri: " + rl.getUri() + "]");
         }
-        cacheHits.getAndIncrement();
+    }
+    
+    private void recordCacheUpdate(HttpContext context) {
+        cacheUpdates.getAndIncrement();
+        setResponseStatus(context, CacheResponseStatus.VALIDATED);
     }
 
     private void flushEntriesInvalidatedByRequest(HttpHost target,
@@ -737,11 +742,6 @@ public class CachingHttpClient implement
         return callBackend(target, unconditional, context);
     }
 
-    private void recordCacheUpdate(HttpContext context) {
-        cacheUpdates.getAndIncrement();
-        setResponseStatus(context, CacheResponseStatus.VALIDATED);
-    }
-
     private HttpCacheEntry getUpdatedVariantEntry(HttpHost target,
             HttpRequest conditionalRequest, Date requestDate,
             Date responseDate, HttpResponse backendResponse,
@@ -809,6 +809,7 @@ public class CachingHttpClient implement
         }
         
         if (staleIfErrorAppliesTo(statusCode)
+            && !staleResponseNotAllowed(request, cacheEntry, getCurrentDate())
             && validityPolicy.mayReturnStaleIfError(request, cacheEntry, \
                responseDate)) {
             final HttpResponse cachedResponse = \
                responseGenerator.generateResponse(cacheEntry);
             cachedResponse.addHeader(HeaderConstants.WARNING, "110 localhost \
\"Response is stale\"");

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestRFC5861Compliance.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src \
/test/java/org/apache/http/impl/client/cache/TestRFC5861Compliance.java?rev=1051206&r1=1051205&r2=1051206&view=diff
 ==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestRFC5861Compliance.java \
                (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestRFC5861Compliance.java \
Mon Dec 20 16:55:03 2010 @@ -26,9 +26,7 @@
  */
 package org.apache.http.impl.client.cache;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
+import static org.junit.Assert.*;
 import java.util.Date;
 
 import org.apache.http.Header;
@@ -84,7 +82,105 @@ public class TestRFC5861Compliance exten
         
         HttpTestUtils.assert110WarningFound(result);
     }
+    
+    @Test
+    public void testStaleIfErrorInResponseYieldsToMustRevalidate()
+            throws Exception{
+        Date tenSecondsAgo = new Date(new Date().getTime() - 10 * 1000L);
+        HttpRequest req1 = HttpTestUtils.makeDefaultRequest();
+        HttpResponse resp1 = HttpTestUtils.make200Response(tenSecondsAgo,
+                "public, max-age=5, stale-if-error=60, must-revalidate");
+        
+        backendExpectsAnyRequest().andReturn(resp1);
+
+        HttpRequest req2 = HttpTestUtils.makeDefaultRequest();
+        HttpResponse resp2 = HttpTestUtils.make500Response();
+        
+        backendExpectsAnyRequest().andReturn(resp2);
+        
+        replayMocks();
+        impl.execute(host,req1);
+        HttpResponse result = impl.execute(host,req2);
+        verifyMocks();
+        
+        assertTrue(HttpStatus.SC_OK != result.getStatusLine().getStatusCode());
+    }
+    
+    @Test
+    public void testStaleIfErrorInResponseYieldsToProxyRevalidateForSharedCache()
+            throws Exception{
+        assertTrue(impl.isSharedCache());
+        Date tenSecondsAgo = new Date(new Date().getTime() - 10 * 1000L);
+        HttpRequest req1 = HttpTestUtils.makeDefaultRequest();
+        HttpResponse resp1 = HttpTestUtils.make200Response(tenSecondsAgo,
+                "public, max-age=5, stale-if-error=60, proxy-revalidate");
+        
+        backendExpectsAnyRequest().andReturn(resp1);
 
+        HttpRequest req2 = HttpTestUtils.makeDefaultRequest();
+        HttpResponse resp2 = HttpTestUtils.make500Response();
+        
+        backendExpectsAnyRequest().andReturn(resp2);
+        
+        replayMocks();
+        impl.execute(host,req1);
+        HttpResponse result = impl.execute(host,req2);
+        verifyMocks();
+        
+        assertTrue(HttpStatus.SC_OK != result.getStatusLine().getStatusCode());
+    }
+    
+    @Test
+    public void testStaleIfErrorInResponseNeedNotYieldToProxyRevalidateForPrivateCache()
 +            throws Exception{
+        CacheConfig config = new CacheConfig();
+        config.setSharedCache(false);
+        impl = new CachingHttpClient(mockBackend, config);
+        
+        Date tenSecondsAgo = new Date(new Date().getTime() - 10 * 1000L);
+        HttpRequest req1 = HttpTestUtils.makeDefaultRequest();
+        HttpResponse resp1 = HttpTestUtils.make200Response(tenSecondsAgo,
+                "public, max-age=5, stale-if-error=60, proxy-revalidate");
+        
+        backendExpectsAnyRequest().andReturn(resp1);
+
+        HttpRequest req2 = HttpTestUtils.makeDefaultRequest();
+        HttpResponse resp2 = HttpTestUtils.make500Response();
+        
+        backendExpectsAnyRequest().andReturn(resp2);
+        
+        replayMocks();
+        impl.execute(host,req1);
+        HttpResponse result = impl.execute(host,req2);
+        verifyMocks();
+        
+        HttpTestUtils.assert110WarningFound(result);
+    }
+
+    @Test
+    public void testStaleIfErrorInResponseYieldsToExplicitFreshnessRequest()
+            throws Exception{
+        Date tenSecondsAgo = new Date(new Date().getTime() - 10 * 1000L);
+        HttpRequest req1 = HttpTestUtils.makeDefaultRequest();
+        HttpResponse resp1 = HttpTestUtils.make200Response(tenSecondsAgo,
+                "public, max-age=5, stale-if-error=60");
+        
+        backendExpectsAnyRequest().andReturn(resp1);
+
+        HttpRequest req2 = HttpTestUtils.makeDefaultRequest();
+        req2.setHeader("Cache-Control","min-fresh=2");
+        HttpResponse resp2 = HttpTestUtils.make500Response();
+        
+        backendExpectsAnyRequest().andReturn(resp2);
+        
+        replayMocks();
+        impl.execute(host,req1);
+        HttpResponse result = impl.execute(host,req2);
+        verifyMocks();
+        
+        assertTrue(HttpStatus.SC_OK != result.getStatusLine().getStatusCode());
+    }
+    
     @Test
     public void testStaleIfErrorInRequestIsTrueReturnsStaleEntryWithWarning()
     		throws Exception{
@@ -96,7 +192,7 @@ public class TestRFC5861Compliance exten
         backendExpectsAnyRequest().andReturn(resp1);
 
         HttpRequest req2 = HttpTestUtils.makeDefaultRequest();
-        req2.setHeader("Cache-Control","public, max-age=5, stale-if-error=60");
+        req2.setHeader("Cache-Control","public, stale-if-error=60");
         HttpResponse resp2 = HttpTestUtils.make500Response();
         
         backendExpectsAnyRequest().andReturn(resp2);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic