Browse Source

http2: always EXPIRE_RUN_NOW unpaused http/2 transfers

- just increasing the http/2 flow window does not necessarily
  make a server send new data. It may already have exhausted
  the window before

Closes #11005
Stefan Eissing 1 year ago
parent
commit
5622e431ed
1 changed files with 9 additions and 0 deletions
  1. 9 0
      lib/http2.c

+ 9 - 0
lib/http2.c

@@ -2210,6 +2210,15 @@ static CURLcode http2_data_pause(struct Curl_cfilter *cf,
     if(result)
       return result;
 
+    if(!pause) {
+      /* Unpausing a h2 transfer, requires it to be run again. The server
+       * may send new DATA on us increasing the flow window, and it may
+       * not. We may have already buffered and exhausted the new window
+       * by operating on things in flight during the handling of other
+       * transfers. */
+      drain_stream(cf, data, stream);
+      Curl_expire(data, 0, EXPIRE_RUN_NOW);
+    }
     DEBUGF(infof(data, "Set HTTP/2 window size to %u for stream %u",
                  window, stream->id));