You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by ji...@apache.org on 2009/08/28 16:52:38 UTC

svn commit: r808907 - in /httpd/httpd/branches/2.2.x: CHANGES docs/manual/mod/mod_cache.xml modules/cache/cache_storage.c modules/cache/mod_cache.c modules/cache/mod_cache.h

Author: jim
Date: Fri Aug 28 14:52:38 2009
New Revision: 808907

URL: http://svn.apache.org/viewvc?rev=808907&view=rev
Log:
Ummm... update the code :)

Modified:
    httpd/httpd/branches/2.2.x/CHANGES
    httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml
    httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c
    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c
    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h

Modified: httpd/httpd/branches/2.2.x/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/CHANGES?rev=808907&r1=808906&r2=808907&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/CHANGES [utf-8] (original)
+++ httpd/httpd/branches/2.2.x/CHANGES [utf-8] Fri Aug 28 14:52:38 2009
@@ -1,8 +1,9 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.2.14
 
-  *) mod_cache: Added CacheIgnoreURLSessionIdentifiers directive to ignore
+  *) mod_cache: Add CacheIgnoreURLSessionIdentifiers directive to ignore
      defined session identifiers encoded in the URL when caching.
+     [Ruediger Pluem]
 
   *) mod_mem_cache: fix seg fault under load due to pool concurrency problem
      PR: 47672 [Dan Poirier <poirier pobox.com>]

Modified: httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml?rev=808907&r1=808906&r2=808907&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml (original)
+++ httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml Fri Aug 28 14:52:38 2009
@@ -415,6 +415,43 @@
 </directivesynopsis>
 
 <directivesynopsis>
+<name>CacheIgnoreURLSessionIdentifiers</name>
+<description>Ignore defined session identifiers encoded in the URL when caching
+</description>
+<syntax>CacheIgnoreURLSessionIdentifiers <var>identifier</var> [<var>identifier</var>] ...</syntax>
+<default>CacheIgnoreURLSessionIdentifiers None</default>
+<contextlist><context>server config</context><context>virtual host</context>
+</contextlist>
+
+<usage>
+    <p>Sometimes applications encode the session identifier into the URL like in the following
+    Examples:
+    </p>
+    <ul>
+      <li><code>/someapplication/image.gif;jsessionid=123456789</code></li>
+      <li><code>/someapplication/image.gif?PHPSESSIONID=12345678</code></li>
+    </ul>
+    <p>This causes cachable resources to be stored separately for each session, which
+    is often not desired. <directive>CacheIgnoreURLSessionIdentifiers</directive> lets
+    define a list of identifiers that are removed from the key that is used to identify
+    an entity in the cache, such that cachable resources are not stored separately for
+    each session.
+    </p>
+    <p><code>CacheIgnoreURLSessionIdentifiers None</code> clears the list of ignored
+    identifiers. Otherwise, each identifier is added to the list.</p>
+
+    <example><title>Example 1</title>
+      CacheIgnoreURLSessionIdentifiers jsessionid
+    </example>
+
+    <example><title>Example 2</title>
+      CacheIgnoreURLSessionIdentifiers None
+    </example>
+
+</usage>
+</directivesynopsis>
+
+<directivesynopsis>
 <name>CacheStorePrivate</name>
 <description>Attempt to cache responses that the server has marked as private</description>
 <syntax>CacheStorePrivate On|Off</syntax>

Modified: httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c?rev=808907&r1=808906&r2=808907&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c (original)
+++ httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c Fri Aug 28 14:52:38 2009
@@ -357,6 +357,7 @@
     char *port_str, *hn, *lcs;
     const char *hostname, *scheme;
     int i;
+    char *path, *querystring;
 
     cache = (cache_request_rec *) ap_get_module_config(r->request_config,
                                                        &cache_module);
@@ -474,14 +475,65 @@
         port_str = apr_psprintf(p, ":%u", ap_get_server_port(r));
     }
 
