1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-07 04:02:58 +03:00

Fix a problem where we are doing a case insensitive

match between the worker and the URL. Instead, only
the scheme and hostname are insensitive, the rest
should be case sensitive.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@329849 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Jagielski
2005-10-31 16:31:29 +00:00
parent abc0d7d056
commit 9ab108491e
2 changed files with 32 additions and 2 deletions

View File

@@ -2,6 +2,10 @@
Changes with Apache 2.3.0 Changes with Apache 2.3.0
[Remove entries to the current 2.0 and 2.2 section below, when backported] [Remove entries to the current 2.0 and 2.2 section below, when backported]
*) 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]
*) Asynchronous write completion for the Event MPM. [Brian Pane] *) Asynchronous write completion for the Event MPM. [Brian Pane]
*) Added an End-Of-Request bucket type. The logging of a request and *) Added an End-Of-Request bucket type. The logging of a request and

View File

@@ -1216,6 +1216,7 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
int max_match = 0; int max_match = 0;
int url_length; int url_length;
int worker_name_length; int worker_name_length;
int sh_length;
const char *c; const char *c;
int i; int i;
@@ -1224,6 +1225,18 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
return NULL; return NULL;
url_length = strlen(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.
*/
c = ap_strchr_c(c+3, '/');
if (c)
sh_length = c - url;
else
sh_length = url_length;
worker = (proxy_worker *)conf->workers->elts; worker = (proxy_worker *)conf->workers->elts;
/* /*
@@ -1231,9 +1244,22 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
* fits best to the URL. * fits best to the URL.
*/ */
for (i = 0; i < conf->workers->nelts; i++) { for (i = 0; i < conf->workers->nelts; i++) {
if ( ((worker_name_length = strlen(worker->name)) <= url_length) 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)
&& (worker_name_length > max_match) && (worker_name_length > max_match)
&& (strncasecmp(url, worker->name, worker_name_length) == 0) ) { && (strncasecmp(url, worker->name, prefix) == 0)
&& (bypass || (strncmp(url + prefix, worker->name + prefix,
worker_name_length - prefix) == 0)) )
{
max_worker = worker; max_worker = worker;
max_match = worker_name_length; max_match = worker_name_length;
} }