Commit 116c1078 authored by Bill Stoddard's avatar Bill Stoddard
Browse files

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
parent c444519a
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -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;
    }