]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Backport.
authorSander Striker <striker@apache.org>
Sun, 10 Apr 2005 13:39:03 +0000 (13:39 +0000)
committerSander Striker <striker@apache.org>
Sun, 10 Apr 2005 13:39:03 +0000 (13:39 +0000)
* STATUS

  Remove vote.

* CHANGES
* docs/manual/mod/mod_cache.xml
* modules/experimental/cache_util.c
* modules/experimental/mod_cache.c
* modules/experimental/mod_cache.h
* modules/experimental/mod_mem_cache.c
* modules/experimental/mod_disk_cache.c

  Add CacheIgnoreHeaders directive.
  PR: 30399
    docs/manual/mod/mod_cache.xml: r1.18
    modules/experimental/cache_util.c: 1.36
    modules/experimental/mod_cache.c: 1.95
    modules/experimental/mod_cache.h: 1.52
    modules/experimental/mod_disk_cache.c: 1.67
    modules/experimental/mod_mem_cache.c: 1.119
      +1: jerenkrantz, stoddard, striker
      +0: sounds like a nice 'feature' v.s. rfc-required behavior, great for 2.2

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.0.x@160771 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
docs/manual/mod/mod_cache.xml
modules/experimental/cache_util.c
modules/experimental/mod_cache.c
modules/experimental/mod_cache.h
modules/experimental/mod_disk_cache.c
modules/experimental/mod_mem_cache.c

diff --git a/CHANGES b/CHANGES
index b62069529df8ad4d0ef9cb6086d800f60971cd09..da464354849bb98a9958565c7ec6b1ac4a64850a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,8 @@
 Changes with Apache 2.0.54
 
+  *) mod_cache: Add CacheIgnoreHeaders directive.  PR 30399.
+     [Rüiger Plü <r.pluem t-online.de>]
+
   *) mod_ldap: Added the directive LDAPConnectionTimeout to configure
      the ldap socket connection timeout value.  
      [Brad Nicholes]
