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:
4
CHANGES
4
CHANGES
@@ -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
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user