httpd/SOURCES/httpd-2.4.37-r1855391.patch

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;
}