diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-08-24 20:42:11 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-08-26 15:22:04 +0200 |
commit | 6ab28486c3042bb1fec7f7714910def37c3a81ac (patch) | |
tree | 1ffc1b679218fd81a890f74556d01d96e51156c3 /lib/_http_server.js | |
parent | 698a29420f92844478101ec1fccdc81b46954e2e (diff) | |
download | android-node-v8-6ab28486c3042bb1fec7f7714910def37c3a81ac.tar.gz android-node-v8-6ab28486c3042bb1fec7f7714910def37c3a81ac.tar.bz2 android-node-v8-6ab28486c3042bb1fec7f7714910def37c3a81ac.zip |
http: reset parser.incoming when server request is finished
This resolves a memory leak for keep-alive connections and does not
regress in the way that 779a05d5d1bfe2eeb05386f did by waiting for
the incoming request to be finished before releasing the
`parser.incoming` object.
Refs: https://github.com/nodejs/node/pull/28646
Refs: https://github.com/nodejs/node/pull/29263
Fixes: https://github.com/nodejs/node/issues/9668
PR-URL: https://github.com/nodejs/node/pull/29297
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'lib/_http_server.js')
-rw-r--r-- | lib/_http_server.js | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/_http_server.js b/lib/_http_server.js index 862b7c970b..6dc29c855e 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -611,6 +611,19 @@ function onParserExecuteCommon(server, socket, parser, state, ret, d) { } } +function clearIncoming(req) { + req = req || this; + const parser = req.socket && req.socket.parser; + // Reset the .incoming property so that the request object can be gc'ed. + if (parser && parser.incoming === req) { + if (req.readableEnded) { + parser.incoming = null; + } else { + req.on('end', clearIncoming); + } + } +} + function resOnFinish(req, res, socket, state, server) { // Usually the first incoming element should be our request. it may // be that in the case abortIncoming() was called that the incoming @@ -618,6 +631,7 @@ function resOnFinish(req, res, socket, state, server) { assert(state.incoming.length === 0 || state.incoming[0] === req); state.incoming.shift(); + clearIncoming(req); // If the user never called req.read(), and didn't pipe() or // .resume() or .on('data'), then we call req._dump() so that the |