From 043a5fcfc82884155bcb2afba2a82333b2f29c02 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Sat, 7 May 2022 16:56:37 -0500 Subject: [PATCH] Fix leaking listeners (#1295) (#1474) Since 8eeeec1 it seems listeners have been leaking on keep-alive sockets. Apparently abort() has been deprecated since v17, using close() the onSocketClose listener is properly removed, and by creating a new onData function I'm able to remove the 'data' listener too. --- src/index.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/index.js b/src/index.js index f5f39844e..513b05225 100644 --- a/src/index.js +++ b/src/index.js @@ -387,13 +387,7 @@ function fixResponseChunkedTransferBadEnding(request, errorCallback) { } }; - socket.prependListener('close', onSocketClose); - - request.on('abort', () => { - socket.removeListener('close', onSocketClose); - }); - - socket.on('data', buf => { + const onData = buf => { properLastChunkReceived = Buffer.compare(buf.slice(-5), LAST_CHUNK) === 0; // Sometimes final 0-length chunk and end of message code are in separate packets @@ -405,6 +399,14 @@ function fixResponseChunkedTransferBadEnding(request, errorCallback) { } previousChunk = buf; + }; + + socket.prependListener('close', onSocketClose); + socket.on('data', onData); + + request.on('close', () => { + socket.removeListener('close', onSocketClose); + socket.removeListener('data', onData); }); }); }