On 01/29/2008 03:26 PM, [EMAIL PROTECTED] wrote: > Author: jim > Date: Tue Jan 29 06:26:20 2008 > New Revision: 616335 > > URL: http://svn.apache.org/viewvc?rev=616335&view=rev > Log: > Now let things like > > ProxyPassReverse /foo balancer://bar > > work "as expected" :) :)
I guess it may not in the case of members with the schemes ajp:// or fcgi:// :-). > > > Modified: > httpd/httpd/trunk/CHANGES > httpd/httpd/trunk/modules/proxy/proxy_util.c > > Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=616335&r1=616334&r2=616335&view=diff > ============================================================================== > --- httpd/httpd/trunk/modules/proxy/proxy_util.c (original) > +++ httpd/httpd/trunk/modules/proxy/proxy_util.c Tue Jan 29 06:26:20 2008 > @@ -1063,8 +1063,54 @@ > ent = (struct proxy_alias *)conf->raliases->elts; > } > for (i = 0; i < conf->raliases->nelts; i++) { > - l2 = strlen(ent[i].real); > - if (l1 >= l2 && strncasecmp(ent[i].real, url, l2) == 0) { > + proxy_server_conf *sconf = (proxy_server_conf *) > + ap_get_module_config(r->server->module_config, &proxy_module); > + proxy_balancer *balancer; > + const char *real; > + real = ent[i].real; > + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, > + "ppr: real: %s", real); > + /* > + * First check if mapping against a balancer and see > + * if we have such a entity. If so, then we need to > + * find the particulars of the actual worker which may > + * or may not be the right one... basically, we need > + * to find which member actually handled this request. > + */ > + if ((strncasecmp(real, "balancer:", 9) == 0) && > + (balancer = ap_proxy_get_balancer(r->pool, sconf, real))) { > + int n; > + proxy_worker *worker; > + worker = (proxy_worker *)balancer->workers->elts; > + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, > + "ppr: checking balancer: %s", > + balancer->name); > + for (n = 0; n < balancer->workers->nelts; n++) { > + if (worker->port) { > + u = apr_psprintf(r->pool, "%s://%s:%d/", worker->scheme, > + worker->hostname, worker->port); > + } > + else { > + u = apr_psprintf(r->pool, "%s://%s/", worker->scheme, > + worker->hostname); > + } > + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, > + "ppr: matching member (%s) and URL (%s)", > + u, url); > + > + l2 = strlen(u); > + if (l1 >= l2 && strncasecmp(u, url, l2) == 0) { > + u = apr_pstrcat(r->pool, ent[i].fake, &url[l2], NULL); > + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, > + "ppr: matched member (%s)", u); > + return ap_construct_url(r->pool, u, r); > + } > + worker++; > + } I guess we can shortcut here by return url; It seems unlikely that a backend server redirects to balancer:// > + } > + > + l2 = strlen(real); > + if (l1 >= l2 && strncasecmp(real, url, l2) == 0) { > u = apr_pstrcat(r->pool, ent[i].fake, &url[l2], NULL); > return ap_construct_url(r->pool, u, r); > } Regards RĂ¼diger
