diff --git a/lib/_http_client.js b/lib/_http_client.js index 26590b9aec2e23..2002d2bc8ea512 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -530,7 +530,11 @@ ClientRequest.prototype.onSocket = function(socket) { function onSocketNT(req, socket) { if (req.aborted) { // If we were aborted while waiting for a socket, skip the whole thing. - socket.emit('free'); + if (req.socketPath || !req.agent) { + socket.destroy(); + } else { + socket.emit('free'); + } } else { tickOnSocket(req, socket); } diff --git a/test/parallel/test-http-abort-queued-2.js b/test/parallel/test-http-abort-queued-2.js new file mode 100644 index 00000000000000..77dc2a535b0e4f --- /dev/null +++ b/test/parallel/test-http-abort-queued-2.js @@ -0,0 +1,36 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); + +let socketsCreated = 0; + +class Agent extends http.Agent { + createConnection(options, oncreate) { + const socket = super.createConnection(options, oncreate); + socketsCreated++; + return socket; + } +} + +const server = http.createServer((req, res) => res.end()); + +server.listen(0, common.mustCall(() => { + const port = server.address().port; + const agent = new Agent({ + keepAlive: true, + maxSockets: 1 + }); + + http.get({agent, port}, (res) => res.resume()); + + const req = http.get({agent, port}, common.fail); + req.abort(); + + http.get({agent, port}, common.mustCall((res) => { + res.resume(); + assert.strictEqual(socketsCreated, 1); + agent.destroy(); + server.close(); + })); +})); diff --git a/test/parallel/test-http-client-abort-no-agent.js b/test/parallel/test-http-client-abort-no-agent.js new file mode 100644 index 00000000000000..875d2ce6469d46 --- /dev/null +++ b/test/parallel/test-http-client-abort-no-agent.js @@ -0,0 +1,19 @@ +'use strict'; +const common = require('../common'); +const http = require('http'); +const net = require('net'); + +const server = http.createServer(common.fail); + +server.listen(0, common.mustCall(() => { + const req = http.get({ + createConnection(options, oncreate) { + const socket = net.createConnection(options, oncreate); + socket.once('close', () => server.close()); + return socket; + }, + port: server.address().port + }); + + req.abort(); +})); diff --git a/test/parallel/test-http-client-abort-unix-socket.js b/test/parallel/test-http-client-abort-unix-socket.js new file mode 100644 index 00000000000000..0b7c5e5ddea6dd --- /dev/null +++ b/test/parallel/test-http-client-abort-unix-socket.js @@ -0,0 +1,24 @@ +'use strict'; +const common = require('../common'); +const http = require('http'); + +const server = http.createServer(common.fail); + +class Agent extends http.Agent { + createConnection(options, oncreate) { + const socket = super.createConnection(options, oncreate); + socket.once('close', () => server.close()); + return socket; + } +} + +common.refreshTmpDir(); + +server.listen(common.PIPE, common.mustCall(() => { + const req = http.get({ + agent: new Agent(), + socketPath: common.PIPE + }); + + req.abort(); +}));