]> granicus.if.org Git - apache/commitdiff
* Save the key we generate during our first run of cache_generate_key_default
authorRuediger Pluem <rpluem@apache.org>
Mon, 12 Feb 2007 20:29:04 +0000 (20:29 +0000)
committerRuediger Pluem <rpluem@apache.org>
Mon, 12 Feb 2007 20:29:04 +0000 (20:29 +0000)
  on each request in the request_config. During consecutive runs of
  cache_generate_key_default during processing the request we restore it
  from there as we might not be able to generate the same key again as
  the ingredients used to compose the key might have changed and we constantly
  must use a key that could be generated during the quick handler phase.

PR: 41475

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@506621 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/cache/cache_storage.c
modules/cache/mod_cache.h

diff --git a/CHANGES b/CHANGES
index c7536a85edfba1c655cd03b6640de7a594d0139d..9adec4df2ebd9df3cd456392289a040e4a7dbd98 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 Changes with Apache 2.3.0
   [Remove entries to the current 2.0 and 2.2 section below, when backported]
 
+  *) mod_cache: Use the same cache key throughout the whole request processing
+     to handle escaped URLs correctly.  PR 41475. [Ruediger Pluem]
+
   *) mod_cache: Add CacheIgnoreQueryString directive.  PR 41484.
      [Fredrik Widlund <fredrik.widlund qbrick.com>]
 
index cb5be3b163e814e0e44a476274f5d5e609413579..0ddf82dd39f0a2f9c6c2a5df8d2de6efdfe22e08 100644 (file)
@@ -346,10 +346,30 @@ apr_status_t cache_generate_key_default(request_rec *r, apr_pool_t* p,
                                         char**key)
 {
     cache_server_conf *conf;
+    cache_request_rec *cache;
     char *port_str, *hn, *lcs;
     const char *hostname, *scheme;
     int i;
 
+    cache = (cache_request_rec *) ap_get_module_config(r->request_config,
+                                                       &cache_module);
+    if (!cache) {
+        /* This should never happen */
+        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
+                     "cache: No cache request information available for key"
+                     " generation");
+        *key = "";
+        return APR_EGENERAL;
+    }
+    if (cache->key) {
+        /*
+         * We have been here before during the processing of this request.
+         * So return the key we already have.
+         */
+        *key = apr_pstrdup(p, cache->key);
+        return APR_SUCCESS;
+    }
+
     /*
      * Get the module configuration. We need this for the CacheIgnoreQueryString
      * option below.
@@ -457,5 +477,15 @@ apr_status_t cache_generate_key_default(request_rec *r, apr_pool_t* p,
                            r->parsed_uri.path, "?", r->parsed_uri.query, NULL);
     }
 
+    /*
+     * Store the key in the request_config for the cache as r->parsed_uri
+     * might have changed in the time from our first visit here triggered by the
+     * quick handler and our possible second visit triggered by the CACHE_SAVE
+     * filter (e.g. r->parsed_uri got unescaped). In this case we would save the
+     * resource in the cache under a key where it is never found by the quick
+     * handler during following requests.
+     */
+    cache->key = apr_pstrdup(r->pool, *key);
+
     return APR_SUCCESS;
 }
index 902565c41ddc9df2617170776b5913112fbb82bc..e7c9741f82e2f9cd962a4774a59c0b85582bc167 100644 (file)
@@ -249,6 +249,9 @@ typedef struct {
     apr_time_t lastmod;                 /* last-modified time */
     cache_info *info;                   /* current cache info */
     ap_filter_t *remove_url_filter;     /* Enable us to remove the filter */
+    char *key;                          /* The cache key created for this
+                                         * request
+                                         */
 } cache_request_rec;