Return-Path: Delivered-To: apmail-httpd-cvs-archive@www.apache.org Received: (qmail 49967 invoked from network); 21 May 2009 10:43:05 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 21 May 2009 10:43:05 -0000 Received: (qmail 50214 invoked by uid 500); 21 May 2009 10:43:17 -0000 Delivered-To: apmail-httpd-cvs-archive@httpd.apache.org Received: (qmail 50098 invoked by uid 500); 21 May 2009 10:43:17 -0000 Mailing-List: contact cvs-help@httpd.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@httpd.apache.org list-help: list-unsubscribe: List-Post: List-Id: Delivered-To: mailing list cvs@httpd.apache.org Received: (qmail 50089 invoked by uid 99); 21 May 2009 10:43:17 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 21 May 2009 10:43:17 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 21 May 2009 10:43:15 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id CBEE8238888C; Thu, 21 May 2009 10:42:54 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r777042 - in /httpd/httpd/trunk: CHANGES docs/manual/mod/mod_cache.xml modules/cache/cache_storage.c modules/cache/mod_cache.c modules/cache/mod_cache.h Date: Thu, 21 May 2009 10:42:54 -0000 To: cvs@httpd.apache.org From: rpluem@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090521104254.CBEE8238888C@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: rpluem Date: Thu May 21 10:42:54 2009 New Revision: 777042 URL: http://svn.apache.org/viewvc?rev=777042&view=rev Log: * Add CacheIgnoreURLSessionIdentifiers directive to ignore defined session identifiers encoded in the URL when caching. Modified: httpd/httpd/trunk/CHANGES httpd/httpd/trunk/docs/manual/mod/mod_cache.xml httpd/httpd/trunk/modules/cache/cache_storage.c httpd/httpd/trunk/modules/cache/mod_cache.c httpd/httpd/trunk/modules/cache/mod_cache.h Modified: httpd/httpd/trunk/CHANGES URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=777042&r1=777041&r2=777042&view=diff ============================================================================== --- httpd/httpd/trunk/CHANGES [utf-8] (original) +++ httpd/httpd/trunk/CHANGES [utf-8] Thu May 21 10:42:54 2009 @@ -6,6 +6,10 @@ mod_proxy_ajp: Avoid delivering content from a previous request which failed to send a request body. PR 46949 [Ruediger Pluem] + *) mod_cache: Add CacheIgnoreURLSessionIdentifiers directive to ignore + defined session identifiers encoded in the URL when caching. + [Ruediger Pluem] + *) mod_rewrite: Fix the error string returned by RewriteRule. RewriteRule returned "RewriteCond: bad flag delimiters" when the 3rd argument of RewriteRule was not started with "[" or not ended with "]". Modified: httpd/httpd/trunk/docs/manual/mod/mod_cache.xml URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_cache.xml?rev=777042&r1=777041&r2=777042&view=diff ============================================================================== --- httpd/httpd/trunk/docs/manual/mod/mod_cache.xml (original) +++ httpd/httpd/trunk/docs/manual/mod/mod_cache.xml Thu May 21 10:42:54 2009 @@ -392,6 +392,41 @@ +CacheIgnoreURLSessionIdentifiers +Ignore defined session identifiers encoded in the URL when caching + +CacheIgnoreURLSessionIdentifiers identifier [identifier] ... +CacheIgnoreURLSessionIdentifiers None +server configvirtual host + + + +

Sometimes applications encode the session identifier into the URL like in the following + Examples: +

+
    +
  • /someapplication/image.gif;jsessionid=123456789
  • +
  • /someapplication/image.gif?PHPSESSIONID=12345678
  • +
+

This causes cachable resources to be stored separately for each session, which + is often not desired. CacheIgnoreURLSessionIdentifiers 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. +

+ + Example 1 + CacheIgnoreURLSessionIdentifiers jsessionid + + + Example 2 + CacheIgnoreURLSessionIdentifiers None + + +
+
+ + CacheStorePrivate Attempt to cache responses that the server has marked as private CacheStorePrivate On|Off Modified: httpd/httpd/trunk/modules/cache/cache_storage.c URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/cache_storage.c?rev=777042&r1=777041&r2=777042&view=diff ============================================================================== --- httpd/httpd/trunk/modules/cache/cache_storage.c (original) +++ httpd/httpd/trunk/modules/cache/cache_storage.c Thu May 21 10:42:54 2009 @@ -355,6 +355,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); @@ -472,14 +473,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_set == CACHE_IGNORE_SESSION_ID_SET) { + 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); } /* @@ -491,6 +543,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/trunk/modules/cache/mod_cache.c URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_cache.c?rev=777042&r1=777041&r2=777042&view=diff ============================================================================== --- httpd/httpd/trunk/modules/cache/mod_cache.c (original) +++ httpd/httpd/trunk/modules/cache/mod_cache.c Thu May 21 10:42:54 2009 @@ -952,6 +952,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; } @@ -1002,6 +1005,10 @@ (overrides->ignorequerystring_set == 0) ? base->ignorequerystring : overrides->ignorequerystring; + ps->ignore_session_id = + (overrides->ignore_session_id_set == CACHE_IGNORE_HEADERS_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, @@ -1085,6 +1092,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) @@ -1260,6 +1295,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/trunk/modules/cache/mod_cache.h URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/cache/mod_cache.h?rev=777042&r1=777041&r2=777042&view=diff ============================================================================== --- httpd/httpd/trunk/modules/cache/mod_cache.h (original) +++ httpd/httpd/trunk/modules/cache/mod_cache.h Thu May 21 10:42:54 2009 @@ -155,6 +155,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 */