mirror of
https://github.com/nodejs/node.git
synced 2026-11-09 15:11:11 -05:00
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:
1 parent
43e1278014
commit
49b8c4f08b
3 files changed
+23
-2
No files matched your search
@@ -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());
|
||||
|
||||
@@ -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.
|
||||
);
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user