stream: stricter isReadableNodeStream

Fixes: https://github.com/nodejs/node/issues/40938

PR-URL: https://github.com/nodejs/node/pull/40941
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Robert Nagy authored and GitHub committed 2021-11-26 17:33:05 +00:00
1 parent 43e1278014
commit 49b8c4f08b
3 files changed
+23 -2

No files matched your search

+1 -1
View File
@@ -118,7 +118,7 @@ function eos(stream, options, callback) {
return callback.call(stream, errored);
}
if (readable && !readableFinished) {
if (readable && !readableFinished && isReadableNodeStream(stream, true)) {
if (!isReadableFinished(stream, false))
return callback.call(stream,
new ERR_STREAM_PREMATURE_CLOSE());
+5 -1
View File
@@ -9,11 +9,15 @@ const {
const kDestroyed = Symbol('kDestroyed');
const kIsDisturbed = Symbol('kIsDisturbed');
function isReadableNodeStream(obj) {
function isReadableNodeStream(obj, strict = false) {
return !!(
obj &&
typeof obj.pipe === 'function' &&
typeof obj.on === 'function' &&
(
!strict ||
(typeof obj.pause === 'function' && typeof obj.resume === 'function')
) &&
(!obj._writableState || obj._readableState?.readable !== false) && // Duplex
(!obj._writableState || obj._readableState) // Writable has .pipe.
);
+17
View File
@@ -643,3 +643,20 @@ testClosed((opts) => new Writable({ write() {}, ...opts }));
const s = new Stream();
finished(s, common.mustNotCall());
}
{
const server = http.createServer(common.mustCall(function(req, res) {
fs.createReadStream(__filename).pipe(res);
finished(res, common.mustCall(function(err) {
assert.strictEqual(err, undefined);
}));
})).listen(0, function() {
http.request(
{ method: 'GET', port: this.address().port },
common.mustCall(function(res) {
res.resume();
server.close();
})
).end();
});
}