From de06ddf627714f77386856a5e36e44570d1b604d Mon Sep 17 00:00:00 2001 From: Bill Stoddard Date: Tue, 24 Jul 2001 17:24:05 +0000 Subject: [PATCH] Fix problem with the previous patch to handle HEAD requests. Now, the header_filter will stay installed in the filter chain when processing HEAD requests to intercept and discard content bodys sent by poorly written handlers. This work also points out the need for an optimization in the content_length filter to not split the brigade if the next bucket in the brigade is an EOS. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89679 13f79535-47bb-0310-9956-ffa450edef68 --- modules/http/http_protocol.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/http/http_protocol.c b/modules/http/http_protocol.c index 0a2469aa687..6bc126e3417 100644 --- a/modules/http/http_protocol.c +++ b/modules/http/http_protocol.c @@ -1064,6 +1064,10 @@ static void fixup_vary(request_rec *r) } } +typedef struct header_filter_ctx { + int headers_sent; +} header_filter_ctx; + AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter( ap_filter_t *f, apr_bucket_brigade *b) @@ -1076,9 +1080,25 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter( apr_bucket *e; apr_bucket_brigade *b2; header_struct h; + header_filter_ctx *ctx = f->ctx; AP_DEBUG_ASSERT(!r->main); + /* Handlers -should- be smart enough not to send content on HEAD requests. + * To guard against poorly written handlers, leave the header_filter + * installed (but only for HEAD requests) to intercept and discard content + * after the headers have been sent. + */ + if (r->header_only) { + if (!ctx) { + ctx = f->ctx = apr_pcalloc(r->pool, sizeof(header_filter_ctx)); + } + else if (ctx->headers_sent) { + apr_brigade_destroy(b); + return OK; + } + } + APR_BRIGADE_FOREACH(e, b) { if (e->type == &ap_bucket_type_error) { ap_bucket_error *eb = e->data; @@ -1212,7 +1232,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter( if (r->header_only) { apr_brigade_destroy(b); - ap_remove_output_filter(f); + ctx->headers_sent = 1; return OK; } -- 2.47.2