+    /*
+     * Check if we need to ignore session identifiers in the URL and do so
+     * if needed.
+     */
+    path = r->parsed_uri.path;
+    querystring = r->parsed_uri.query;
+    if (conf->ignore_session_id->nelts) {
+        int i;
+        char **identifier;
+
+        identifier = (char **)conf->ignore_session_id->elts;
+        for (i = 0; i < conf->ignore_session_id->nelts; i++, identifier++) {
+            int len;
+            char *param;
+
+            len = strlen(*identifier);
+            /*
+             * Check that we have a parameter separator in the last segment
+             * of the path and that the parameter matches our identifier
+             */
+            if ((param = strrchr(path, ';'))
+                && !strncmp(param + 1, *identifier, len)
+                && (*(param + len + 1) == '=')
+                && !strchr(param + len + 2, '/')) {
+                path = apr_pstrndup(p, path, param - path);
+                break;
+            }
+            /*
+             * Check if the identifier is in the querystring and cut it out.
+             */
+            if (querystring
+                && (param = strstr(querystring, *identifier))
+                && (*(param + len) == '=')
+                ) {
+                char *amp;
+
+                if (querystring != param) {
+                    querystring = apr_pstrndup(p, querystring,
+                                               param - querystring);
+                }
+                else {
+                    querystring = "";
+                }
+                if ((amp = strchr(param + len + 1, '&'))) {
+                    querystring = apr_pstrcat(p, querystring, amp + 1, NULL);
+                }
+                break;
+            }
+        }
+    }
+
     /* Key format is a URI, optionally without the query-string */
     if (conf->ignorequerystring) {
         *key = apr_pstrcat(p, scheme, "://", hostname, port_str,
-                           r->parsed_uri.path, "?", NULL);
+                           path, "?", NULL);
     }
     else {
         *key = apr_pstrcat(p, scheme, "://", hostname, port_str,
-                           r->parsed_uri.path, "?", r->parsed_uri.query, NULL);
+                           path, "?", querystring, NULL);
     }
 
     /*
@@ -493,6 +545,9 @@
      * handler during following requests.
      */
     cache->key = apr_pstrdup(r->pool, *key);
+    ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL,
+                 "cache: Key for entity %s?%s is %s", r->parsed_uri.path,
+                 r->parsed_uri.query, *key);
 
     return APR_SUCCESS;
 }

Modified: httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c?rev=808907&r1=808906&r2=808907&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c (original)
+++ httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c Fri Aug 28 14:52:38 2009
@@ -950,6 +950,9 @@
     /* flag indicating that query-string should be ignored when caching */
     ps->ignorequerystring = 0;
     ps->ignorequerystring_set = 0;
+    /* array of identifiers that should not be used for key calculation */
+    ps->ignore_session_id = apr_array_make(p, 10, sizeof(char *));
+    ps->ignore_session_id_set = CACHE_IGNORE_SESSION_ID_UNSET;
     return ps;
 }
 
@@ -999,6 +1002,10 @@
         (overrides->ignorequerystring_set == 0)
         ? base->ignorequerystring
         : overrides->ignorequerystring;
+    ps->ignore_session_id =
+        (overrides->ignore_session_id_set == CACHE_IGNORE_SESSION_ID_UNSET)
+        ? base->ignore_session_id
+        : overrides->ignore_session_id;
     return ps;
 }
 static const char *set_cache_ignore_no_last_mod(cmd_parms *parms, void *dummy,
@@ -1082,6 +1089,34 @@
     return NULL;
 }
 
+static const char *add_ignore_session_id(cmd_parms *parms, void *dummy,
+                                         const char *identifier)
+{
+    cache_server_conf *conf;
+    char **new;
+
+    conf =
+        (cache_server_conf *)ap_get_module_config(parms->server->module_config,
+                                                  &cache_module);
+    if (!strncasecmp(identifier, "None", 4)) {
+        /* if identifier None is listed clear array */
+        conf->ignore_session_id->nelts = 0;
+    }
+    else {
+        if ((conf->ignore_session_id_set == CACHE_IGNORE_SESSION_ID_UNSET) ||
+            (conf->ignore_session_id->nelts)) {
+            /*
+             * Only add identifier if no "None" has been found in identifier
+             * list so far.
+             */
+            new = (char **)apr_array_push(conf->ignore_session_id);
+            (*new) = (char *)identifier;
+        }
+    }
+    conf->ignore_session_id_set = CACHE_IGNORE_SESSION_ID_SET;
+    return NULL;
+}
+
 static const char *add_cache_enable(cmd_parms *parms, void *dummy,
                                     const char *type,
                                     const char *url)
@@ -1242,6 +1277,10 @@
     AP_INIT_FLAG("CacheIgnoreQueryString", set_cache_ignore_querystring,
                  NULL, RSRC_CONF,
                  "Ignore query-string when caching"),
+    AP_INIT_ITERATE("CacheIgnoreURLSessionIdentifiers", add_ignore_session_id,
+                    NULL, RSRC_CONF, "A space separated list of session "
+                    "identifiers that should be ignored for creating the key "
+                    "of the cached entity."),
     AP_INIT_TAKE1("CacheLastModifiedFactor", set_cache_factor, NULL, RSRC_CONF,
                   "The factor used to estimate Expires date from "
                   "LastModified date"),

