diff --git a/lib/_http_client.js b/lib/_http_client.js index 273460693b4561..59c4cac89e9d9d 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -390,11 +390,6 @@ function socketCloseListener() { const req = socket._httpMessage; debug('HTTP socket close'); - // Pull through final chunk, if anything is buffered. - // the ondata function will handle it properly, and this - // is a no-op if no final chunk remains. - socket.read(); - // NOTE: It's important to get parser here, because it could be freed by // the `socketOnData`. const parser = socket.parser; diff --git a/lib/internal/stream_base_commons.js b/lib/internal/stream_base_commons.js index 5254fc1553dd77..f126d66d04b297 100644 --- a/lib/internal/stream_base_commons.js +++ b/lib/internal/stream_base_commons.js @@ -205,6 +205,12 @@ function onStreamRead(arrayBuffer) { return; } + // After seeing EOF, most streams will be closed permanently, + // and will not deliver any more read events after this point. + // (equivalently, it should have called readStop on itself already). + // Some streams may be reset and explicitly started again with a call + // to readStart, such as TTY. + if (nread !== UV_EOF) { // CallJSOnreadMethod expects the return value to be a buffer. // Ref: https://github.com/nodejs/node/pull/34375 @@ -220,20 +226,6 @@ function onStreamRead(arrayBuffer) { if (stream[kMaybeDestroy]) stream.on('end', stream[kMaybeDestroy]); - // TODO(ronag): Without this `readStop`, `onStreamRead` - // will be called once more (i.e. after Readable.ended) - // on Windows causing a ECONNRESET, failing the - // test-https-truncate test. - if (handle.readStop) { - const err = handle.readStop(); - if (err) { - // CallJSOnreadMethod expects the return value to be a buffer. - // Ref: https://github.com/nodejs/node/pull/34375 - stream.destroy(errnoException(err, 'read')); - return; - } - } - // Push a null to signal the end of data. // Do it before `maybeDestroy` for correct order of events: // `end` -> `close` diff --git a/src/crypto/crypto_tls.cc b/src/crypto/crypto_tls.cc index 8efbdeed1d9fc6..cfe760adb3af1d 100644 --- a/src/crypto/crypto_tls.cc +++ b/src/crypto/crypto_tls.cc @@ -886,7 +886,7 @@ bool TLSWrap::IsClosing() { int TLSWrap::ReadStart() { Debug(this, "ReadStart()"); - if (underlying_stream() != nullptr) + if (underlying_stream() != nullptr && !eof_) return underlying_stream()->ReadStart(); return 0; } @@ -1049,14 +1049,17 @@ uv_buf_t TLSWrap::OnStreamAlloc(size_t suggested_size) { void TLSWrap::OnStreamRead(ssize_t nread, const uv_buf_t& buf) { Debug(this, "Read %zd bytes from underlying stream", nread); + + // Ignore everything after close_notify (rfc5246#section-7.2.1) + if (eof_) + return; + if (nread < 0) { // Error should be emitted only after all data was read ClearOut(); - // Ignore EOF if received close_notify if (nread == UV_EOF) { - if (eof_) - return; + // underlying stream already should have also called ReadStop on itself eof_ = true; }