From: Bill Stoddard Date: Tue, 24 Jul 2001 17:24:05 +0000 (+0000) Subject: Fix problem with the previous patch to handle HEAD requests. Now, the X-Git-Tag: 2.0.22~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de06ddf627714f77386856a5e36e44570d1b604d;p=thirdparty%2Fapache%2Fhttpd.git 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 --- 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; }