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

List:       httpcomponents-commits
Subject:    svn commit: r1024383 - in
From:       olegk () apache ! org
Date:       2010-10-19 19:54:29
Message-ID: 20101019195429.C4D6323889F1 () eris ! apache ! org
[Download RAW message or body]

Author: olegk
Date: Tue Oct 19 19:54:29 2010
New Revision: 1024383

URL: http://svn.apache.org/viewvc?rev=1024383&view=rev
Log:
HTTPCLIENT-1015: Support only-if-cached directive
Contributed by Michajlo Matijkiw <michajlo_matijkiw at comcast.com>

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/TestCachingHttpClient.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=1024383&r1=1024382&r2=1024383&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 \
Tue Oct 19 19:54:29 2010 @@ -407,6 +407,11 @@ public class CachingHttpClient \
                implement
                 log.debug("Cache miss [host: " + target + "; uri: " + rl.getUri() + \
"]");  }
 
+            if (!mayCallBackend(request)) {
+                return new BasicHttpResponse(HttpVersion.HTTP_1_1, \
HttpStatus.SC_GATEWAY_TIMEOUT, +                        "Gateway Timeout");
+            }
+
             Set<HttpCacheEntry> variantEntries = null;
             try {
                 responseCache.getVariantCacheEntries(target, request);
@@ -447,6 +452,11 @@ public class CachingHttpClient implement
             return cachedResponse;
         }
 
+        if (!mayCallBackend(request)) {
+            return new BasicHttpResponse(HttpVersion.HTTP_1_1, \
HttpStatus.SC_GATEWAY_TIMEOUT, +                    "Gateway Timeout");
+        }
+
         if (validityPolicy.isRevalidatable(entry)) {
             log.debug("Revalidating the cache entry");
 
@@ -472,6 +482,17 @@ public class CachingHttpClient implement
         return callBackend(target, request, context);
     }
 
+    private boolean mayCallBackend(HttpRequest request) {
+        for (Header h: request.getHeaders("Cache-Control")) {
+            for (HeaderElement elt : h.getElements()) {
+                if ("only-if-cached".equals(elt.getName())) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
     private boolean explicitFreshnessRequest(HttpRequest request, HttpCacheEntry \
entry, Date now) {  for(Header h : request.getHeaders("Cache-Control")) {
             for(HeaderElement elt : h.getElements()) {

Modified: httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java
                
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient-cache/src \
/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java?rev=1024383&r1=1024382&r2=1024383&view=diff
 ==============================================================================
--- httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java \
                (original)
+++ httpcomponents/httpclient/trunk/httpclient-cache/src/test/java/org/apache/http/impl/client/cache/TestCachingHttpClient.java \
Tue Oct 19 19:54:29 2010 @@ -1931,6 +1931,59 @@ public class TestCachingHttpClient {
         Assert.assertSame(resp, result);
     }
 
+    @Test
+    public void testIfOnlyIfCachedAndNoCacheEntryBackendNotCalled() throws \
IOException { +        impl = new CachingHttpClient(mockBackend);
+
+        request.addHeader("Cache-Control", "only-if-cached");
+
+        HttpResponse resp = impl.execute(host, request);
+
+        Assert.assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, \
resp.getStatusLine().getStatusCode()); +    }
+
+    @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);
+        requestProtocolValidationIsCalled();
+        cacheInvalidatorWasCalled();
+        requestPolicyAllowsCaching(true);
+        getCacheEntryReturns(entry);
+        cacheEntrySuitable(false);
+
+        replayMocks();
+        HttpResponse resp = impl.execute(host, request);
+        verifyMocks();
+
+        Assert.assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, \
resp.getStatusLine().getStatusCode()); +    }
+
+    @Test
+    public void testIfOnlyIfCachedAndEntryExistsAndIsSuitableReturnsEntry() throws \
Exception { +
+        request.setHeader("Cache-Control", "only-if-cached");
+
+        requestIsFatallyNonCompliant(null);
+        requestProtocolValidationIsCalled();
+        cacheInvalidatorWasCalled();
+        requestPolicyAllowsCaching(true);
+        getCacheEntryReturns(entry);
+        cacheEntrySuitable(true);
+        responseIsGeneratedFromCache();
+        entryHasStaleness(0);
+
+        replayMocks();
+        HttpResponse resp = impl.execute(host, request);
+        verifyMocks();
+
+        Assert.assertSame(mockCachedResponse, resp);
+    }
+
     private void getCacheEntryReturns(HttpCacheEntry result) throws IOException {
         EasyMock.expect(mockCache.getCacheEntry(host, request)).andReturn(result);
     }


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

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