From: Bill Stoddard Date: Fri, 16 May 2003 14:11:40 +0000 (+0000) Subject: Do not bypass output filters when redirecting subrequests internally. X-Git-Tag: 2.0.46~78 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f688c148696e8be3fac83ae54b97f6ce146a590a;p=thirdparty%2Fapache%2Fhttpd.git Do not bypass output filters when redirecting subrequests internally. PR: 17629 (Port of nd's patch from Apache 2.1) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/APACHE_2_0_BRANCH@99858 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/http/http_request.c b/modules/http/http_request.c index 0a21296db73..0817bba7b6d 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); }