summaryrefslogtreecommitdiff
path: root/src/node_http2.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_http2.cc')
-rw-r--r--src/node_http2.cc6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/node_http2.cc b/src/node_http2.cc
index 1065a940f5..a5b834dc2c 100644
--- a/src/node_http2.cc
+++ b/src/node_http2.cc
@@ -742,8 +742,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
@@ -1192,6 +1194,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;
}
@@ -1546,6 +1549,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();