diff --git a/CHANGES b/CHANGES index edabbbbc5d..dca2194cfe 100644 --- 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] diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 3dc2e1d16c..0fb499be5d 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -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; }