From 986cb6b961a210f6145f4624caa5bf3fcf077713 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9=20Malo?= Date: Sat, 22 Mar 2003 22:15:40 +0000 Subject: [PATCH] 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 --- CHANGES | 3 +++ modules/http/http_request.c | 29 ++++++++++++++++++++++++----- 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 ] 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); } -- 2.40.0