1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-24 09:08:49 -05:00

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
This commit is contained in:
Josie Huddleston 2019-05-29 15:21:26 +01:00 committed by Daniel Stenberg
parent bdf6d8af3e
commit 1c0e9527ba
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -1199,9 +1199,6 @@ void Curl_http2_done(struct connectdata *conn, bool premature)
if(!httpc->h2) /* not HTTP/2 ? */ if(!httpc->h2) /* not HTTP/2 ? */
return; return;
if(data->state.drain)
drained_transfer(data, httpc);
if(premature) { if(premature) {
/* RST_STREAM */ /* RST_STREAM */
if(!nghttp2_submit_rst_stream(httpc->h2, NGHTTP2_FLAG_NONE, 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; httpc->pause_stream_id = 0;
} }
} }
if(data->state.drain)
drained_transfer(data, httpc);
/* -1 means unassigned and 0 means cleared */ /* -1 means unassigned and 0 means cleared */
if(http->stream_id > 0) { if(http->stream_id > 0) {
int rv = nghttp2_session_set_stream_user_data(httpc->h2, int rv = nghttp2_session_set_stream_user_data(httpc->h2,