From 732f60dc2c97a388a2f22efbe128aece959debad Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Thu, 9 Feb 2012 15:07:22 +0000 Subject: [PATCH] Handle cases, esp when using mod_proxy_fcgi, when we do not want SCRIPT_FILENAME to include the query string. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1242351 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual/mod/mod_proxy.xml | 7 ++++++- modules/proxy/mod_proxy.c | 6 ++++++ modules/proxy/mod_proxy.h | 1 + modules/proxy/mod_proxy_fcgi.c | 2 +- server/util_script.c | 10 +++++++++- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/manual/mod/mod_proxy.xml b/docs/manual/mod/mod_proxy.xml index 75e65f46a4..11f2fa0ec0 100644 --- a/docs/manual/mod/mod_proxy.xml +++ b/docs/manual/mod/mod_proxy.xml @@ -735,7 +735,7 @@ expressions ProxyPass Maps remote servers into the local server URL-space ProxyPass [path] !|url [key=value - [key=value ...]] [nocanon] [interpolate] + [key=value ...]] [nocanon] [interpolate] [noquery] server configvirtual host directory @@ -1152,6 +1152,11 @@ expressions so you may still have to resort to mod_rewrite for complex rules.

+

Normally, mod_proxy will include the query string when + generating the SCRIPT_FILENAME environment variable. + The optional noquery keyword (available in + httpd 2.4.1 and later) prevents this.

+

When used inside a Location section, the first argument is omitted and the local directory is obtained from the notes, "proxy-nocanon", "1"); } + if (ent->flags & PROXYPASS_NOQUERY) { + apr_table_setn(r->notes, "proxy-noquery", "1"); + } return OK; } @@ -1394,6 +1397,9 @@ static const char * else if (!strcasecmp(word,"interpolate")) { flags |= PROXYPASS_INTERPOLATE; } + else if (!strcasecmp(word,"noquery")) { + flags |= PROXYPASS_NOQUERY; + } else { char *val = strchr(word, '='); if (!val) { diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 285de4222c..5348d02a1f 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -106,6 +106,7 @@ struct proxy_remote { #define PROXYPASS_NOCANON 0x01 #define PROXYPASS_INTERPOLATE 0x02 +#define PROXYPASS_NOQUERY 0x04 struct proxy_alias { const char *real; const char *fake; diff --git a/modules/proxy/mod_proxy_fcgi.c b/modules/proxy/mod_proxy_fcgi.c index 3d08f5144e..d0df5fa12f 100644 --- a/modules/proxy/mod_proxy_fcgi.c +++ b/modules/proxy/mod_proxy_fcgi.c @@ -188,7 +188,7 @@ static apr_status_t send_data(proxy_conn_rec *conn, while (to_write) { apr_size_t n = 0; rv = apr_socket_sendv(s, vec + offset, nvec - offset, &n); - if (rv != APR_SUCCESS) { + if ((rv != APR_SUCCESS) && !APR_STATUS_IS_EAGAIN(rv)) { break; } if (n > 0) { diff --git a/server/util_script.c b/server/util_script.c index 38dfa0efbd..3f7d847a7d 100644 --- a/server/util_script.c +++ b/server/util_script.c @@ -144,6 +144,7 @@ AP_DECLARE(void) ap_add_common_vars(request_rec *r) const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts; int i; apr_port_t rport; + char *q; /* use a temporary apr_table_t which we'll overlap onto * r->subprocess_env later @@ -241,7 +242,14 @@ AP_DECLARE(void) ap_add_common_vars(request_rec *r) apr_table_addn(e, "CONTEXT_PREFIX", ap_context_prefix(r)); apr_table_addn(e, "CONTEXT_DOCUMENT_ROOT", ap_context_document_root(r)); apr_table_addn(e, "SERVER_ADMIN", s->server_admin); /* Apache */ - apr_table_addn(e, "SCRIPT_FILENAME", r->filename); /* Apache */ + if (apr_table_get(r->notes, "proxy-noquery") && (q = ap_strchr(r->filename, '?'))) { + *q = '\0'; + apr_table_addn(e, "SCRIPT_FILENAME", apr_pstrdup(r->pool, r->filename)); + *q = '?'; + } + else { + apr_table_addn(e, "SCRIPT_FILENAME", r->filename); /* Apache */ + } rport = c->client_addr->port; apr_table_addn(e, "REMOTE_PORT", apr_itoa(r->pool, rport)); -- 2.40.0