diff --git a/STATUS b/STATUS
index 44d5d4c45f1a6d5bc24f8cfd3fdf474c784ea64e..fd0a410603e5bcb87bbe926b1d779dafb203e63e 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -171,17 +171,6 @@ PATCHES TO BACKPORT FROM TRUNK:
       +1: stoddard, striker, jim
       -1: brianp (we need a more robust solution than what's in 2.1 right now),
 
-    * mod_cache: Add CacheIgnoreHeaders directive.
-      PR: 30399
-        docs/manual/mod/mod_cache.xml: r1.18
-        modules/experimental/cache_util.c: 1.36
-        modules/experimental/mod_cache.c: 1.95
-        modules/experimental/mod_cache.h: 1.52
-        modules/experimental/mod_disk_cache.c: 1.67
-        modules/experimental/mod_mem_cache.c: 1.119
-      +1: jerenkrantz, stoddard, striker
-      +0: sounds like a nice 'feature' v.s. rfc-required behavior, great for 2.2
-
     * support/check_forensic: Fix tempfile usage
       svn rev 125495, 126224
       jerenkrantz says: r126224 fixes brokenness with r125495 on Solaris.
index b5b76c1a3b87c176ad3edb54d9316c3ee0cdfc31..444c283d8ea5067173d8d28caadc55a234a5c729 100644 (file)
@@ -333,4 +333,57 @@ will complete caching the file even if the request is cancelled.</description>
 </usage>
 </directivesynopsis>
 
+<directivesynopsis>
+<name>CacheIgnoreHeaders</name>
+<description>Do not store the given HTTP header(s) in the cache.
+</description>
+<syntax>CacheIgnoreHeaders <var>header-string</var> [<var>header-string</var>] ...</syntax>
+<default>CacheIgnoreHeaders None</default>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+    <p>According to RFC 2616, hop-by-hop HTTP headers are not stored in
+    the cache.  The following HTTP headers are hop-by-hop headers and thus
+    do not get stored in the cache in <em>any</em> case regardless of the
+    setting of <directive>CacheIgnoreHeaders</directive>:</p>
+
+    <ul>
+      <li><code>Connection</code></li>
+      <li><code>Keep-Alive</code></li>
+      <li><code>Proxy-Authenticate</code></li>
+      <li><code>Proxy-Authorization</code></li>
+      <li><code>TE</code></li>
+      <li><code>Trailers</code></li>
+      <li><code>Transfer-Encoding</code></li>
+      <li><code>Upgrade</code></li>
+    </ul>
+
+    <p><directive>CacheIgnoreHeaders</directive> specifies additional HTTP
+    headers that should not to be stored in the cache.  For example, it makes
+    sense in some cases to prevent cookies from being stored in the cache.</p>
+
+    <p><directive>CacheIgnoreHeaders</directive> takes a space separated list
+    of HTTP headers that should not be stored in the cache. If only hop-by-hop
+    headers not should be stored in the cache (the RFC 2616 compliant
+    behaviour), <directive>CacheIgnoreHeaders</directive> can be set to
+    <code>None</code>.</p>
+
+    <example><title>Example 1</title>
+      CacheIgnoreHeaders Set-Cookie
+    </example>
+
+    <example><title>Example 2</title>
+      CacheIgnoreHeaders None
+    </example>
+
+    <note type="warning"><title>Warning:</title>
+      If headers like <code>Expires</code> which are needed for proper cache
+      management are not stored due to a
+      <directive>CacheIgnoreHeaders</directive> setting, the behaviour of
+      mod_cache is undefined.
+    </note>
+</usage>
+</directivesynopsis>
+
 </modulesynopsis>
index fb04679ae5167f4a892ed59062453bd751571344..3442df0e2f870cca8078ce407e8d4cdb8d2e1435 100644 (file)
@@ -22,6 +22,8 @@
 
 /* -------------------------------------------------------------- */
 
+extern module AP_MODULE_DECLARE_DATA cache_module;
+
 /* return true if the request is conditional */
 CACHE_DECLARE(int) ap_cache_request_is_conditional(apr_table_t *table)
 {
@@ -518,8 +520,13 @@ CACHE_DECLARE(char *)generate_name(apr_pool_t *p, int dirlevels,
  * headers table that are allowed to be stored in a cache.
  */
 CACHE_DECLARE(apr_table_t *)ap_cache_cacheable_hdrs_out(apr_pool_t *pool,
-                                                        apr_table_t *t)
+                                                        apr_table_t *t,
+                                                        server_rec *s)
 {
+    cache_server_conf *conf;
+    char **header;
+    int i;
+
     /* Make a copy of the headers, and remove from
      * the copy any hop-by-hop headers, as defined in Section
      * 13.5.1 of RFC 2616
@@ -534,5 +541,15 @@ CACHE_DECLARE(apr_table_t *)ap_cache_cacheable_hdrs_out(apr_pool_t *pool,
     apr_table_unset(headers_out, "Trailers");
     apr_table_unset(headers_out, "Transfer-Encoding");
     apr_table_unset(headers_out, "Upgrade");
+
+    conf = (cache_server_conf *)ap_get_module_config(s->module_config,
+                                                     &cache_module);
+    /* Remove the user defined headers set with CacheIgnoreHeaders.
+     * This may break RFC 2616 compliance on behalf of the administrator.
+     */
+    header = (char **)conf->ignore_headers->elts;
+    for (i = 0; i < conf->ignore_headers->nelts; i++) {
+        apr_table_unset(headers_out, header[i]);
+    }
     return headers_out;
 }
index 8e6fae09c27879ca6110c2475882a9d1d2c59769..1f648e48ce5f9b814d6cb91fe51e65724943935d 100644 (file)
@@ -717,6 +717,9 @@ static void * create_cache_config(apr_pool_t *p, server_rec *s)
     ps->no_last_mod_ignore = 0;
     ps->ignorecachecontrol = 0;
     ps->ignorecachecontrol_set = 0 ;
+    /* array of headers that should not be stored in cache */
+    ps->ignore_headers = apr_array_make(p, 10, sizeof(char *));
+    ps->ignore_headers_set = CACHE_IGNORE_HEADERS_UNSET;
     return ps;
 }
 
@@ -753,6 +756,10 @@ static void * merge_cache_config(apr_pool_t *p, void *basev, void *overridesv)
         (overrides->ignorecachecontrol_set == 0)
         ? base->ignorecachecontrol
         : overrides->ignorecachecontrol;
+    ps->ignore_headers =
+        (overrides->ignore_headers_set == CACHE_IGNORE_HEADERS_UNSET)
+        ? base->ignore_headers
+        : overrides->ignore_headers;
     return ps;
 }
 static const char *set_cache_ignore_no_last_mod(cmd_parms *parms, void *dummy,
@@ -782,6 +789,34 @@ static const char *set_cache_ignore_cachecontrol(cmd_parms *parms,
     return NULL;
 }
 
+static const char *add_ignore_header(cmd_parms *parms, void *dummy,
+                                     const char *header)
+{
+    cache_server_conf *conf;
+    char **new;
+
+    conf =
+        (cache_server_conf *)ap_get_module_config(parms->server->module_config,
+                                                  &cache_module);
+    if (!strncasecmp(header, "None", 4)) {
+        /* if header None is listed clear array */
+        conf->ignore_headers->nelts = 0;
+    }
+    else {
+        if ((conf->ignore_headers_set == CACHE_IGNORE_HEADERS_UNSET) ||
+            (conf->ignore_headers->nelts)) {
+            /* Only add header if no "None" has been found in header list
+             * so far.
+             * (When 'None' is passed, IGNORE_HEADERS_SET && nelts == 0.)
+             */
+            new = (char **)apr_array_push(conf->ignore_headers);
+            (*new) = header;
+        }
+    }
+    conf->ignore_headers_set = CACHE_IGNORE_HEADERS_SET;
+    return NULL;
+}
+
 static const char *add_cache_enable(cmd_parms *parms, void *dummy, 
                                     const char *type, 
                                     const char *url)
@@ -914,6 +949,9 @@ static const command_rec cache_cmds[] =
                   NULL, 
                   RSRC_CONF, 
                   "Ignore requests from the client for uncached content"),
