From: Jim Jagielski Date: Thu, 21 Aug 2008 13:33:32 +0000 (+0000) Subject: Allow determination of whether to use ';' as X-Git-Tag: 2.3.0~339 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=45c5291a7fd6a54eaddcf3f84c0cafedf5390e5a;p=apache Allow determination of whether to use ';' as a sticky session path delim/sep (ala mod_jk) to be runtime (and balancer-wise) configurable. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@687754 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml index a87567b715..e7fbfb4f89 100644 --- a/docs/manual/mod/mod_proxy.xml +++ b/docs/manual/mod/mod_proxy.xml @@ -841,6 +841,13 @@ expressions and url encoded id (like servlet containers) use | to to separate them. The first part is for the cookie the second for the path. + scolonpathdelim + Off + If set to On the semi-colon character ';' will be + used as an additional sticky session path deliminator/separator. This + is mainly used to emulate mod_jk's behavior when dealing with paths such + as JSESSIONID=6736bcf34;foo=aabfa + timeout 0 Balancer timeout in seconds. If set this will be the maximum time diff --git a/include/ap_mmn.h b/include/ap_mmn.h index f87183a34e..fba2b24551 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -165,6 +165,7 @@ * 20080722.0 (2.3.0-dev) remove has_realm_hash() from authn_provider struct * 20080722.1 (2.3.0-dev) Add conn_timeout and conn_timeout_set to * proxy_worker struct. + * 20080722.2 (2.3.0-dev) Add scolonsep to proxy_balancer * */ @@ -173,7 +174,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20080722 #endif -#define MODULE_MAGIC_NUMBER_MINOR 1 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 2 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 9d77324317..1b2573ac3d 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -360,6 +360,18 @@ static const char *set_balancer_param(proxy_server_conf *conf, } return "unknown lbmethod"; } + else if (!strcasecmp(key, "scolonpathdelim")) { + /* If set to 'on' then ';' will also be + * used as a session path separator/delim (ala + * mod_jk) + */ + if (!strcasecmp(val, "on")) + balancer->scolonsep = 1; + else if (!strcasecmp(val, "off")) + balancer->scolonsep = 0; + else + return "scolonpathdelim must be On|Off"; + } else { return "unknown Balancer parameter"; } diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 1f1b1d5f39..58e052b805 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -382,6 +382,7 @@ struct proxy_balancer { #endif void *context; /* general purpose storage */ const char *sticky_path; /* URL sticky session identifier */ + int scolonsep; /* true if ';' seps sticky session paths */ }; struct proxy_balancer_method { diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index 6a0303f8d1..5971cb1acd 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -128,10 +128,14 @@ static int init_balancer_members(proxy_server_conf *conf, server_rec *s, * Something like 'JSESSIONID=12345...N' */ static char *get_path_param(apr_pool_t *pool, char *url, - const char *name) + const char *name, int scolon_sep) { char *path = NULL; + char *pathdelims = "?&"; + if (scolon_sep) { + pathdelims = ";?&"; + } for (path = strstr(url, name); path; path = strstr(path + 1, name)) { path += strlen(name); if (*path == '=') { @@ -141,7 +145,7 @@ static char *get_path_param(apr_pool_t *pool, char *url, ++path; if (strlen(path)) { char *q; - path = apr_strtok(apr_pstrdup(pool, path), ";?&", &q); + path = apr_strtok(apr_pstrdup(pool, path), pathdelims, &q); return path; } } @@ -261,7 +265,7 @@ static proxy_worker *find_session_route(proxy_balancer *balancer, if (!balancer->sticky) return NULL; /* Try to find the sticky route inside url */ - *route = get_path_param(r->pool, *url, balancer->sticky_path); + *route = get_path_param(r->pool, *url, balancer->sticky_path, balancer->scolonsep); if (*route) { ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy: BALANCER: Found value %s for "