Commit 4ba5da4a authored by Sander Striker's avatar Sander Striker
Browse files

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
parent 79d3ec39
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
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]
+0 −11
Original line number Diff line number Diff line
@@ -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.
+53 −0
Original line number Diff line number Diff line
@@ -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>
+18 −1
Original line number Diff line number Diff line
@@ -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;
}
+38 −0
Original line number Diff line number Diff line
@@ -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"),
Loading