Index: modules/proxy/mod_proxy_balancer.c =================================================================== --- modules/proxy/mod_proxy_balancer.c (revision 1518262) +++ modules/proxy/mod_proxy_balancer.c (working copy) @@ -1178,7 +1178,7 @@ "%s: Lock failed for adding worker", bsel->s->name); } - ret = ap_proxy_define_worker(conf->pool, &nworker, bsel, conf, val, 0); + ret = ap_proxy_define_worker(conf->pool, &nworker, bsel, conf, val, 0, 0); if (!ret) { unsigned int index; proxy_worker_shared *shm; Index: modules/proxy/proxy_util.c =================================================================== --- modules/proxy/proxy_util.c (revision 1518262) +++ modules/proxy/proxy_util.c (working copy) @@ -1571,18 +1571,38 @@ proxy_balancer *balancer, proxy_server_conf *conf, const char *url, - int do_malloc) + int do_malloc, + unsigned int flags) { int rv; apr_uri_t uri; proxy_worker_shared *wshared; char *ptr; + int interpolated_scheme = FALSE; + char *scheme = NULL; + const char *c; + if (flags & PROXYPASS_INTERPOLATE) { + if (!strncmp(url, "${", 2)) { + c = ap_strchr_c(url, ':'); + if (c != NULL && *(c - 1) == '}') { + scheme = apr_pstrndup(p, url, c - url); + url = apr_pstrcat(p, "http", c, NULL); + interpolated_scheme = TRUE; + } + } + } + rv = apr_uri_parse(p, url, &uri); if (rv != APR_SUCCESS) { return "Unable to parse URL"; } + + if (interpolated_scheme) { + uri.scheme = scheme; + } + if (!uri.hostname || !uri.scheme) { return "URL must be absolute!"; } Index: modules/proxy/mod_proxy.c =================================================================== --- modules/proxy/mod_proxy.c (revision 1518262) +++ modules/proxy/mod_proxy.c (working copy) @@ -1536,7 +1536,7 @@ proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, r); int reuse = 0; if (!worker) { - const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r, 0); + const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r, 0, flags); if (err) return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL); @@ -2014,7 +2014,7 @@ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, APLOGNO(01147) "Defining worker '%s' for balancer '%s'", name, balancer->s->name); - if ((err = ap_proxy_define_worker(cmd->pool, &worker, balancer, conf, name, 0)) != NULL) + if ((err = ap_proxy_define_worker(cmd->pool, &worker, balancer, conf, name, 0, 0)) != NULL) return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL); ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, APLOGNO(01148) "Defined worker '%s' for balancer '%s'", @@ -2099,7 +2099,7 @@ if (!worker) { if (in_proxy_section) { err = ap_proxy_define_worker(cmd->pool, &worker, NULL, - conf, name, 0); + conf, name, 0, 0); if (err) return apr_pstrcat(cmd->temp_pool, "ProxySet ", err, NULL); @@ -2244,7 +2244,7 @@ conf->p); if (!worker) { err = ap_proxy_define_worker(cmd->pool, &worker, NULL, - sconf, conf->p, 0); + sconf, conf->p, 0, 0); if (err) return apr_pstrcat(cmd->temp_pool, thiscmd->name, " ", err, NULL); @@ -2542,7 +2542,7 @@ /* Create and initialize forward worker if defined */ if (conf->req_set && conf->req) { proxy_worker *forward; - ap_proxy_define_worker(p, &forward, NULL, NULL, "http://www.apache.org", 0); + ap_proxy_define_worker(p, &forward, NULL, NULL, "http://www.apache.org", 0, 0); conf->forward = forward; PROXY_STRNCPY(conf->forward->s->name, "proxy:forward"); PROXY_STRNCPY(conf->forward->s->hostname, "*"); @@ -2558,7 +2558,7 @@ conf->forward->s->is_address_reusable = 0; } if (!reverse) { - ap_proxy_define_worker(p, &reverse, NULL, NULL, "http://www.apache.org", 0); + ap_proxy_define_worker(p, &reverse, NULL, NULL, "http://www.apache.org", 0, 0); PROXY_STRNCPY(reverse->s->name, "proxy:reverse"); PROXY_STRNCPY(reverse->s->hostname, "*"); PROXY_STRNCPY(reverse->s->scheme, "*"); Index: modules/proxy/mod_proxy.h =================================================================== --- modules/proxy/mod_proxy.h (revision 1518262) +++ modules/proxy/mod_proxy.h (working copy) @@ -606,6 +606,12 @@ * @param conf current proxy server configuration * @param url url containing worker name * @param do_malloc true if shared struct should be malloced + * @param flags flags associated with the url + *
+ *       PROXYPASS_NOCANON
+ *       PROXYPASS_INTERPOLATE
+ *       PROXYPASS_NOQUERY
+ * 
* @return error message or NULL if successful (*worker is new worker) */ PROXY_DECLARE(char *) ap_proxy_define_worker(apr_pool_t *p, @@ -613,7 +619,8 @@ proxy_balancer *balancer, proxy_server_conf *conf, const char *url, - int do_malloc); + int do_malloc, + unsigned int flags); /** * Share a defined proxy worker via shm