Browse Source

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>
process-exit-stdio-flushing
Fedor Indutny 9 years ago
parent
commit
ec2822adaa
  1. 1
      lib/_http_server.js
  2. 36
      test/parallel/test-http-server-consumed-timeout.js

1
lib/_http_server.js

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

36
test/parallel/test-http-server-consumed-timeout.js

@ -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('.');
}));
Loading…
Cancel
Save