aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/_http_client.js2
-rw-r--r--test/parallel/test-http-agent-keepalive.js11
2 files changed, 12 insertions, 1 deletions
diff --git a/lib/_http_client.js b/lib/_http_client.js
index 67e14fae20..04d5a3f56e 100644
--- a/lib/_http_client.js
+++ b/lib/_http_client.js
@@ -506,6 +506,7 @@ function socketOnData(d) {
!statusIsInformational(parser.incoming.statusCode)) {
socket.removeListener('data', socketOnData);
socket.removeListener('end', socketOnEnd);
+ socket.removeListener('drain', ondrain);
freeParser(parser, req, socket);
}
}
@@ -613,6 +614,7 @@ function responseKeepAlive(res, req) {
}
socket.removeListener('close', socketCloseListener);
socket.removeListener('error', socketErrorListener);
+ socket.removeListener('drain', ondrain);
socket.once('error', freeSocketErrorListener);
// There are cases where _handle === null. Avoid those. Passing null to
// nextTick() will call getDefaultTriggerAsyncId() to retrieve the id.
diff --git a/test/parallel/test-http-agent-keepalive.js b/test/parallel/test-http-agent-keepalive.js
index 5902c58679..8cfc568b1e 100644
--- a/test/parallel/test-http-agent-keepalive.js
+++ b/test/parallel/test-http-agent-keepalive.js
@@ -52,7 +52,7 @@ function get(path, callback) {
port: server.address().port,
agent: agent,
path: path
- }, callback);
+ }, callback).on('socket', common.mustCall(checkListeners));
}
function checkDataAndSockets(body) {
@@ -134,3 +134,12 @@ server.listen(0, common.mustCall(() => {
}));
}));
}));
+
+// Check for listener leaks when reusing sockets.
+function checkListeners(socket) {
+ assert.strictEqual(socket.listenerCount('data'), 1);
+ assert.strictEqual(socket.listenerCount('drain'), 1);
+ assert.strictEqual(socket.listenerCount('error'), 1);
+ // Sockets have onReadableStreamEnd.
+ assert.strictEqual(socket.listenerCount('end'), 2);
+}