mirror of https://github.com/lukechilds/node.git
Browse Source
In order to prevent a memory leak when using keep alive, ensure that the timeout listener for the request is removed when the response has ended. PR-URL: https://github.com/nodejs/node/pull/9440 Reviewed-By: Evan Lucas <evanlucas@me.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>v6
committed by
Italo A. Casas
2 changed files with 51 additions and 1 deletions
@ -0,0 +1,44 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
const http = require('http'); |
|||
const assert = require('assert'); |
|||
|
|||
const agent = new http.Agent({ keepAlive: true }); |
|||
|
|||
const server = http.createServer((req, res) => { |
|||
res.end(''); |
|||
}); |
|||
|
|||
const options = { |
|||
agent, |
|||
method: 'GET', |
|||
port: undefined, |
|||
host: common.localhostIPv4, |
|||
path: '/', |
|||
timeout: common.platformTimeout(100) |
|||
}; |
|||
|
|||
server.listen(0, options.host, common.mustCall(() => { |
|||
options.port = server.address().port; |
|||
doRequest(common.mustCall((numListeners) => { |
|||
assert.strictEqual(numListeners, 1); |
|||
doRequest(common.mustCall((numListeners) => { |
|||
assert.strictEqual(numListeners, 1); |
|||
server.close(); |
|||
agent.destroy(); |
|||
})); |
|||
})); |
|||
})); |
|||
|
|||
function doRequest(cb) { |
|||
http.request(options, common.mustCall((response) => { |
|||
const sockets = agent.sockets[`${options.host}:${options.port}:`]; |
|||
assert.strictEqual(sockets.length, 1); |
|||
const socket = sockets[0]; |
|||
const numListeners = socket.listeners('timeout').length; |
|||
response.resume(); |
|||
response.once('end', common.mustCall(() => { |
|||
process.nextTick(cb, numListeners); |
|||
})); |
|||
})).end(); |
|||
} |
Loading…
Reference in new issue