and url encoded id (like servlet containers) use | to to separate them.
The first part is for the cookie the second for the path.
</td></tr>
+ <tr><td>scolonpathdelim</td>
+ <td>Off</td>
+ <td>If set to <code>On</code> 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 <code>JSESSIONID=6736bcf34;foo=aabfa</code>
+ </td></tr>
<tr><td>timeout</td>
<td>0</td>
<td>Balancer timeout in seconds. If set this will be the maximum time
* 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
*
*/
#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
}
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";
}
#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 {
* 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 == '=') {
++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;
}
}
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 "