http: do not blindly destroy UNIX domain sockets

`Connection: keep-alive` is now properly supported when making client
connections to UNIX domain sockets so `request.abort()` should not
blindly destroy the underlying socket.

PR-URL: https://github.com/nodejs/node/pull/15650
Refs: https://github.com/nodejs/node/pull/13214#issuecomment-304049523
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
This commit is contained in:
Luigi Pinca 2017-09-28 10:30:07 +02:00 committed by Anatoli Papirovski
parent 88e55fe5e0
commit eb2fbd159f
No known key found for this signature in database
GPG Key ID: 614E2E1ABEB4B2C0
3 changed files with 39 additions and 1 deletions

View File

@ -663,7 +663,7 @@ 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.
if (req.socketPath || !req.agent) {
if (!req.agent) {
socket.destroy();
} else {
socket.emit('free');

View File

@ -0,0 +1,38 @@
'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());
const socketPath = common.PIPE;
common.refreshTmpDir();
server.listen(socketPath, common.mustCall(() => {
const agent = new Agent({
keepAlive: true,
maxSockets: 1
});
http.get({ agent, socketPath }, (res) => res.resume());
const req = http.get({ agent, socketPath }, common.mustNotCall());
req.abort();
http.get({ agent, socketPath }, common.mustCall((res) => {
res.resume();
assert.strictEqual(socketsCreated, 1);
agent.destroy();
server.close();
}));
}));