]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
http2: keep trying to send pending frames after req.upload_done
authorVyron Tsingaras <vyron@google.com>
Fri, 15 May 2020 06:30:18 +0000 (08:30 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 15 May 2020 13:49:18 +0000 (15:49 +0200)
Fixes #1410
Closes #5401

lib/http2.c

index 2f279f7cb27233097d493083a5e6d23d64fabd0e..e4733c94b0595984e06c41e1f798feda050ff85c 100644 (file)
@@ -1346,10 +1346,11 @@ CURLcode Curl_http2_done_sending(struct connectdata *conn)
 
     struct HTTP *stream = conn->data->req.protop;
 
+    struct http_conn *httpc = &conn->proto.httpc;
+    nghttp2_session *h2 = httpc->h2;
+
     if(stream->upload_left) {
       /* If the stream still thinks there's data left to upload. */
-      struct http_conn *httpc = &conn->proto.httpc;
-      nghttp2_session *h2 = httpc->h2;
 
       stream->upload_left = 0; /* DONE! */
 
@@ -1359,6 +1360,23 @@ CURLcode Curl_http2_done_sending(struct connectdata *conn)
 
       (void)h2_process_pending_input(conn, httpc, &result);
     }
+
+    /* If nghttp2 still has pending frames unsent */
+    if(nghttp2_session_want_write(h2)) {
+      struct Curl_easy *data = conn->data;
+      struct SingleRequest *k = &data->req;
+      int rv;
+
+      H2BUGF(infof(data, "HTTP/2 still wants to send data (easy %p)\n", data));
+
+      /* re-set KEEP_SEND to make sure we are called again */
+      k->keepon |= KEEP_SEND;
+
+      /* and attempt to send the pending frames */
+      rv = h2_session_send(data, h2);
+      if(rv != 0)
+        result = CURLE_SEND_ERROR;
+    }
   }
   return result;
 }