On Tue, Oct 29, 2019 at 4:24 PM Rainer Jung <rainer.j...@kippdata.de> wrote: > > Thank you Yann. Let me know when I should test something. It's OK, if it > is not yet the final fix ;)
The attached patch seems to work for me..
Index: modules/proxy/mod_proxy_http.c =================================================================== --- modules/proxy/mod_proxy_http.c (revision 1869076) +++ modules/proxy/mod_proxy_http.c (working copy) @@ -648,9 +648,12 @@ static int ap_proxy_http_prefetch(proxy_http_req_t * us an instant C-L election if the body is of some * reasonable size. */ + apr_brigade_length(input_brigade, 1, &bytes_read); temp_brigade = apr_brigade_create(p, bucket_alloc); block = req->prefetch_nonblocking ? APR_NONBLOCK_READ : APR_BLOCK_READ; - do { + while ((bytes_read < MAX_MEM_SPOOL - 80) + && (APR_BRIGADE_EMPTY(input_brigade) + || !APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(input_brigade)))) { status = ap_get_brigade(r->input_filters, temp_brigade, AP_MODE_READBYTES, block, MAX_MEM_SPOOL - bytes_read); @@ -710,9 +713,7 @@ static int ap_proxy_http_prefetch(proxy_http_req_t * surrender once we hit 80 bytes less than MAX_MEM_SPOOL * (an arbitrary value.) */ - } while ((bytes_read < MAX_MEM_SPOOL - 80) - && !APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(input_brigade)) - && !req->prefetch_nonblocking); + } /* Use chunked request body encoding or send a content-length body? * @@ -2090,8 +2091,12 @@ static int proxy_http_handler(request_rec *r, prox * to reduce to the minimum the unavoidable local is_socket_connected() vs * remote keepalive race condition. */ - req->input_brigade = apr_brigade_create(p, req->bucket_alloc); req->header_brigade = apr_brigade_create(p, req->bucket_alloc); + apr_pool_userdata_get((void **)&req->input_brigade, "proxy-req-input", p); + if (req->input_brigade == NULL) { + req->input_brigade = apr_brigade_create(p, req->bucket_alloc); + apr_pool_userdata_setn(req->input_brigade, "proxy-req-input", NULL, p); + } if ((status = ap_proxy_http_prefetch(req, uri, locurl)) != OK) goto cleanup;