diff options
author | Stefan Eissing <stefan@eissing.org> | 2023-03-13 11:44:26 +0100 |
---|---|---|
committer | Jay Satiro <raysatiro@yahoo.com> | 2023-03-14 03:26:57 -0400 |
commit | 06f65f771b52122cf78a6ca3279686679d72bd8e (patch) | |
tree | b47a0795463341a0008c9d80a21e6225fb19077c /lib/http2.c | |
parent | 7caaeca6f634c1c19e01a3e8451e7de02115b2fb (diff) | |
download | curl-06f65f771b52122cf78a6ca3279686679d72bd8e.tar.gz |
http2: Use KEEP_SEND_HOLD for flow control in HTTP/2
- use the defined, but so far not used, KEEP_SEND_HOLD bit for flow
control based suspend of sending in transfers.
Prior to this change KEEP_SEND_PAUSE bit was used instead, but that can
interfere with pausing streams from the user side via curl_easy_pause.
Fixes https://github.com/curl/curl/issues/10751
Closes https://github.com/curl/curl/pull/10753
Diffstat (limited to 'lib/http2.c')
-rw-r--r-- | lib/http2.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/lib/http2.c b/lib/http2.c index 94250bf6e..b0ce87d98 100644 --- a/lib/http2.c +++ b/lib/http2.c @@ -958,12 +958,12 @@ static int on_frame_recv(nghttp2_session *session, const nghttp2_frame *frame, break; case NGHTTP2_WINDOW_UPDATE: DEBUGF(LOG_CF(data, cf, "[h2sid=%u] recv WINDOW_UPDATE", stream_id)); - if((data_s->req.keepon & KEEP_SEND_PAUSE) && + if((data_s->req.keepon & KEEP_SEND_HOLD) && (data_s->req.keepon & KEEP_SEND)) { - data_s->req.keepon &= ~KEEP_SEND_PAUSE; + data_s->req.keepon &= ~KEEP_SEND_HOLD; drain_this(cf, data_s); Curl_expire(data_s, 0, EXPIRE_RUN_NOW); - DEBUGF(LOG_CF(data, cf, "[h2sid=%u] unpausing after win update", + DEBUGF(LOG_CF(data, cf, "[h2sid=%u] un-holding after win update", stream_id)); } break; @@ -2055,8 +2055,8 @@ static ssize_t cf_h2_send(struct Curl_cfilter *cf, struct Curl_easy *data, /* We cannot upload more as the stream's remote window size * is 0. We need to receive WIN_UPDATEs before we can continue. */ - data->req.keepon |= KEEP_SEND_PAUSE; - DEBUGF(LOG_CF(data, cf, "[h2sid=%u] pausing send as remote flow " + data->req.keepon |= KEEP_SEND_HOLD; + DEBUGF(LOG_CF(data, cf, "[h2sid=%u] holding send as remote flow " "window is exhausted", stream->stream_id)); } } @@ -2189,7 +2189,7 @@ static int cf_h2_get_select_socks(struct Curl_cfilter *cf, /* we're (still uploading OR the HTTP/2 layer wants to send data) AND there's a window to send data in */ - if((((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND) || + if((((k->keepon & KEEP_SENDBITS) == KEEP_SEND) || nghttp2_session_want_write(ctx->h2)) && (nghttp2_session_get_remote_window_size(ctx->h2) && nghttp2_session_get_stream_remote_window_size(ctx->h2, |