diff --git a/pkgs/tools/networking/curl/7.88.0-http2-breakage.patch b/pkgs/tools/networking/curl/7.88.0-http2-breakage.patch index 8560d086b8ef..fd22299a7627 100644 --- a/pkgs/tools/networking/curl/7.88.0-http2-breakage.patch +++ b/pkgs/tools/networking/curl/7.88.0-http2-breakage.patch @@ -60,3 +60,42 @@ index 46fc746457726..1ef5d3949218f 100644 nread = retlen; DEBUGF(LOG_CF(data, cf, "[h2sid=%u] cf_h2_recv -> %zd", stream->stream_id, nread)); + + +From 87ed650d04dc1a6f7944a5d952f7d5b0934a19ac Mon Sep 17 00:00:00 2001 +From: Harry Sintonen +Date: Thu, 16 Feb 2023 06:26:26 +0200 +Subject: [PATCH] http2: set drain on stream end + +Ensure that on_frame_recv() stream end will trigger a read if there is +pending data. Without this it could happen that the pending data is +never consumed. + +This combined with https://github.com/curl/curl/pull/10529 should fix +https://github.com/curl/curl/issues/10525 + +Ref: https://github.com/curl/curl/issues/10525 +Closes #10530 +--- + lib/http2.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/lib/http2.c b/lib/http2.c +index 1ef5d3949218f..bdb5e7378e9cb 100644 +--- a/lib/http2.c ++++ b/lib/http2.c +@@ -868,6 +868,14 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame, + return NGHTTP2_ERR_CALLBACK_FAILURE; + } + } ++ if(frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { ++ /* Stream has ended. If there is pending data, ensure that read ++ will occur to consume it. */ ++ if(!data->state.drain && stream->memlen) { ++ drain_this(cf, data_s); ++ Curl_expire(data, 0, EXPIRE_RUN_NOW); ++ } ++ } + break; + case NGHTTP2_HEADERS: + DEBUGF(LOG_CF(data_s, cf, "[h2sid=%u] recv frame HEADERS", stream_id));