diff options
Diffstat (limited to 'net-misc/curl/files/curl-8.1.1-hanging-http2.patch')
-rw-r--r-- | net-misc/curl/files/curl-8.1.1-hanging-http2.patch | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/net-misc/curl/files/curl-8.1.1-hanging-http2.patch b/net-misc/curl/files/curl-8.1.1-hanging-http2.patch new file mode 100644 index 000000000000..4777c4dd35ed --- /dev/null +++ b/net-misc/curl/files/curl-8.1.1-hanging-http2.patch @@ -0,0 +1,36 @@ +https://github.com/curl/curl/commit/5c58cb0212bcf63cce33a974906bf9905948b4bb +From: Stefan Eissing <stefan@eissing.org> +Date: Wed, 24 May 2023 18:48:16 +0200 +Subject: [PATCH] http2: fix EOF handling on uploads with auth negotiation + +- doing a POST with `--digest` does an override on the initial request + with `Content-Length: 0`, but the http2 filter was unaware of that + and expected the originally request body. It did therefore not + send a final DATA frame with EOF flag to the server. +- The fix overrides any initial notion of post size when the `done_send` + event is triggered by the transfer loop, leading to the EOF that + is necessary. +- refs #11194. The fault did not happen in testing, as Apache httpd + never tries to read the request body of the initial request, + sends the 401 reply and closes the stream. The server used in the + reported issue however tried to read the EOF and timed out on the + request. + +Reported-by: Aleksander Mazur +Fixes #11194 +Cloes #11200 +--- a/lib/http2.c ++++ b/lib/http2.c +@@ -1527,10 +1527,8 @@ static CURLcode http2_data_done_send(struct Curl_cfilter *cf, + if(!stream->send_closed) { + stream->send_closed = TRUE; + if(stream->upload_left) { +- /* If we operated with unknown length, we now know that everything +- * that is buffered is all we have to send. */ +- if(stream->upload_left == -1) +- stream->upload_left = Curl_bufq_len(&stream->sendbuf); ++ /* we now know that everything that is buffered is all there is. */ ++ stream->upload_left = Curl_bufq_len(&stream->sendbuf); + /* resume sending here to trigger the callback to get called again so + that it can signal EOF to nghttp2 */ + (void)nghttp2_session_resume_data(ctx->h2, stream->id); |