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;