Modified: httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h?rev=808907&r1=808906&r2=808907&view=diff
==============================================================================
--- httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h (original)
+++ httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h Fri Aug 28 14:52:38 2009
@@ -153,6 +153,12 @@
     /** ignore query-string when caching */
     int ignorequerystring;
     int ignorequerystring_set;
+    /** store the identifiers that should not be used for key calculation */
+    apr_array_header_t *ignore_session_id;
+    /* flag if CacheIgnoreURLSessionIdentifiers has been set */
+    #define CACHE_IGNORE_SESSION_ID_SET   1
+    #define CACHE_IGNORE_SESSION_ID_UNSET 0
+    int ignore_session_id_set;
 } cache_server_conf;
 
 /* cache info information */



Re: svn commit: r808907 - in /httpd/httpd/branches/2.2.x: CHANGES docs/manual/mod/mod_cache.xml modules/cache/cache_storage.c modules/cache/mod_cache.c modules/cache/mod_cache.h

Posted by Ruediger Pluem <rp...@apache.org>.

On 09/27/2009 02:39 AM, Jeff Trawick wrote:
> On Sat, Sep 26, 2009 at 8:10 PM, Ruediger Pluem <rp...@apache.org> wrote:
> 


> (in the case of cache, I thought the API was intended to be used by other
> modules, so I'm surprised the .h wasn't installed)

Would need to dig in svn history, but I guess we once stumbled across the same
thing in trunk and thus made it installed on trunk.

>> Nevertheless during the last extension of cache_server_conf I "missed" the
>> bump
>> as well: http://svn.apache.org/viewvc?view=rev&revision=539111
>> So I guess it is not big issue if we missed, but I should take more care in
>> the future if there really should have been one.
>>
>>
> About this particular structure...  Is mod_cache's server config considered
> part of the API, for cache plug-ins to look at directly?

Good question. Formal answer would be yes since it is in the public header (on trunk).

Regards

Rüdiger

Re: svn commit: r808907 - in /httpd/httpd/branches/2.2.x: CHANGES docs/manual/mod/mod_cache.xml modules/cache/cache_storage.c modules/cache/mod_cache.c modules/cache/mod_cache.h

Posted by Jeff Trawick <tr...@gmail.com>.
On Sat, Sep 26, 2009 at 8:10 PM, Ruediger Pluem <rp...@apache.org> wrote:

>
>
> On 09/26/2009 11:30 PM, Jeff Trawick wrote:
> > On Fri, Aug 28, 2009 at 10:52 AM, <ji...@apache.org> wrote:
> >
> >> Author: jim
> >> Date: Fri Aug 28 14:52:38 2009
> >> New Revision: 808907
> >>
> >> URL: http://svn.apache.org/viewvc?rev=808907&view=rev
> >> Log:
> >> Ummm... update the code :)
> >>
> >
> > Helpful log there, Jim ;)
> >
> >
> >> Modified:
> >>    httpd/httpd/branches/2.2.x/CHANGES
> >>    httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml
> >>    httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c
> >>    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c
> >>    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h
> >>
> >> Modified: httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h
> >> URL:
> >>
> http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h?rev=808907&r1=808906&r2=808907&view=diff
> >>
> >>
> ==============================================================================
> >> --- httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h (original)
> >> +++ httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h Fri Aug 28
> >> 14:52:38 2009
> >> @@ -153,6 +153,12 @@
> >>     /** ignore query-string when caching */
> >>     int ignorequerystring;
> >>     int ignorequerystring_set;
> >> +    /** store the identifiers that should not be used for key
> calculation
> >> */
> >> +    apr_array_header_t *ignore_session_id;
> >> +    /* flag if CacheIgnoreURLSessionIdentifiers has been set */
> >> +    #define CACHE_IGNORE_SESSION_ID_SET   1
> >> +    #define CACHE_IGNORE_SESSION_ID_UNSET 0
> >> +    int ignore_session_id_set;
> >>  } cache_server_conf;
> >>
> >
> > I see a past mmn bump when cache_server_conf was modified (r370101).
> >
> > Should it have been bumped for this?
>
> mod_cache.h is currently only a public header in trunk (copied to include
> directory
> by make install). It is not in 2.2.x. So I guess it is formally correct not
> to bump
>

makes sense


> (is it true that we do not need to bump for headers that don't end up in
> include ???)
>

that's my expectation

(in the case of cache, I thought the API was intended to be used by other
modules, so I'm surprised the .h wasn't installed)



