From: Sander Striker Date: Sun, 10 Apr 2005 13:39:03 +0000 (+0000) Subject: Backport. X-Git-Tag: 2.0.54~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc116ab05bae709ca97ac4e01f17801a8786fd76;p=thirdparty%2Fapache%2Fhttpd.git Backport. * 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 --- diff --git a/CHANGES b/CHANGES index b62069529df..da464354849 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,8 @@ Changes with Apache 2.0.54 + *) mod_cache: Add CacheIgnoreHeaders directive. PR 30399. + [Rüiger Plü ] + *) mod_ldap: Added the directive LDAPConnectionTimeout to configure the ldap socket connection timeout value. [Brad Nicholes] diff --git a/STATUS b/STATUS index 44d5d4c45f1..fd0a410603e 100644 --- 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. diff --git a/docs/manual/mod/mod_cache.xml b/docs/manual/mod/mod_cache.xml index b5b76c1a3b8..444c283d8ea 100644 --- a/docs/manual/mod/mod_cache.xml +++ b/docs/manual/mod/mod_cache.xml @@ -333,4 +333,57 @@ will complete caching the file even if the request is cancelled. + +CacheIgnoreHeaders +Do not store the given HTTP header(s) in the cache. + +CacheIgnoreHeaders header-string [header-string] ... +CacheIgnoreHeaders None +server configvirtual host + + + +

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 any case regardless of the + setting of CacheIgnoreHeaders:

+ +
    +
  • Connection
  • +
  • Keep-Alive
  • +
  • Proxy-Authenticate
  • +
  • Proxy-Authorization
  • +
  • TE
  • +
  • Trailers
  • +
  • Transfer-Encoding
  • +
  • Upgrade
  • +
+ +

CacheIgnoreHeaders 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.

+ +

CacheIgnoreHeaders 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), CacheIgnoreHeaders can be set to + None.

+ + Example 1 + CacheIgnoreHeaders Set-Cookie + + + Example 2 + CacheIgnoreHeaders None + + + Warning: + If headers like Expires which are needed for proper cache + management are not stored due to a + CacheIgnoreHeaders setting, the behaviour of + mod_cache is undefined. + +
+
+ diff --git a/modules/experimental/cache_util.c b/modules/experimental/cache_util.c index fb04679ae51..3442df0e2f8 100644 --- a/modules/experimental/cache_util.c +++ b/modules/experimental/cache_util.c @@ -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; } diff --git a/modules/experimental/mod_cache.c b/modules/experimental/mod_cache.c index 8e6fae09c27..1f648e48ce5 100644 --- a/modules/experimental/mod_cache.c +++ b/modules/experimental/mod_cache.c @@ -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"), diff --git a/modules/experimental/mod_cache.h b/modules/experimental/mod_cache.h index 9ca68087d0f..8a3e56d3088 100644 --- a/modules/experimental/mod_cache.h +++ b/modules/experimental/mod_cache.h @@ -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 diff --git a/modules/experimental/mod_disk_cache.c b/modules/experimental/mod_disk_cache.c index 1b624c528d7..6e8d0c58ba9 100644 --- a/modules/experimental/mod_disk_cache.c +++ b/modules/experimental/mod_disk_cache.c @@ -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; diff --git a/modules/experimental/mod_mem_cache.c b/modules/experimental/mod_mem_cache.c index ac4b8b1262d..d55ad1f3a0f 100644 --- a/modules/experimental/mod_mem_cache.c +++ b/modules/experimental/mod_mem_cache.c @@ -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; }