diff --git a/lib/_http_server.js b/lib/_http_server.js index 0f5865126689d3..dd127f5ed3ef13 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -739,11 +739,18 @@ assignFunctionName(EE.captureRejectionSymbol, function(err, event, ...args) { }); function checkConnections() { - if (this.headersTimeout === 0 && this.requestTimeout === 0) { + const headersTimeout = + NumberIsFinite(this.headersTimeout) && this.headersTimeout >= 0 ? + this.headersTimeout : 0; + const requestTimeout = + NumberIsFinite(this.requestTimeout) && this.requestTimeout >= 0 ? + this.requestTimeout : 0; + + if (headersTimeout === 0 && requestTimeout === 0) { return; } - const expired = this[kConnections].expired(this.headersTimeout, this.requestTimeout); + const expired = this[kConnections].expired(headersTimeout, requestTimeout); for (let i = 0; i < expired.length; i++) { const socket = expired[i].socket; diff --git a/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js new file mode 100644 index 00000000000000..85c6b95c56a103 --- /dev/null +++ b/test/parallel/test-http-server-invalid-headers-timeout-no-abort.js @@ -0,0 +1,33 @@ +'use strict'; + +require('../common'); +const assert = require('assert'); +const { spawnSync } = require('child_process'); + +if (process.argv[2] === 'child') { + const { createServer } = require('http'); + + const server = createServer({ + connectionsCheckingInterval: 1, + }, (_req, res) => { + res.end('ok'); + }); + + server.headersTimeout = 'im-not-a-number'; + + server.listen(0, '127.0.0.1', () => { + setTimeout(() => { + server.close(() => process.exit(0)); + }, 50); + }); +} else { + // Run the repro in a child so the native crash is observable without failing the whole run + const { signal, status, stderr } = spawnSync( + process.execPath, + [__filename, 'child'], + { encoding: 'utf8' }, + ); + + assert.strictEqual(signal, null); + assert.strictEqual(status, 0, stderr); +}