> Nevertheless during the last extension of cache_server_conf I "missed" the
> bump
> as well: http://svn.apache.org/viewvc?view=rev&revision=539111
> So I guess it is not big issue if we missed, but I should take more care in
> the future if there really should have been one.
>
>
About this particular structure...  Is mod_cache's server config considered
part of the API, for cache plug-ins to look at directly?

Re: svn commit: r808907 - in /httpd/httpd/branches/2.2.x: CHANGES docs/manual/mod/mod_cache.xml modules/cache/cache_storage.c modules/cache/mod_cache.c modules/cache/mod_cache.h

Posted by Ruediger Pluem <rp...@apache.org>.

On 09/26/2009 11:30 PM, Jeff Trawick wrote:
> On Fri, Aug 28, 2009 at 10:52 AM, <ji...@apache.org> wrote:
> 
>> Author: jim
>> Date: Fri Aug 28 14:52:38 2009
>> New Revision: 808907
>>
>> URL: http://svn.apache.org/viewvc?rev=808907&view=rev
>> Log:
>> Ummm... update the code :)
>>
> 
> Helpful log there, Jim ;)
> 
> 
>> Modified:
>>    httpd/httpd/branches/2.2.x/CHANGES
>>    httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml
>>    httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c
>>    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c
>>    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h
>>
>> Modified: httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h
>> URL:
>> http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h?rev=808907&r1=808906&r2=808907&view=diff
>>
>> ==============================================================================
>> --- httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h (original)
>> +++ httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h Fri Aug 28
>> 14:52:38 2009
>> @@ -153,6 +153,12 @@
>>     /** ignore query-string when caching */
>>     int ignorequerystring;
>>     int ignorequerystring_set;
>> +    /** store the identifiers that should not be used for key calculation
>> */
>> +    apr_array_header_t *ignore_session_id;
>> +    /* flag if CacheIgnoreURLSessionIdentifiers has been set */
>> +    #define CACHE_IGNORE_SESSION_ID_SET   1
>> +    #define CACHE_IGNORE_SESSION_ID_UNSET 0
>> +    int ignore_session_id_set;
>>  } cache_server_conf;
>>
> 
> I see a past mmn bump when cache_server_conf was modified (r370101).
> 
> Should it have been bumped for this?

mod_cache.h is currently only a public header in trunk (copied to include directory
by make install). It is not in 2.2.x. So I guess it is formally correct not to bump
(is it true that we do not need to bump for headers that don't end up in include ???)
Nevertheless during the last extension of cache_server_conf I "missed" the bump
as well: http://svn.apache.org/viewvc?view=rev&revision=539111
So I guess it is not big issue if we missed, but I should take more care in
the future if there really should have been one.

Regards

Rüdiger


Re: svn commit: r808907 - in /httpd/httpd/branches/2.2.x: CHANGES docs/manual/mod/mod_cache.xml modules/cache/cache_storage.c modules/cache/mod_cache.c modules/cache/mod_cache.h

Posted by Jeff Trawick <tr...@gmail.com>.
On Fri, Aug 28, 2009 at 10:52 AM, <ji...@apache.org> wrote:

> Author: jim
> Date: Fri Aug 28 14:52:38 2009
> New Revision: 808907
>
> URL: http://svn.apache.org/viewvc?rev=808907&view=rev
> Log:
> Ummm... update the code :)
>

Helpful log there, Jim ;)


>
> Modified:
>    httpd/httpd/branches/2.2.x/CHANGES
>    httpd/httpd/branches/2.2.x/docs/manual/mod/mod_cache.xml
>    httpd/httpd/branches/2.2.x/modules/cache/cache_storage.c
>    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.c
>    httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h
>
> Modified: httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h?rev=808907&r1=808906&r2=808907&view=diff
>
> ==============================================================================
> --- httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h (original)
> +++ httpd/httpd/branches/2.2.x/modules/cache/mod_cache.h Fri Aug 28
> 14:52:38 2009
> @@ -153,6 +153,12 @@
>     /** ignore query-string when caching */
>     int ignorequerystring;
>     int ignorequerystring_set;
> +    /** store the identifiers that should not be used for key calculation
> */
> +    apr_array_header_t *ignore_session_id;
> +    /* flag if CacheIgnoreURLSessionIdentifiers has been set */
> +    #define CACHE_IGNORE_SESSION_ID_SET   1
> +    #define CACHE_IGNORE_SESSION_ID_UNSET 0
> +    int ignore_session_id_set;
>  } cache_server_conf;
>

I see a past mmn bump when cache_server_conf was modified (r370101).

Should it have been bumped for this?

(noticed in 2.2.13->2.2.14 changes)