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 /test/parallel/test-http-server-keepalive-req-gc.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 'test/parallel/test-http-server-keepalive-req-gc.js')
-rw-r--r-- | test/parallel/test-http-server-keepalive-req-gc.js | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/test/parallel/test-http-server-keepalive-req-gc.js b/test/parallel/test-http-server-keepalive-req-gc.js new file mode 100644 index 0000000000..aa4bf1a3de --- /dev/null +++ b/test/parallel/test-http-server-keepalive-req-gc.js @@ -0,0 +1,47 @@ +// Flags: --expose-gc +'use strict'; +const common = require('../common'); +const onGC = require('../common/ongc'); +const { createServer } = require('http'); +const { connect } = require('net'); + +if (common.isWindows) { + // TODO(addaleax): Investigate why and remove the skip. + common.skip('This test is flaky on Windows.'); +} + +// Make sure that for HTTP keepalive requests, the req object can be +// garbage collected once the request is finished. +// Refs: https://github.com/nodejs/node/issues/9668 + +let client; +const server = createServer(common.mustCall((req, res) => { + onGC(req, { ongc: common.mustCall() }); + req.resume(); + req.on('end', common.mustCall(() => { + setImmediate(() => { + client.end(); + global.gc(); + }); + })); + res.end('hello world'); +})); + +server.unref(); + +server.listen(0, common.mustCall(() => { + client = connect(server.address().port); + + const req = [ + 'POST / HTTP/1.1', + `Host: localhost:${server.address().port}`, + 'Connection: keep-alive', + 'Content-Length: 11', + '', + 'hello world', + '' + ].join('\r\n'); + + client.write(req); + client.unref(); +})); |