diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-09-02 02:32:15 +0300 |
---|---|---|
committer | Beth Griggs <Bethany.Griggs@uk.ibm.com> | 2019-10-01 21:41:58 +0300 |
commit | 69b0212df3495682e1dd1cac936a033d0117b900 (patch) | |
tree | 1a55a8e0131bdfcb6dd327cdceab6521bee91231 /src | |
parent | 36a0e9a06319210f7feff925840066e6bac7c3a4 (diff) |
http2: do not start reading after write if new write is on wire
Don’t start reading more input data if we’re still busy writing output.
This was overlooked in 8a4a1931b8b98.
Fixes: https://github.com/nodejs/node/issues/29353
Fixes: https://github.com/nodejs/node/issues/29393
PR-URL: https://github.com/nodejs/node/pull/29399
Backport-PR-URL: https://github.com/nodejs/node/pull/29619
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/node_http2.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/node_http2.cc b/src/node_http2.cc index 43d1c2ea9f2..cdf83350bb2 100644 --- a/src/node_http2.cc +++ b/src/node_http2.cc @@ -746,8 +746,10 @@ void Http2Session::Close(uint32_t code, bool socket_closed) { flags_ |= SESSION_STATE_CLOSING; // Stop reading on the i/o stream - if (stream_ != nullptr) + if (stream_ != nullptr) { + flags_ |= SESSION_STATE_READING_STOPPED; stream_->ReadStop(); + } // If the socket is not closed, then attempt to send a closing GOAWAY // frame. There is no guarantee that this GOAWAY will be received by @@ -1228,6 +1230,7 @@ int Http2Session::OnDataChunkReceived(nghttp2_session* handle, // If we are currently waiting for a write operation to finish, we should // tell nghttp2 that we want to wait before we process more input data. if (session->flags_ & SESSION_STATE_WRITE_IN_PROGRESS) { + CHECK_NE(session->flags_ & SESSION_STATE_READING_STOPPED, 0); session->flags_ |= SESSION_STATE_NGHTTP2_RECV_PAUSED; return NGHTTP2_ERR_PAUSE; } @@ -1616,6 +1619,7 @@ void Http2Session::OnStreamAfterWrite(WriteWrap* w, int status) { ClearOutgoing(status); if ((flags_ & SESSION_STATE_READING_STOPPED) && + !(flags_ & SESSION_STATE_WRITE_IN_PROGRESS) && nghttp2_session_want_read(session_)) { flags_ &= ~SESSION_STATE_READING_STOPPED; stream_->ReadStart(); |