Here's a new patch that changes the option name to CacheVaryOverride and does some of the stuff Justin recommened.

--
Brian Akins
Lead Systems Engineer
CNN Internet Technologies
diff -ru httpd-trunk.orig/modules/cache/cache_storage.c 
httpd-trunk.new/modules/cache/cache_storage.c
--- httpd-trunk.orig/modules/cache/cache_storage.c      2005-07-13 
15:23:03.892378000 -0400
+++ httpd-trunk.new/modules/cache/cache_storage.c       2005-08-18 
08:13:30.098771299 -0400
@@ -230,7 +230,7 @@
                  * is this header in the request and the header in the cached
                  * request identical? If not, we give up and do a straight get
                  */
-                h1 = apr_table_get(r->headers_in, name);
+                h1 = ap_cache_override_header(r, r->headers_in, name); 
                 h2 = apr_table_get(h->req_hdrs, name);
                 if (h1 == h2) {
                     /* both headers NULL, so a match - do nothing */
diff -ru httpd-trunk.orig/modules/cache/cache_util.c 
httpd-trunk.new/modules/cache/cache_util.c
--- httpd-trunk.orig/modules/cache/cache_util.c 2005-07-13 15:23:03.869381000 
-0400
+++ httpd-trunk.new/modules/cache/cache_util.c  2005-08-18 08:15:05.349865494 
-0400
@@ -534,3 +534,49 @@
     }
     return headers_out;
 }
+
+CACHE_DECLARE(const char* )ap_cache_override_header(request_rec *r,
+                                                    apr_table_t *t, 
+                                                    const char* key) {
+    const char *o;
+    cache_server_conf *conf = ap_get_module_config(r->server->module_config,
+                                                   &cache_module);
+    const char *header = NULL;
+
+    if((o = apr_table_get(conf->override_headers, key)) != NULL) {
+        if((header = apr_table_get(r->subprocess_env, o)) == NULL) {
+            header = "-";
+        }
+    }
+
+    if(!header) {
+        header = apr_table_get(t, key);
+    }
+
+    return header;
+}
+
+/* replace headers based on environment overrides
+ * modifies t in place
+ */
+CACHE_DECLARE(apr_status_t )ap_cache_override_hdrs(request_rec *r,
+                                                   apr_table_t *t)
+{
+    int i;
+    apr_table_entry_t *elts;
+    cache_server_conf *conf = ap_get_module_config(r->server->module_config,
+                                                   &cache_module);
+    
+    /* replace headers with environment overrides*/
+    elts = (apr_table_entry_t *) apr_table_elts(conf->override_headers)->elts;
+    
+    for (i = 0; i < apr_table_elts(conf->override_headers)->nelts; ++i) {
+        const char *val = NULL;
+
+        val = ap_cache_override_header(r, t, elts[i].key);
+        apr_table_set(t, elts[i].key, val);
+        
+    }
+    return APR_SUCCESS;
+}
+
diff -ru httpd-trunk.orig/modules/cache/mod_cache.c 
httpd-trunk.new/modules/cache/mod_cache.c
--- httpd-trunk.orig/modules/cache/mod_cache.c  2005-08-09 11:51:09.471251000 
-0400
+++ httpd-trunk.new/modules/cache/mod_cache.c   2005-08-18 08:14:39.755139238 
-0400
@@ -745,6 +745,7 @@
     /* 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;
+    ps->override_headers = apr_table_make(p, 10);
     return ps;
 }
 
@@ -790,6 +791,9 @@
         (overrides->ignore_headers_set == CACHE_IGNORE_HEADERS_UNSET)
         ? base->ignore_headers
         : overrides->ignore_headers;
+    ps->override_headers = apr_table_copy(p, base->override_headers);
+    apr_table_overlap(ps->override_headers, overrides->override_headers, 0);
+
     return ps;
 }
 static const char *set_cache_ignore_no_last_mod(cmd_parms *parms, void *dummy,
@@ -873,6 +877,19 @@
     return NULL;
 }
 
+static const char *add_override_header(cmd_parms *parms, void *dummy,
+                                       const char *header, const char* env)
+{
+    cache_server_conf *conf;
+    conf =
+        (cache_server_conf *)ap_get_module_config(parms->server->module_config,
+                                                  &cache_module);
+
+    apr_table_set(conf->override_headers, header, env);
+    
+    return NULL;
+}
+
 static const char *add_cache_enable(cmd_parms *parms, void *dummy, 
                                     const char *type, 
                                     const char *url)
@@ -1002,6 +1019,9 @@
     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_TAKE2("CacheVaryOverride", add_override_header, NULL, RSRC_CONF,
+                    "A header that should be replaced by the value of"
+                     " the given environment variable"),
     AP_INIT_TAKE1("CacheLastModifiedFactor", set_cache_factor, NULL, RSRC_CONF,
                   "The factor used to estimate Expires date from "
                   "LastModified date"),
diff -ru httpd-trunk.orig/modules/cache/mod_cache.h 
httpd-trunk.new/modules/cache/mod_cache.h
--- httpd-trunk.orig/modules/cache/mod_cache.h  2005-07-13 15:23:03.882379000 
-0400
+++ httpd-trunk.new/modules/cache/mod_cache.h   2005-08-18 08:13:30.101770798 
-0400
@@ -141,6 +141,8 @@
     int store_nostore_set;
     /** store the headers that should not be stored in the cache */
     apr_array_header_t *ignore_headers;
