You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by wr...@apache.org on 2009/05/05 08:44:03 UTC
svn commit: r771587 - /httpd/httpd/trunk/modules/proxy/proxy_util.c
Author: wrowe
Date: Tue May 5 06:44:02 2009
New Revision: 771587
URL: http://svn.apache.org/viewvc?rev=771587&view=rev
Log:
As mentioned inline in comments, correctly handle more sophisticated
transformations which currently fail for balancer://foo targets, but
work just fine with other ProxyReverse targets.
The balancer comparison is a bit trickier. Given the context
BalancerMember balancer://alias http://example.com/foo
ProxyPassReverse /bash balancer://alias/bar
translate url http://example.com/foo/bar/that to /bash/that
E.g. there may be several different url-suffixes (1st order) of any
particular BalancerMember set e.g. /app1, /app1 and /appbeta while
there may be additional suffixes associated with the actual
ProxyPassReverse directive. Neither were properly reversed, now
both should be properly handled.
One *critical* assumption;
BalancerMember balancer://alias/foo http://example.com/bar
should be documented as a meaningless construct, since one cannot
have two members, balancer://alias/foo and balancer://alias/bar,
and the balancer member structures discard this path.
Note one more existing error case as an XXX comment due to invalid
uri comparisons.
Modified:
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=771587&r1=771586&r2=771587&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Tue May 5 06:44:02 2009
@@ -1052,6 +1052,7 @@
/*
* XXX FIXME: Make sure this handled the ambiguous case of the :<PORT>
* after the hostname
+ * XXX FIXME: Ensure the /uri component is a case sensitive match
*/
if (r->proxyreq != PROXYREQ_REVERSE) {
return url;
@@ -1069,56 +1070,57 @@
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);
+ const char *real = ent[i].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.
- *
- * TODO: Recover the path from real and use that
- * for more exact matching
*/
- if ((strncasecmp(real, "balancer:", 9) == 0) &&
+ if ((strncasecmp(real, "balancer://", 11) == 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);
+ int n, l3;
+ proxy_worker *worker = (proxy_worker *)balancer->workers->elts;
+ const char *urlpart = ap_strchr_c(real + 11, '/');
+ if (urlpart) {
+ if (!urlpart[1])
+ urlpart = NULL;
+ else
+ l3 = strlen(urlpart);
+ }
+ /* The balancer comparison is a bit trickier. Given the context
+ * BalancerMember balancer://alias http://example.com/foo
+ * ProxyPassReverse /bash balancer://alias/bar
+ * translate url http://example.com/foo/bar/that to /bash/that
+ */
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);
+ l2 = strlen(worker->name);
+ if (urlpart) {
+ /* urlpart (l3) assuredly starts with its own '/' */
+ if (worker->name[l2 - 1] == '/')
+ --l2;
+ if (l1 >= l2 + l3
+ && strncasecmp(worker->name, url, l2) == 0
+ && strncmp(urlpart, url + l2, l3) == 0) {
+ u = apr_pstrcat(r->pool, ent[i].fake, &url[l2 + l3],
+ NULL);
+ return ap_construct_url(r->pool, u, r);
+ }
}
- 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) {
+ else if (l1 >= l2 && strncasecmp(worker->name, 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);
+ else {
+ 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);
+ }
}
}