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