From: Jim Jagielski Date: Mon, 7 Apr 2008 15:37:50 +0000 (+0000) Subject: Merge r616335 from trunk: X-Git-Tag: 2.2.9~259 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0c914f06773d558ff2a29e6aebfa4c3bd4413c25;p=thirdparty%2Fapache%2Fhttpd.git Merge r616335 from trunk: Now let things like ProxyPassReverse /foo balancer://bar work "as expected" :) :) Reviewed by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@645569 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 1b3d8d7566c..eb13ec3fe2f 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.9 + *) ProxyPassReverse is now balancer aware. [Jim Jagielski] + *) mod_include: Correctly handle SSI directives split over multiple filter passes. PR 44447 [Harald Niesche ] diff --git a/STATUS b/STATUS index 51048ef9f22..a587047ed11 100644 --- a/STATUS +++ b/STATUS @@ -87,13 +87,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_proxy: Make ProxyPassReverse balancer aware; a common config - confusion issue. - Trunk version of patch: - http://svn.apache.org/viewvc?view=rev&revision=616335 - Backport version for 2.2.x of patch: - Trunk version works (minus CHANGES conflict) - +1: jim, rpluem, niq PATCHES PROPOSED TO BACKPORT FROM TRUNK: [ New proposals should be added at the end of the list ] diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 910f3610b9a..fb2c40a09c6 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1053,8 +1053,54 @@ PROXY_DECLARE(const char *) ap_proxy_location_reverse_map(request_rec *r, l1 = strlen(url); 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++; + } + } + + 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); }