]> granicus.if.org Git - apache/commitdiff
Allow determination of whether to use ';' as
authorJim Jagielski <jim@apache.org>
Thu, 21 Aug 2008 13:33:32 +0000 (13:33 +0000)
committerJim Jagielski <jim@apache.org>
Thu, 21 Aug 2008 13:33:32 +0000 (13:33 +0000)
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

docs/manual/mod/mod_proxy.xml
include/ap_mmn.h
modules/proxy/mod_proxy.c
modules/proxy/mod_proxy.h
modules/proxy/mod_proxy_balancer.c

index a87567b715291a52d060cff97615331366c22330..e7fbfb4f897a29a87e6ade07f6aee0828913231e 100644 (file)
@@ -841,6 +841,13 @@ expressions</description>
         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
index f87183a34e8810a2098fe7dc833129d58cb23566..fba2b245517133a55a658e41c2658a872438eeca 100644 (file)
  * 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
index 9d77324317317a502d16d2477c76a3ef3e5a5f4e..1b2573ac3dc72d0bbb54ebf054abeae9ab6861c9 100644 (file)
@@ -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";
     }
index 1f1b1d5f394018120888cd5177fd6733574af9a1..58e052b8058f68a15ddbb0f1ba5736e9e5d74652 100644 (file)
@@ -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 {
index 6a0303f8d1925d4972706ca5f60f8ff1001a8a44..5971cb1acdaea1cc37dbace2a01d3ebf20c6dce9 100644 (file)
@@ -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 "