]> granicus.if.org Git - apache/commitdiff
Support Cache-Control: only-if-cached, as per RFC2616 14.9.4.
authorGraham Leggett <minfrin@apache.org>
Sun, 17 Oct 2010 00:20:41 +0000 (00:20 +0000)
committerGraham Leggett <minfrin@apache.org>
Sun, 17 Oct 2010 00:20:41 +0000 (00:20 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1023394 13f79535-47bb-0310-9956-ffa450edef68

modules/cache/cache_storage.c
modules/cache/mod_cache.c

index 32105836ab17f98d32f8cbc5efdc450fbf064113..49b08e41551496152b7c473489312f79190e5ea9 100644 (file)
@@ -304,6 +304,15 @@ int cache_select(cache_request_rec *cache, request_rec *r)
             if (!fresh) {
                 const char *etag, *lastmod;
 
+                /* Cache-Control: only-if-cached and revalidation required, try
+                 * the next provider
+                 */
+                if (cache->control_in.only_if_cached) {
+                    /* try again with next cache type */
+                    list = list->next;
+                    continue;
+                }
+
                 ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, r->server,
                   "Cached response for %s isn't fresh.  Adding/replacing "
                   "conditional request headers.", r->uri);
@@ -387,6 +396,15 @@ int cache_select(cache_request_rec *cache, request_rec *r)
         }
         }
     }
+
+    /* if Cache-Control: only-if-cached, and not cached, return 504 */
+    if (cache->control_in.only_if_cached) {
+        ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, r->server,
+                "cache: 'only-if-cached' requested and no cached entity, "
+                "returning 504 Gateway Timeout for: %s", r->uri);
+        return HTTP_GATEWAY_TIME_OUT;
+    }
+
     return DECLINED;
 }
 
index 0d0a8dc9ea2ed1e6368871d8255ef588dacf7442..667f3fd63e748b68eac82bf72e227a0acd44de9e 100644 (file)
@@ -199,9 +199,7 @@ static int cache_quick_handler(request_rec *r, int lookup)
         }
         else {
             /* error */
-            ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
-                         "cache: error returned while checking for cached "
-                         "file by '%s' cache", cache->provider_name);
+            return rv;
         }
         return DECLINED;
     }
@@ -478,9 +476,7 @@ static int cache_handler(request_rec *r)
         }
         else {
             /* error */
-            ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
-                         "cache: error returned while checking for cached "
-                         "file by %s cache", cache->provider_name);
+            return rv;
         }
         return DECLINED;
     }