summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndré Malo <nd@apache.org>2003-03-22 23:15:40 +0100
committerAndré Malo <nd@apache.org>2003-03-22 23:15:40 +0100
commit986cb6b961a210f6145f4624caa5bf3fcf077713 (patch)
tree5b712cd7e0980adc4b19ac9e89be8137a53fe803
parentFix chinese default page. (diff)
downloadapache2-986cb6b961a210f6145f4624caa5bf3fcf077713.tar.xz
apache2-986cb6b961a210f6145f4624caa5bf3fcf077713.zip
Do not bypass output filters when redirecting subrequests internally.
PR: 17629 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@99042 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--CHANGES3
-rw-r--r--modules/http/http_request.c29
2 files changed, 27 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index db848cef4b..ad75a880e5 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@ Changes with Apache 2.1.0-dev
[Remove entries to the current 2.0 section below, when backported]
+ *) Do not bypass output filters when redirecting subrequests internally.
+ PR 17629. [André Malo]
+
*) OpenSSL headers should be included as "openssl/ssl.h", and not rely on
the INCLUDE path to be defined properly.
PR 11310. [Geoff Thrope <geoff@geoffthorpe.net>]
diff --git a/modules/http/http_request.c b/modules/http/http_request.c
index 0a21296db7..0817bba7b6 100644
--- a/modules/http/http_request.c
+++ b/modules/http/http_request.c
@@ -394,17 +394,27 @@ static request_rec *internal_internal_redirect(const char *new_uri,
new->proto_output_filters = r->proto_output_filters;
new->proto_input_filters = r->proto_input_filters;
- new->output_filters = new->proto_output_filters;
- new->input_filters = new->proto_input_filters;
-
if (new->main) {
+ new->output_filters = r->output_filters;
+ new->input_filters = r->input_filters;
+
/* Add back the subrequest filter, which we lost when
* we set output_filters to include only the protocol
* output filters from the original request.
+ *
+ * XXX: This shouldn't be neccessary any longer, because the filter
+ * is still in place -- isn't it?
*/
ap_add_output_filter_handle(ap_subreq_core_filter_handle,
NULL, new, new->connection);
}
+ else {
+ /* In subrequests we _must_ point to the complete upper request's
+ * filter chain, so skip the filters _only_ within the main request.
+ */
+ new->output_filters = new->proto_output_filters;
+ new->input_filters = new->proto_input_filters;
+ }
update_r_in_filters(new->input_filters, r, new);
update_r_in_filters(new->output_filters, r, new);
@@ -455,10 +465,19 @@ AP_DECLARE(void) ap_internal_fast_redirect(request_rec *rr, request_rec *r)
r->subprocess_env = apr_table_overlay(r->pool, rr->subprocess_env,
r->subprocess_env);
- r->output_filters = rr->output_filters;
- r->input_filters = rr->input_filters;
+ /* copy the filters _only_ within the main request. In subrequests
+ * we _must_ point to the upper requests' filter chain, so do not
+ * touch 'em!
+ */
+ if (!r->main) {
+ r->output_filters = rr->output_filters;
+ r->input_filters = rr->input_filters;
+ }
if (r->main) {
+ /* XXX: This shouldn't be neccessary any longer, because the filter
+ * is still in place -- isn't it?
+ */
ap_add_output_filter_handle(ap_subreq_core_filter_handle,
NULL, r, r->connection);
}