Skip to content

Commit 3c0c5e0

Browse files
ShogunPandalpinca
authored andcommitted
http: improved timeout defaults handling
Co-authored-by: Luigi Pinca <luigipinca@gmail.com> PR-URL: #45778 Fixes: #43355 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent 83875f4 commit 3c0c5e0

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
@@ -1502,9 +1502,13 @@ or waiting for a response.
15021502
added:
15031503
- v11.3.0
15041504
- v10.14.0
1505+
changes:
1506+
- version: REPLACEME
1507+
pr-url: https://github.com/nodejs/node/pull/45778
1508+
description: The default is now set to the minimum between 60000 (60 seconds) or `requestTimeout`.
15051509
-->
15061510

1507-
* {number} **Default:** `60000`
1511+
* {number} **Default:** The minimum between [`server.requestTimeout`][] or `60000`.
15081512

15091513
Limit the amount of time the parser will wait to receive the complete HTTP
15101514
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,
@@ -451,11 +452,11 @@ function storeHTTPOptions(options) {
451452
validateInteger(headersTimeout, 'headersTimeout', 0);
452453
this.headersTimeout = headersTimeout;
453454
} else {
454-
this.headersTimeout = 60_000; // 60 seconds
455+
this.headersTimeout = MathMin(60_000, this.requestTimeout); // Minimum between 60 seconds or requestTimeout
455456
}
456457

457-
if (this.requestTimeout > 0 && this.headersTimeout > 0 && this.headersTimeout >= this.requestTimeout) {
458-
throw new codes.ERR_OUT_OF_RANGE('headersTimeout', '< requestTimeout', headersTimeout);
458+
if (this.requestTimeout > 0 && this.headersTimeout > 0 && this.headersTimeout > this.requestTimeout) {
459+
throw new codes.ERR_OUT_OF_RANGE('headersTimeout', '<= requestTimeout', headersTimeout);
459460
}
460461

461462
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)