summaryrefslogtreecommitdiff
path: root/lib/_http_server.js
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-08-24 20:42:11 +0200
committerAnna Henningsen <anna@addaleax.net>2019-08-26 15:22:04 +0200
commit6ab28486c3042bb1fec7f7714910def37c3a81ac (patch)
tree1ffc1b679218fd81a890f74556d01d96e51156c3 /lib/_http_server.js
parent698a29420f92844478101ec1fccdc81b46954e2e (diff)
downloadandroid-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.js14
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