+    /** environment header overrides **/
+    apr_table_t *override_headers;
     /* flag if CacheIgnoreHeader has been set */
     #define CACHE_IGNORE_HEADERS_SET   1
     #define CACHE_IGNORE_HEADERS_UNSET 0
@@ -256,6 +258,11 @@
 CACHE_DECLARE(char *) ap_cache_generate_name(apr_pool_t *p, int dirlevels, 
                                              int dirlength, 
                                              const char *name);
+CACHE_DECLARE(const char* )ap_cache_override_header(request_rec *r,
+                                                    apr_table_t *t, 
+                                                    const char* key);
+CACHE_DECLARE(apr_status_t )ap_cache_override_hdrs(request_rec *r,
+                                                   apr_table_t *t);
 CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r, 
cache_server_conf *conf, const char *url);
 CACHE_DECLARE(int) ap_cache_liststr(apr_pool_t *p, const char *list,
                                     const char *key, char **val);
diff -ru httpd-trunk.orig/modules/cache/mod_disk_cache.c 
httpd-trunk.new/modules/cache/mod_disk_cache.c
--- httpd-trunk.orig/modules/cache/mod_disk_cache.c     2005-08-09 
11:51:09.473251000 -0400
+++ httpd-trunk.new/modules/cache/mod_disk_cache.c      2005-08-18 
08:16:00.780610483 -0400
@@ -272,7 +272,7 @@
     return APR_SUCCESS;
 }
 
-static const char* regen_key(apr_pool_t *p, apr_table_t *headers,
+static const char* regen_key(request_rec *r, apr_table_t *headers,
                              apr_array_header_t *varray, const char *oldkey)
 {
     struct iovec *iov;
@@ -280,9 +280,8 @@
     int nvec;
     const char *header;
     const char **elts;
-
     nvec = (varray->nelts * 2) + 1;
-    iov = apr_palloc(p, sizeof(struct iovec) * nvec);
+    iov = apr_palloc(r->pool, sizeof(struct iovec) * nvec);
     elts = (const char **) varray->elts;
 
     /* TODO: 
@@ -308,9 +307,9 @@
      *     tokens (including the 100-continue token), and is case-sensitive for
      *     quoted-string expectation-extensions.
      */
-
     for(i=0, k=0; i < varray->nelts; i++) {
-        header = apr_table_get(headers, elts[i]);
+        header = ap_cache_override_header(r, headers, elts[i]);
+        
         if (!header) {
             header = "";
         }
@@ -325,7 +324,7 @@
     iov[k].iov_len = strlen(oldkey);
     k++;
 
-    return apr_pstrcatv(p, iov, k, NULL);
+    return apr_pstrcatv(r->pool, iov, k, NULL);
 }
 
 static int array_alphasort(const void *fn1, const void *fn2)
@@ -445,7 +444,7 @@
         }
         apr_file_close(dobj->hfd);
 
-        nkey = regen_key(r->pool, r->headers_in, varray, key);
+        nkey = regen_key(r, r->headers_in, varray, key);
 
         dobj->hashfile = NULL;
         dobj->prefix = dobj->hdrsfile;
@@ -804,7 +803,7 @@
             }
 
             dobj->tempfile = apr_pstrcat(r->pool, conf->cache_root, 
AP_TEMPFILE, NULL);
-            tmp = regen_key(r->pool, r->headers_in, varray, dobj->name);
+            tmp = regen_key(r, r->headers_in, varray, dobj->name);
             dobj->prefix = dobj->hdrsfile;
             dobj->hashfile = NULL;
             dobj->datafile = data_file(r->pool, conf, dobj, tmp);
@@ -870,6 +869,8 @@
 
         headers_in = ap_cache_cacheable_hdrs_out(r->pool, r->headers_in,
                                                  r->server);
+        ap_cache_override_hdrs(r, headers_in);
+
         rv = store_table(dobj->hfd, headers_in);
         if (rv != APR_SUCCESS) {
             return rv;

Reply via email to