Skip to content

Commit 7ea72ee

Browse files
ShogunPandalpinca
authored andcommitted
http: improved timeout defaults handling
Co-authored-by: Luigi Pinca <[email protected]> PR-URL: #45778 Fixes: #43355 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Santiago Gimeno <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Luigi Pinca <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent 4457e05 commit 7ea72ee

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

doc/api/http.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -1515,9 +1515,13 @@ or waiting for a response.
15151515
added:
15161516
- v11.3.0
15171517
- v10.14.0
1518+
changes:
1519+
- version: REPLACEME
1520+
pr-url: https://github.com/nodejs/node/pull/45778
1521+
description: The default is now set to the minimum between 60000 (60 seconds) or `requestTimeout`.
15181522
-->
15191523

1520-
* {number} **Default:** `60000`
1524+
* {number} **Default:** The minimum between [`server.requestTimeout`][] or `60000`.
15211525

15221526
Limit the amount of time the parser will wait to receive the complete HTTP
15231527
headers.

lib/_http_server.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
const {
2525
ArrayIsArray,
2626
Error,
27+
MathMin,
2728
ObjectKeys,
2829
ObjectSetPrototypeOf,
2930
RegExpPrototypeExec,
@@ -446,11 +447,11 @@ function storeHTTPOptions(options) {
446447
validateInteger(headersTimeout, 'headersTimeout', 0);
447448
this.headersTimeout = headersTimeout;
448449
} else {
449-
this.headersTimeout = 60_000; // 60 seconds
450+
this.headersTimeout = MathMin(60_000, this.requestTimeout); // Minimum between 60 seconds or requestTimeout
450451
}
451452

452-
if (this.requestTimeout > 0 && this.headersTimeout > 0 && this.headersTimeout >= this.requestTimeout) {
453-
throw new codes.ERR_OUT_OF_RANGE('headersTimeout', '< requestTimeout', headersTimeout);
453+
if (this.requestTimeout > 0 && this.headersTimeout > 0 && this.headersTimeout > this.requestTimeout) {
454+
throw new codes.ERR_OUT_OF_RANGE('headersTimeout', '<= requestTimeout', headersTimeout);
454455
}
455456

456457
const keepAliveTimeout = options.keepAliveTimeout;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
'use strict';
2+
3+
require('../common');
4+
const assert = require('assert');
5+
const { createServer } = require('http');
6+
7+
// This test validates that the HTTP server timeouts are properly validated and set.
8+
9+
{
10+
const server = createServer();
11+
assert.strictEqual(server.headersTimeout, 60000);
12+
assert.strictEqual(server.requestTimeout, 300000);
13+
}
14+
15+
{
16+
const server = createServer({ headersTimeout: 10000, requestTimeout: 20000 });
17+
assert.strictEqual(server.headersTimeout, 10000);
18+
assert.strictEqual(server.requestTimeout, 20000);
19+
}
20+
21+
{
22+
const server = createServer({ headersTimeout: 10000, requestTimeout: 10000 });
23+
assert.strictEqual(server.headersTimeout, 10000);
24+
assert.strictEqual(server.requestTimeout, 10000);
25+
}
26+
27+
{
28+
const server = createServer({ headersTimeout: 10000 });
29+
assert.strictEqual(server.headersTimeout, 10000);
30+
assert.strictEqual(server.requestTimeout, 300000);
31+
}
32+
33+
{
34+
const server = createServer({ requestTimeout: 20000 });
35+
assert.strictEqual(server.headersTimeout, 20000);
36+
assert.strictEqual(server.requestTimeout, 20000);
37+
}
38+
39+
{
40+
const server = createServer({ requestTimeout: 100000 });
41+
assert.strictEqual(server.headersTimeout, 60000);
42+
assert.strictEqual(server.requestTimeout, 100000);
43+
}
44+
45+
{
46+
assert.throws(
47+
() => createServer({ headersTimeout: 10000, requestTimeout: 1000 }),
48+
{ code: 'ERR_OUT_OF_RANGE' }
49+
);
50+
}

0 commit comments

Comments
 (0)