From: Nick Kew Date: Wed, 10 Aug 2005 23:36:39 +0000 (+0000) Subject: Fix ProxyPassReverse & family to work correctly in X-Git-Tag: 2.1.7~5^2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d153de58fe86736ca712f53cd169c247072683a8;p=thirdparty%2Fapache%2Fhttpd.git Fix ProxyPassReverse & family to work correctly in git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@231355 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 8b38bb1f5cd..c470dec93d4 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -788,11 +788,6 @@ static void * create_proxy_config(apr_pool_t *p, server_rec *s) ps->sec_proxy = apr_array_make(p, 10, sizeof(ap_conf_vector_t *)); ps->proxies = apr_array_make(p, 10, sizeof(struct proxy_remote)); ps->aliases = apr_array_make(p, 10, sizeof(struct proxy_alias)); - ps->raliases = apr_array_make(p, 10, sizeof(struct proxy_alias)); - ps->cookie_paths = apr_array_make(p, 10, sizeof(struct proxy_alias)); - ps->cookie_domains = apr_array_make(p, 10, sizeof(struct proxy_alias)); - ps->cookie_path_str = apr_strmatch_precompile(p, "path=", 0); - ps->cookie_domain_str = apr_strmatch_precompile(p, "domain=", 0); ps->noproxies = apr_array_make(p, 10, sizeof(struct noproxy_entry)); ps->dirconn = apr_array_make(p, 10, sizeof(struct dirconn_entry)); ps->allowed_connect_ports = apr_array_make(p, 10, sizeof(int)); @@ -832,13 +827,6 @@ static void * merge_proxy_config(apr_pool_t *p, void *basev, void *overridesv) ps->proxies = apr_array_append(p, base->proxies, overrides->proxies); ps->sec_proxy = apr_array_append(p, base->sec_proxy, overrides->sec_proxy); ps->aliases = apr_array_append(p, base->aliases, overrides->aliases); - ps->raliases = apr_array_append(p, base->raliases, overrides->raliases); - ps->cookie_paths - = apr_array_append(p, base->cookie_paths, overrides->cookie_paths); - ps->cookie_domains - = apr_array_append(p, base->cookie_domains, overrides->cookie_domains); - ps->cookie_path_str = base->cookie_path_str; - ps->cookie_domain_str = base->cookie_domain_str; ps->noproxies = apr_array_append(p, base->noproxies, overrides->noproxies); ps->dirconn = apr_array_append(p, base->dirconn, overrides->dirconn); ps->allowed_connect_ports = apr_array_append(p, base->allowed_connect_ports, overrides->allowed_connect_ports); @@ -869,6 +857,13 @@ static void *create_proxy_dir_config(apr_pool_t *p, char *dummy) /* Filled in by proxysection, when applicable */ + /* Put these in the dir config so they work inside */ + new->raliases = apr_array_make(p, 10, sizeof(struct proxy_alias)); + new->cookie_paths = apr_array_make(p, 10, sizeof(struct proxy_alias)); + new->cookie_domains = apr_array_make(p, 10, sizeof(struct proxy_alias)); + new->cookie_path_str = apr_strmatch_precompile(p, "path=", 0); + new->cookie_domain_str = apr_strmatch_precompile(p, "domain=", 0); + return (void *) new; } @@ -880,6 +875,15 @@ static void *merge_proxy_dir_config(apr_pool_t *p, void *basev, void *addv) new->p = add->p; new->p_is_fnmatch = add->p_is_fnmatch; new->r = add->r; + + /* Put these in the dir config so they work inside */ + new->raliases = apr_array_append(p, base->raliases, overrides->raliases); + new->cookie_paths + = apr_array_append(p, base->cookie_paths, overrides->cookie_paths); + new->cookie_domains + = apr_array_append(p, base->cookie_domains, overrides->cookie_domains); + new->cookie_path_str = base->cookie_path_str; + new->cookie_domain_str = base->cookie_domain_str; return new; } @@ -1042,14 +1046,11 @@ static const char * } static const char * - add_pass_reverse(cmd_parms *cmd, void *dummy, const char *f, const char *r) + add_pass_reverse(cmd_parms *cmd, void *dconf, const char *f, const char *r) { - server_rec *s = cmd->server; - proxy_server_conf *conf; + proxy_dir_conf *conf = dconf; struct proxy_alias *new; - conf = (proxy_server_conf *)ap_get_module_config(s->module_config, - &proxy_module); if (r!=NULL && cmd->path == NULL ) { new = apr_array_push(conf->raliases); new->fake = f; @@ -1068,14 +1069,11 @@ static const char * return NULL; } static const char* - cookie_path(cmd_parms *cmd, void *dummy, const char *f, const char *r) + cookie_path(cmd_parms *cmd, void *dconf, const char *f, const char *r) { - server_rec *s = cmd->server; - proxy_server_conf *conf; + proxy_dir_conf *conf = dconf; struct proxy_alias *new; - conf = (proxy_server_conf *)ap_get_module_config(s->module_config, - &proxy_module); new = apr_array_push(conf->cookie_paths); new->fake = f; new->real = r; @@ -1083,14 +1081,11 @@ static const char* return NULL; } static const char* - cookie_domain(cmd_parms *cmd, void *dummy, const char *f, const char *r) + cookie_domain(cmd_parms *cmd, void *dconf, const char *f, const char *r) { - server_rec *s = cmd->server; - proxy_server_conf *conf; + proxy_dir_conf *conf = dconf; struct proxy_alias *new; - conf = (proxy_server_conf *)ap_get_module_config(s->module_config, - &proxy_module); new = apr_array_push(conf->cookie_domains); new->fake = f; new->real = r; diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 73afeb59f78..28c71da7a53 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -125,7 +125,6 @@ typedef struct { apr_array_header_t *proxies; apr_array_header_t *sec_proxy; apr_array_header_t *aliases; - apr_array_header_t *raliases; apr_array_header_t *noproxies; apr_array_header_t *dirconn; apr_array_header_t *allowed_connect_ports; @@ -173,10 +172,6 @@ typedef struct { * the strmatch_patterns are really a const just to have a * case-independent strstr. */ - apr_array_header_t* cookie_paths; - apr_array_header_t* cookie_domains; - const apr_strmatch_pattern* cookie_path_str; - const apr_strmatch_pattern* cookie_domain_str; enum { status_off, status_on, @@ -191,6 +186,19 @@ typedef struct { const char *p; /* The path */ int p_is_fnmatch; /* Is this path an fnmatch candidate? */ ap_regex_t *r; /* Is this a regex? */ + +/* ProxyPassReverse and friends are documented as working inside + * . But in fact they never have done in the case of + * more than one , because the server_conf can't see it. + * We need to move them to the per-dir config. + * Discussed in February: + * http://marc.theaimsgroup.com/?l=apache-httpd-dev&m=110726027118798&w=2 + */ + apr_array_header_t *raliases; + apr_array_header_t* cookie_paths; + apr_array_header_t* cookie_domains; + const apr_strmatch_pattern* cookie_path_str; + const apr_strmatch_pattern* cookie_domain_str; } proxy_dir_conf; typedef struct { diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index abd11f0ea0a..2f39d62676a 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -968,7 +968,7 @@ skip_body: return APR_SUCCESS; } -static void process_proxy_header(request_rec* r, proxy_server_conf* c, +static void process_proxy_header(request_rec* r, proxy_dir_conf* c, const char* key, const char* value) { static const char* date_hdrs[] @@ -1021,7 +1021,9 @@ static void ap_proxy_read_headers(request_rec *r, request_rec *rr, int saw_headers = 0; void *sconf = r->server->module_config; proxy_server_conf *psc; + proxy_dir_conf *dconf; + dconf = ap_get_module_config(r->per_dir_config, &proxy_module); psc = (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); r->headers_out = apr_table_make(r->pool, 20); @@ -1096,7 +1098,7 @@ end) * Modify headers requiring canonicalisation and/or affected * by ProxyPassReverse and family with process_proxy_header */ - process_proxy_header(r, psc, buffer, value) ; + process_proxy_header(r, dconf, buffer, value) ; saw_headers = 1; /* the header was too long; at the least we should skip extra data */