From d5577f0395bf746c1fd1042798f31cf874c8d296 Mon Sep 17 00:00:00 2001 From: Luigi Pinca Date: Sun, 10 Feb 2019 11:34:34 +0100 Subject: [PATCH] http: remove default 'timeout' listener on upgrade Remove the default listener of the `'timeout'` event from the socket before emitting the `'connect'` or `'upgrade'` event. PR-URL: https://github.com/nodejs/node/pull/26030 Fixes: https://github.com/nodejs/node/issues/23857 Reviewed-By: James M Snell Reviewed-By: Matteo Collina Reviewed-By: Rich Trott --- lib/_http_client.js | 4 ++++ lib/_http_server.js | 1 + test/parallel/test-http-connect.js | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/_http_client.js b/lib/_http_client.js index 5555db13623553..4af23fa8c574f0 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -465,6 +465,10 @@ function socketOnData(d) { socket.removeListener('data', socketOnData); socket.removeListener('end', socketOnEnd); socket.removeListener('drain', ondrain); + + if (req.timeoutCb) + socket.removeListener('timeout', req.timeoutCb); + parser.finish(); freeParser(parser, req, socket); diff --git a/lib/_http_server.js b/lib/_http_server.js index 39a49fedc39c1a..f82685e2be4bcd 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -568,6 +568,7 @@ function onParserExecuteCommon(server, socket, parser, state, ret, d) { socket.removeListener('drain', state.onDrain); socket.removeListener('drain', ondrain); socket.removeListener('error', socketOnError); + socket.removeListener('timeout', socketOnTimeout); unconsume(parser, socket); parser.finish(); freeParser(parser, req, socket); diff --git a/test/parallel/test-http-connect.js b/test/parallel/test-http-connect.js index 6483c93dd70204..be853de347e0cb 100644 --- a/test/parallel/test-http-connect.js +++ b/test/parallel/test-http-connect.js @@ -36,6 +36,7 @@ server.on('connect', common.mustCall((req, socket, firstBodyChunk) => { assert.strictEqual(socket.listenerCount('data'), 0); assert.strictEqual(socket.listenerCount('end'), 1); assert.strictEqual(socket.listenerCount('error'), 0); + assert.strictEqual(socket.listenerCount('timeout'), 0); socket.write('HTTP/1.1 200 Connection established\r\n\r\n'); @@ -53,7 +54,8 @@ server.listen(0, common.mustCall(() => { const req = http.request({ port: server.address().port, method: 'CONNECT', - path: 'google.com:443' + path: 'google.com:443', + timeout: 20000 }, common.mustNotCall()); req.on('socket', common.mustCall((socket) => { @@ -80,6 +82,7 @@ server.listen(0, common.mustCall(() => { assert.strictEqual(socket.listenerCount('close'), 0); assert.strictEqual(socket.listenerCount('error'), 0); assert.strictEqual(socket.listenerCount('agentRemove'), 0); + assert.strictEqual(socket.listenerCount('timeout'), 0); let data = firstBodyChunk.toString(); socket.on('data', (buf) => {