Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuigi Pinca <luigipinca@gmail.com>2017-01-15 16:23:20 +0300
committerMyles Borins <myles.borins@gmail.com>2017-03-11 22:47:43 +0300
commit48b5097ea8e2b8e3a74f3b34a857d2f0519d0f28 (patch)
tree46b16555705914e39b43f015ae2ab93b2a49da12
parentf9e121ead847afa085c7b439f8e152f18738be54 (diff)
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: https://github.com/nodejs/node/issues/10812 PR-URL: https://github.com/nodejs/node/pull/10818 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
-rw-r--r--lib/_http_client.js6
-rw-r--r--test/parallel/test-http-abort-queued-2.js36
-rw-r--r--test/parallel/test-http-client-abort-no-agent.js19
-rw-r--r--test/parallel/test-http-client-abort-unix-socket.js24
4 files changed, 84 insertions, 1 deletions
diff --git a/lib/_http_client.js b/lib/_http_client.js
index 26590b9aec2..2002d2bc8ea 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 00000000000..77dc2a535b0
--- /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 00000000000..875d2ce6469
--- /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 00000000000..0b7c5e5ddea
--- /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();
+}));