On 10/31/2005 05:31 PM, [EMAIL PROTECTED] wrote:
> Author: jim
> Date: Mon Oct 31 08:31:29 2005
> New Revision: 329849
> 
> URL: http://svn.apache.org/viewcvs?rev=329849&view=rev
> Log:
> 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.
> 
> Modified:
>     httpd/httpd/trunk/CHANGES
>     httpd/httpd/trunk/modules/proxy/proxy_util.c


Thanks for looking into this. I think this is also related to PR36906.

Given the fact that the hostname and the schema already get lowercased by
ap_proxy_add_worker, wouldn't it be faster and clearer to do something like
the following (honest question, I do not know the answer and the best code 
should
go in):


PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
                                                  proxy_server_conf *conf,
                                                  const char *url)
{
    proxy_worker *worker;
    proxy_worker *max_worker = NULL;
    int max_match = 0;
    int url_length;
    int worker_name_length;
    const char *c;
    int i;
    char *url_copy;

    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_copy);

    /*
     * We need to find the start of the path and
     * and lowercase all characters before.
     */
    c = ap_strchr_c(c+3, '/');
    if (c) {
        *c = '\0';
        ap_str_tolower(url_copy);
        *c = '/';
    }
    else {
        ap_str_tolower(url_copy);
    }

    worker = (proxy_worker *)conf->workers->elts;

    /*
     * Do a "longest match" on the worker name to find the worker that
     * fits best to the URL.
     */
    for (i = 0; i < conf->workers->nelts; i++) {
        if ( ((worker_name_length = strlen(worker->name)) <= url_length)
           && (worker_name_length > max_match)
           && (strncmp(url_copy, worker->name, worker_name_length) == 0)) {
            max_worker = worker;
            max_match = worker_name_length;
        }
        worker++;
    }
    return max_worker;
}

Regards

Rüdiger

Reply via email to