49 lines
1.7 KiB
Diff
49 lines
1.7 KiB
Diff
diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c
|
|
index 27c44b2..bfa8952 100644
|
|
--- a/modules/http/http_filters.c
|
|
+++ b/modules/http/http_filters.c
|
|
@@ -1290,6 +1290,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f,
|
|
request_rec *r = f->r;
|
|
conn_rec *c = r->connection;
|
|
const char *clheader;
|
|
+ int header_only = (r->header_only || AP_STATUS_IS_HEADER_ONLY(r->status));
|
|
const char *protocol = NULL;
|
|
apr_bucket *e;
|
|
apr_bucket_brigade *b2;
|
|
@@ -1307,7 +1308,7 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f,
|
|
}
|
|
else if (ctx->headers_sent) {
|
|
/* Eat body if response must not have one. */
|
|
- if (r->header_only || AP_STATUS_IS_HEADER_ONLY(r->status)) {
|
|
+ if (header_only) {
|
|
/* Still next filters may be waiting for EOS, so pass it (alone)
|
|
* when encountered and be done with this filter.
|
|
*/
|
|
@@ -1526,14 +1527,21 @@ AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f,
|
|
|
|
terminate_header(b2);
|
|
|
|
- rv = ap_pass_brigade(f->next, b2);
|
|
- if (rv != APR_SUCCESS) {
|
|
- goto out;
|
|
+ if (header_only) {
|
|
+ e = APR_BRIGADE_LAST(b);
|
|
+ if (e != APR_BRIGADE_SENTINEL(b) && APR_BUCKET_IS_EOS(e)) {
|
|
+ APR_BUCKET_REMOVE(e);
|
|
+ APR_BRIGADE_INSERT_TAIL(b2, e);
|
|
+ ap_remove_output_filter(f);
|
|
+ }
|
|
+ apr_brigade_cleanup(b);
|
|
}
|
|
+
|
|
+ rv = ap_pass_brigade(f->next, b2);
|
|
+ apr_brigade_cleanup(b2);
|
|
ctx->headers_sent = 1;
|
|
|
|
- if (r->header_only || AP_STATUS_IS_HEADER_ONLY(r->status)) {
|
|
- apr_brigade_cleanup(b);
|
|
+ if (rv != APR_SUCCESS || header_only) {
|
|
goto out;
|
|
}
|
|
|