]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
http2: set drain on stream end
authorHarry Sintonen <sintonen@iki.fi>
Thu, 16 Feb 2023 04:26:26 +0000 (06:26 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 16 Feb 2023 08:33:52 +0000 (09:33 +0100)
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

index 1ef5d3949218f19cfa6b41146701d6d986e92c5d..bdb5e7378e9cbda72fc8ba1b94dc1f204892845e 100644 (file)
@@ -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));