http: unref socket timer on parser execute

When underlying `net.Socket` instance is consumed in http server - no
`data` events are emitted, and thus `socket.setTimeout` fires the
callback even if the data is constantly flowing into the socket.

Fix this by calling `socket._unrefTimer()` on every `onParserExecute`
call.

Fix: #5899
PR-URL: https://github.com/nodejs/node/pull/6286
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Fedor Indutny 2016-04-19 16:41:13 -04:00
parent 75487f0db8
commit ec2822adaa
2 changed files with 37 additions and 0 deletions

View File

@ -365,6 +365,7 @@ function connectionListener(socket) {
} }
function onParserExecute(ret, d) { function onParserExecute(ret, d) {
socket._unrefTimer();
debug('SERVER socketOnParserExecute %d', ret); debug('SERVER socketOnParserExecute %d', ret);
onParserExecuteCommon(ret, undefined); onParserExecuteCommon(ret, undefined);
} }

View File

@ -0,0 +1,36 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const http = require('http');
const server = http.createServer((req, res) => {
server.close();
res.writeHead(200);
res.flushHeaders();
req.setTimeout(common.platformTimeout(200), () => {
assert(false, 'Should not happen');
});
req.resume();
req.once('end', common.mustCall(() => {
res.end();
}));
});
server.listen(common.PORT, common.mustCall(() => {
const req = http.request({
port: common.PORT,
method: 'POST'
}, (res) => {
const interval = setInterval(() => {
req.write('a');
}, common.platformTimeout(25));
setTimeout(() => {
clearInterval(interval);
req.end();
}, common.platformTimeout(400));
});
req.write('.');
}));