aboutsummaryrefslogtreecommitdiff
path: root/lib/http2.c
diff options
context:
space:
mode:
authorJosie Huddleston <Josie.Huddleston@metaswitch.com>2019-05-29 15:21:26 +0100
committerDaniel Stenberg <daniel@haxx.se>2019-05-30 00:26:20 +0200
commit1c0e9527bad814f81dfbaf54eabdcb9e6fa95586 (patch)
tree4d497b88ebed99d9d1825105167e7f5f6f0c458e /lib/http2.c
parentbdf6d8af3e7be26ed9b49f6bfae986ec44964429 (diff)
http2: Stop drain from being permanently set on
Various functions called within Curl_http2_done() can have the side-effect of setting the Easy connection into drain mode (by calling drain_this()). However, the last time we unset this for a transfer (by calling drained_transfer()) is at the beginning of Curl_http2_done(). If the Curl_easy is reused for another transfer, it is then stuck in drain mode permanently, which in practice makes it unable to write any data in the new transfer. This fix moves the last call to drained_transfer() to later in Curl_http2_done(), after the functions that could potentially call for a drain. Fixes #3966 Closes #3967 Reported-by: Josie-H
Diffstat (limited to 'lib/http2.c')
-rw-r--r--lib/http2.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/http2.c b/lib/http2.c
index 8e7bc217e..a535d14bb 100644
--- a/lib/http2.c
+++ b/lib/http2.c
@@ -1199,9 +1199,6 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
if(!httpc->h2) /* not HTTP/2 ? */
return;
- if(data->state.drain)
- drained_transfer(data, httpc);
-
if(premature) {
/* RST_STREAM */
if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE,
@@ -1213,6 +1210,10 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
httpc->pause_stream_id = 0;
}
}
+
+ if(data->state.drain)
+ drained_transfer(data, httpc);
+
/* -1 means unassigned and 0 means cleared */
if(http->stream_id > 0) {
int rv = nghttp2_session_set_stream_user_data(httpc->h2,