+    AP_INIT_ITERATE("CacheIgnoreHeaders", add_ignore_header, NULL, RSRC_CONF,
+                    "A space separated list of headers that should not be "
+                    "stored by the cache"),
     AP_INIT_TAKE1("CacheLastModifiedFactor", set_cache_factor, NULL, RSRC_CONF,
                   "The factor used to estimate Expires date from "
                   "LastModified date"),
index 9ca68087d0fcf88d54f6a7dd4540b42134145109..8a3e56d30882057fbb11596461cd4f448a34a773 100644 (file)
@@ -134,6 +134,12 @@ typedef struct {
     /** ignore client's requests for uncached responses */
     int ignorecachecontrol;
     int ignorecachecontrol_set;
+    /** store the headers that should not be stored in the cache */
+    apr_array_header_t *ignore_headers;
+    /* flag if CacheIgnoreHeader has been set */
+    #define CACHE_IGNORE_HEADERS_SET   1
+    #define CACHE_IGNORE_HEADERS_UNSET 0
+    int ignore_headers_set;
 } cache_server_conf;
 
 /* cache info information */
@@ -257,7 +263,9 @@ CACHE_DECLARE(const char *)ap_cache_tokstr(apr_pool_t *p, const char *list, cons
 /* Create a new table consisting of those elements from a request_rec's
  * headers_out that are allowed to be stored in a cache
  */
-CACHE_DECLARE(apr_table_t *)ap_cache_cacheable_hdrs_out(apr_pool_t *pool, apr_table_t *t);
+CACHE_DECLARE(apr_table_t *)ap_cache_cacheable_hdrs_out(apr_pool_t *pool,
+                                                        apr_table_t *t,
+                                                        server_rec *s);
 
 /**
  * cache_storage.c
index 1b624c528d78cb041819c5edb7a5699566dd6f48..6e8d0c58ba905c7f82bfd2181e30b902cf2730bc 100644 (file)
@@ -607,7 +607,8 @@ static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info
         if (r->headers_out) {
             apr_table_t *headers_out;
 
-            headers_out = ap_cache_cacheable_hdrs_out(r->pool, r->headers_out);
+            headers_out = ap_cache_cacheable_hdrs_out(r->pool, r->headers_out,
+                                                      r->server);
 
             if (!apr_table_get(headers_out, "Content-Type") &&
                 r->content_type) {
@@ -628,7 +629,8 @@ static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info
         if (r->headers_in) {
             apr_table_t *headers_in;
 
-            headers_in = ap_cache_cacheable_hdrs_out(r->pool, r->headers_in);
+            headers_in = ap_cache_cacheable_hdrs_out(r->pool, r->headers_in,
+                                                     r->server);
             rv = store_table(dobj->hfd, headers_in);
             if (rv != APR_SUCCESS) {
                 return rv;
index ac4b8b1262d177fdb61c2e2783d093cdd69d418d..d55ad1f3a0fdeccd7d70a1fd0220a49449f87915 100644 (file)
@@ -745,13 +745,16 @@ static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info
     /* Precompute how much storage we need to hold the headers */
     rc = serialize_table(&mobj->header_out, 
                          &mobj->num_header_out, 
-                         ap_cache_cacheable_hdrs_out(r->pool, r->headers_out));   
+                         ap_cache_cacheable_hdrs_out(r->pool, r->headers_out,
+                                                     r->server));
     if (rc != APR_SUCCESS) {
         return rc;
     }
     rc = serialize_table(&mobj->err_header_out, 
                          &mobj->num_err_header_out, 
-                         ap_cache_cacheable_hdrs_out(r->pool, r->err_headers_out));   
+                         ap_cache_cacheable_hdrs_out(r->pool,
+                                                     r->err_headers_out,
+                                                     r->server));
     if (rc != APR_SUCCESS) {
         return rc;
     }