summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/internal/streams/end-of-stream.js6
-rw-r--r--test/parallel/test-http-client-finished.js27
2 files changed, 33 insertions, 0 deletions
diff --git a/lib/internal/streams/end-of-stream.js b/lib/internal/streams/end-of-stream.js
index 850e5d3796..3f1c0f316c 100644
--- a/lib/internal/streams/end-of-stream.js
+++ b/lib/internal/streams/end-of-stream.js
@@ -82,12 +82,18 @@ function eos(stream, opts, callback) {
stream.on('close', onlegacyfinish);
}
+ // Not all streams will emit 'close' after 'aborted'.
+ if (typeof stream.aborted === 'boolean') {
+ stream.on('aborted', onclose);
+ }
+
stream.on('end', onend);
stream.on('finish', onfinish);
if (opts.error !== false) stream.on('error', onerror);
stream.on('close', onclose);
return function() {
+ stream.removeListener('aborted', onclose);
stream.removeListener('complete', onfinish);
stream.removeListener('abort', onclose);
stream.removeListener('request', onrequest);
diff --git a/test/parallel/test-http-client-finished.js b/test/parallel/test-http-client-finished.js
new file mode 100644
index 0000000000..2d7e5b95b3
--- /dev/null
+++ b/test/parallel/test-http-client-finished.js
@@ -0,0 +1,27 @@
+'use strict';
+const common = require('../common');
+const http = require('http');
+const { finished } = require('stream');
+
+{
+ // Test abort before finished.
+
+ const server = http.createServer(function(req, res) {
+ res.write('asd');
+ });
+
+ server.listen(0, common.mustCall(function() {
+ http.request({
+ port: this.address().port
+ })
+ .on('response', (res) => {
+ res.on('readable', () => {
+ res.destroy();
+ });
+ finished(res, common.mustCall(() => {
+ server.close();
+ }));
+ })
+ .end();
+ }));
+}