]> granicus.if.org Git - apache/commitdiff
Move to a different impl which was my 1st concept and that which
authorJim Jagielski <jim@apache.org>
Tue, 1 Nov 2005 16:15:09 +0000 (16:15 +0000)
committerJim Jagielski <jim@apache.org>
Tue, 1 Nov 2005 16:15:09 +0000 (16:15 +0000)
Ruediger likes. Instead of adjusting pointers to areas
within the URL, simply copy it over and change it as needed.
Easier logic and not that much slower for normal cases.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@330085 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
modules/proxy/proxy_util.c

diff --git a/CHANGES b/CHANGES
index edabbbbc5de6cb35bf8e1fc098305b9a9ef98627..dca2194cfe89f2e96e8d28a637aa52eea467df4e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,7 +4,7 @@ Changes with Apache 2.3.0
 
   *) mod_proxy_balancer: When finding best worker, use case insensitive
      match for scheme and host, but case sensitive for the rest of
-     the path. [Jim Jagielski]
+     the path. [Jim Jagielski, Ruediger Pluem]
 
   *) Asynchronous write completion for the Event MPM.  [Brian Pane]
 
index 3dc2e1d16c7cc2bf951eaff07a336653c2414b58..0fb499be5dda1674e5d29ff104fef9a185296791 100644 (file)
@@ -1216,26 +1216,33 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
     int max_match = 0;
     int url_length;
     int worker_name_length;
-    int sh_length;
     const char *c;
+    char *url_copy;
     int i;
 
     c = ap_strchr_c(url, ':');
     if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0')
        return NULL;
 
+    url_copy = apr_pstrdup(p, url);
     url_length = strlen(url);
 
     /*
      * We need to find the start of the path and
      * therefore we know the length of the scheme://hostname/
-     * part.
+     * part to we can force-lowercase everything up to
+     * the start of the path.
      */
     c = ap_strchr_c(c+3, '/');
-    if (c)
-        sh_length = c - url;
-    else
-        sh_length = url_length;
+    if (c) {
+        char *pathstart;
+        pathstart = url_copy + (c - url);
+        *pathstart = '\0';
+        ap_str_tolower(url_copy);
+        *pathstart = '/';
+    } else {
+        ap_str_tolower(url_copy);
+    }
     
     worker = (proxy_worker *)conf->workers->elts;
 
@@ -1244,22 +1251,9 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
      * fits best to the URL.
      */
     for (i = 0; i < conf->workers->nelts; i++) {
-        int prefix;
-        int bypass;
-        worker_name_length = strlen(worker->name);
-        if (worker_name_length <= sh_length) {
-            prefix = worker_name_length;
-            bypass = 1;
-        } else {
-            prefix = sh_length;
-            bypass = 0;
-        }
-        if ( (worker_name_length <= url_length)
+        if ( ((worker_name_length = strlen(worker->name)) <= url_length)
            && (worker_name_length > max_match)
-           && (strncasecmp(url, worker->name, prefix) == 0)
-           && (bypass || (strncmp(url + prefix, worker->name + prefix,
-                          worker_name_length - prefix) == 0)) )
-        {
+           && (strncmp(url_copy, worker->name, worker_name_length) == 0) ) {
             max_worker = worker;
             max_match = worker_name_length;
         }