]> granicus.if.org Git - curl/commitdiff
http2: make sure to send after RST_STREAM
authorDaniel Stenberg <daniel@haxx.se>
Thu, 16 Aug 2018 11:21:11 +0000 (13:21 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 17 Aug 2018 21:16:55 +0000 (23:16 +0200)
If this is the last stream on this connection, the RST_STREAM might not
get pushed to the wire otherwise.

Fixes #2882
Closes #2887
Researched-by: Michael Kaufmann
lib/http2.c

index e9ec73a6dabffeb1e313684c990b12ec597d85ff..9380ca7cf6721ccc71dc167fb4593c6bb91b7285 100644 (file)
@@ -1146,6 +1146,9 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
   struct HTTP *http = data->req.protop;
   struct http_conn *httpc = &conn->proto.httpc;
 
+  if(!httpc->h2) /* not HTTP/2 ? */
+    return;
+
   if(data->state.drain)
     drained_transfer(data, httpc);
 
@@ -1166,8 +1169,10 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
 
   if(premature) {
     /* RST_STREAM */
-    nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE, http->stream_id,
-                              NGHTTP2_STREAM_CLOSED);
+    if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE,
+                                  http->stream_id, NGHTTP2_STREAM_CLOSED))
+      (void)nghttp2_session_send(httpc->h2);
+
     if(http->stream_id == httpc->pause_stream_id) {
       infof(data, "stopped the pause stream!\n");
       httpc->pause_stream_id = 0;