mirror of
https://github.com/curl/curl.git
synced 2026-08-25 23:13:38 +03:00
http2: do flow window accounting for cancelled streams
- nghttp2 does not free connection level window flow for aborted streams - when closing transfers, make sure that any buffered response data is "given back" to the flow control window - add tests test_02_22 and test_02_23 to reproduce Closes #11052
This commit is contained in:
parent
b0edf0b7da
commit
a9b7f72bc9
3 changed files with 162 additions and 33 deletions
15
lib/http2.c
15
lib/http2.c
|
|
@ -160,6 +160,9 @@ static void cf_h2_ctx_free(struct cf_h2_ctx *ctx)
|
|||
}
|
||||
}
|
||||
|
||||
static CURLcode h2_progress_egress(struct Curl_cfilter *cf,
|
||||
struct Curl_easy *data);
|
||||
|
||||
/**
|
||||
* All about the H3 internals of a stream
|
||||
*/
|
||||
|
|
@ -272,6 +275,16 @@ static void http2_data_done(struct Curl_cfilter *cf,
|
|||
stream->id, NGHTTP2_STREAM_CLOSED))
|
||||
(void)nghttp2_session_send(ctx->h2);
|
||||
}
|
||||
if(!Curl_bufq_is_empty(&stream->recvbuf)) {
|
||||
/* Anything in the recvbuf is still being counted
|
||||
* in stream and connection window flow control. Need
|
||||
* to free that space or the connection window might get
|
||||
* exhausted eventually. */
|
||||
nghttp2_session_consume(ctx->h2, stream->id,
|
||||
Curl_bufq_len(&stream->recvbuf));
|
||||
/* give WINDOW_UPATE a chance to be sent */
|
||||
h2_progress_egress(cf, data);
|
||||
}
|
||||
|
||||
/* -1 means unassigned and 0 means cleared */
|
||||
if(nghttp2_session_get_stream_user_data(ctx->h2, stream->id)) {
|
||||
|
|
@ -1825,7 +1838,7 @@ out:
|
|||
ctx->h2, stream->id),
|
||||
nghttp2_session_get_stream_effective_local_window_size(
|
||||
ctx->h2, stream->id),
|
||||
nghttp2_session_get_effective_local_window_size(ctx->h2),
|
||||
nghttp2_session_get_local_window_size(ctx->h2),
|
||||
HTTP2_HUGE_WINDOW_SIZE));
|
||||
|
||||
CF_DATA_RESTORE(cf, save);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue