Skip to content
Permalink
Browse files

http: make request.abort() destroy the socket

`request.abort()` did not destroy the socket if it was called
before a socket was assigned to the request and the request
did not use an `Agent` or a Unix Domain Socket was used.

Fixes: #10812
PR-URL: #10818
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information...
lpinca committed Jan 15, 2017
1 parent 06ecf4d commit 18d4ee97d812259eb11069614246c9adc5b9f719
@@ -643,7 +643,11 @@ ClientRequest.prototype.onSocket = function onSocket(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);
}
@@ -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();
}));
}));
@@ -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();
}));
@@ -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();
}));

0 comments on commit 18d4ee9

Please sign in to comment.
You can’t perform that action at this time.