From 5e84e6d6adaedba9d5a5a348cc0f5fb2f3ff9e3a Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Thu, 6 Dec 2012 13:59:32 +0000 Subject: [PATCH] Merge r1404653 from trunk: Allow for setting of sticky session split char... Bugz 53893 Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1417892 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ STATUS | 5 ----- docs/manual/mod/mod_proxy.xml | 7 +++++++ include/ap_mmn.h | 3 ++- modules/proxy/mod_proxy.c | 13 +++++++++++++ modules/proxy/mod_proxy.h | 1 + modules/proxy/mod_proxy_balancer.c | 7 ++++--- modules/proxy/proxy_util.c | 1 + 8 files changed, 31 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index a6aa0d7674..5522149eb4 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.4.4 + *) mod_proxy: Add ability to configure the sticky session separator. + PR 53893. [, Jim Jagielski] + *) mod_dumpio: Correctly log large messages PR 54179 [Marek Wianecki ] diff --git a/STATUS b/STATUS index d6f5364673..8c2e4dc234 100644 --- a/STATUS +++ b/STATUS @@ -91,11 +91,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_proxy: Allow for setting of sticky session split char... - PR 53893. - trunk patch: http://svn.apache.org/viewvc?rev=1404653&view=rev - 2.4.x patch: http://people.apache.org/~jim/patches/sticky-sep-2.4.patch - +1: jim, covener, sf PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml index 03da7881fc..e0a565ddc6 100644 --- a/docs/manual/mod/mod_proxy.xml +++ b/docs/manual/mod/mod_proxy.xml @@ -1060,6 +1060,13 @@ ProxyPass /mirror/foo http://backend.example.com and url encoded id (like servlet containers) use | to to separate them. The first part is for the cookie the second for the path. + stickysessionsep + "." + Sets the separation symbol in the session cookie. Some backend application servers + do not use the '.' as the symbol. For example the Oracle Weblogic server uses + '!'. The correct symbol can be set using this option. The setting of 'Off' + signifies that no symbol is used. + scolonpathdelim Off If set to On the semi-colon character ';' will be diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 42e349267a..81e9f8813f 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -397,6 +397,7 @@ * 20120211.5 (2.4.3-dev) Add missing HTTP status codes registered with IANA. * 20120211.6 (2.4.3-dev) Add ap_proxy_checkproxyblock2. * 20120211.7 (2.4.3-dev) Add ap_get_loadavg() + * 20120211.8 (2.4.3-dev) Add sticky_separator to proxy_balancer_shared struct. */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ @@ -404,7 +405,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20120211 #endif -#define MODULE_MAGIC_NUMBER_MINOR 7 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 8 /* 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 431efb87a0..8e346a0a94 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -287,6 +287,19 @@ static const char *set_balancer_param(proxy_server_conf *conf, PROXY_STRNCPY(balancer->s->sticky_path, path); } } + else if (!strcasecmp(key, "stickysessionsep")) { + /* separator/delimiter for sessionid and route, + * normally '.' + */ + if (strlen(val) != 1) { + if (!strcasecmp(val, "off")) + balancer->s->sticky_separator = 0; + else + return "stickysessionsep must be a single character or Off"; + } + else + balancer->s->sticky_separator = *val; + } else if (!strcasecmp(key, "nofailover")) { /* If set to 'on' the session will break * if the worker is in error state or diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 0bce506572..6e2fbb5253 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -425,6 +425,7 @@ typedef struct { unsigned int vhosted:1; unsigned int inactive:1; unsigned int forcerecovery:1; + char sticky_separator; /* separator for sessionid/route */ } proxy_balancer_shared; #define ALIGNED_PROXY_BALANCER_SHARED_SIZE (APR_ALIGN_DEFAULT(sizeof(proxy_balancer_shared))) diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index 1feb2d7cd0..bc82756b90 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -293,10 +293,11 @@ static proxy_worker *find_session_route(proxy_balancer *balancer, } } /* - * If we found a value for sticksession, find the first '.' within. - * Everything after '.' (if present) is our route. + * If we found a value for stickysession, find the first '.' (or whatever + * sticky_separator is set to) within. Everything after '.' (if present) + * is our route. */ - if ((*route) && ((*route = strchr(*route, '.')) != NULL )) + if ((*route) && (balancer->s->sticky_separator != 0) && ((*route = strchr(*route, balancer->s->sticky_separator)) != NULL )) (*route)++; if ((*route) && (**route)) { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01161) "Found route %s", *route); diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 4963dcea29..110a00d182 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1185,6 +1185,7 @@ PROXY_DECLARE(char *) ap_proxy_define_balancer(apr_pool_t *p, (*balancer)->hash = bshared->hash; bshared->forcerecovery = 1; + bshared->sticky_separator = '.'; *bshared->nonce = PROXY_UNSET_NONCE; /* impossible valid input */ (*balancer)->s = bshared; -- 2.50.1