]> granicus.if.org Git - apache/commitdiff
Allow for "magic" scheme "auto" which makes the scheme of
authorJim Jagielski <jim@apache.org>
Fri, 13 Jun 2014 21:10:51 +0000 (21:10 +0000)
committerJim Jagielski <jim@apache.org>
Fri, 13 Jun 2014 21:10:51 +0000 (21:10 +0000)
the backend worker match whatever the scheme of the
incoming request was...

For example:

   ProxyPass / auto://foo.example.com/

If the incoming request is http:.../lala then
the resultant will be http://foo.example.com/lala

If it's wws:.../lolo then we'd send
wws://foo.example.com/lolo

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1602523 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/mod_proxy.c
modules/proxy/proxy_util.c

index 559c5c767c4aa05ef8d8c25998873188011c33f6..569d54c9c02bb98ee0804a380b121f1d7f79eda4 100644 (file)
@@ -1045,6 +1045,11 @@ static int proxy_handler(request_rec *r)
     }
 
     scheme = apr_pstrndup(r->pool, uri, p - uri);
+
+    if (strcmp(scheme, "auto") == 0) {
+        apr_table_set(r->notes, "auto", uri);
+        uri = apr_pstrcat(r->pool, ap_http_scheme(r), p, NULL);
+    }
     /* Check URI's destination host against NoProxy hosts */
     /* Bypass ProxyRemote server lookup if configured as NoProxy */
     for (direct_connect = i = 0; i < conf->dirconn->nelts &&
@@ -1151,8 +1156,8 @@ static int proxy_handler(request_rec *r)
 
         /* handle the scheme */
         ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01143)
-                      "Running scheme %s handler (attempt %d)",
-                      scheme, attempts);
+                      "Running scheme %s handler for %s (attempt %d)",
+                      scheme, url, attempts);
         AP_PROXY_RUN(r, worker, conf, url, attempts);
         access_status = proxy_run_scheme_handler(r, worker, conf,
                                                  url, NULL, 0);
@@ -1479,7 +1484,7 @@ static const char *
 
 static char *de_socketfy(apr_pool_t *p, char *url)
 {
-    char *ptr;
+    char *ptr, *ret = url;
     /*
      * We could be passed a URL during the config stage that contains
      * the UDS path... ignore it
@@ -1487,7 +1492,7 @@ static char *de_socketfy(apr_pool_t *p, char *url)
     if (!strncasecmp(url, "unix:", 5) &&
         ((ptr = ap_strchr(url, '|')) != NULL)) {
         /* move past the 'unix:...|' UDS path info */
-        char *ret, *c;
+        char *c;
 
         ret = ptr + 1;
         /* special case: "unix:....|scheme:" is OK, expand
@@ -1498,13 +1503,10 @@ static char *de_socketfy(apr_pool_t *p, char *url)
             return NULL;
         }
         if (c[1] == '\0') {
-            return apr_pstrcat(p, ret, "//localhost", NULL);
-        }
-        else {
-            return ret;
+            ret = apr_pstrcat(p, ret, "//localhost", NULL);
         }
     }
-    return url;
+    return ret;
 }
 
 static const char *
index 8e2942f1a1eab75777707c39a3e91322d492681e..f9475045694920bcdad7277d1de63ec844674928 100644 (file)
@@ -1907,7 +1907,11 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker,
 
     access_status = proxy_run_pre_request(worker, balancer, r, conf, url);
     if (access_status == DECLINED && *balancer == NULL) {
-        *worker = ap_proxy_get_worker(r->pool, NULL, conf, *url);
+        const char *murl;
+        if ((murl = apr_table_get(r->notes, "auto")) == NULL) {
+            murl = *url;
+        }
+        *worker = ap_proxy_get_worker(r->pool, NULL, conf, murl);
         if (*worker) {
             ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
                           "%s: found worker %s for %s",