]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Fix problem with the previous patch to handle HEAD requests. Now, the
authorBill Stoddard <stoddard@apache.org>
Tue, 24 Jul 2001 17:24:05 +0000 (17:24 +0000)
committerBill Stoddard <stoddard@apache.org>
Tue, 24 Jul 2001 17:24:05 +0000 (17:24 +0000)
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

index 0a2469aa687b5e0fb505743242e449b688f643a2..6bc126e34176482f2276e79c3f2a648a63c91d42 100644 (file)
@@ -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;
     }