httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Justin Erenkrantz" <jus...@erenkrantz.com>
Subject Re: Any progress on PR41230 (HEAD issues on cached items)?
Date Fri, 18 May 2007 21:26:43 GMT
On 5/18/07, Ruediger Pluem <rpluem@apache.org> wrote:
> > Well, because rv == !OK, wouldn't the CACHE_REMOVE_URL filter hit?
> > That should do the dirty deed, no?  -- justin
>
> No, as the CACHE_REMOVE_URL filter will only work if there is a
> cache->handle or a cache->stale_handle. We have neither, as cache->stale_handle
> is set to NULL in the case that the cached entity is *really* stale and we do
> not create a new entity (and thus a cache->handle) in the HEAD case.

Well, let's not clear cache->stale_handle then.  How does the
following look?  -- justin

Index: modules/cache/mod_cache.c
===================================================================
--- modules/cache/mod_cache.c	(revision 539607)
+++ modules/cache/mod_cache.c	(working copy)
@@ -477,8 +477,10 @@
         reason = "No Last-Modified, Etag, or Expires headers";
     }
     else if (r->header_only) {
-        /* HEAD requests */
-        reason = "HTTP HEAD request";
+        /* Forbid HEAD requests unless we have it cached already */
+        if (!cache->stale_handle) {
+            reason = "HTTP HEAD request";
+        }
     }
     else if (!conf->store_nostore &&
              ap_cache_liststr(NULL, cc_out, "no-store", NULL)) {
@@ -596,7 +598,12 @@
      * the headers).
      */

-    /* Did we have a stale cache entry that really is stale? */
+    /* Did we have a stale cache entry that really is stale?
+     *
+     * Note that for HEAD requests, we won't get the body, so for a stale
+     * HEAD request, we don't remove the entity - instead we let the
+     * CACHE_REMOVE_URL filter remove the stale item from the cache.
+     */
     if (cache->stale_handle) {
         if (r->status == HTTP_NOT_MODIFIED) {
             /* Oh, hey.  It isn't that stale!  Yay! */
@@ -604,7 +611,7 @@
             info = &cache->handle->cache_obj->info;
             rv = OK;
         }
-        else {
+        else if (!r->header_only) {
             /* Oh, well.  Toss it. */
             cache->provider->remove_entity(cache->stale_handle);
             /* Treat the request as if it wasn't conditional. */
@@ -612,8 +619,8 @@
         }
     }

-    /* no cache handle, create a new entity */
-    if (!cache->handle) {
+    /* no cache handle, create a new entity only for non-HEAD requests */
+    if (!cache->handle && !r->header_only) {
         rv = cache_create_entity(r, size);
         info = apr_pcalloc(r->pool, sizeof(cache_info));
         /* We only set info->status upon the initial creation. */

Mime
View raw message