*) 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]
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;
* 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;
}