From cbc43e37a277f5ced62605525b9497024acb7258 Mon Sep 17 00:00:00 2001
From: Sergiy Kyrylkov <kyrylkov@entriwise.com>
Date: Fri, 17 Feb 2023 16:36:52 +0100
Subject: [PATCH] feat: change headersTimeout and bodyTimeout to 300s (#1937)

* feat: change bodyTimeout and headersTimeout to 300s

* feat: revert bodyTimeout to 30s

* fix: update headersTimeout default to 300e3

* fix: update timeout test

* Revert "fix: update timeout test"

This reverts commit 78a0552d1b1d65bae4a215aab5ecdfd7f3ee550d.

* fix: address request-timeout.js failures

* fix: update Dispatcher headersTimeout docs to 300s

* feat: change bodyTimeout to 300s
---
 docs/api/Client.md      | 4 ++--
 docs/api/Dispatcher.md  | 4 ++--
 lib/client.js           | 4 ++--
 test/request-timeout.js | 8 ++++----
 types/client.d.ts       | 4 ++--
 types/dispatcher.d.ts   | 4 ++--
 6 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/docs/api/Client.md b/docs/api/Client.md
index 970ed1eee65..fc7c5d26e8f 100644
--- a/docs/api/Client.md
+++ b/docs/api/Client.md
@@ -17,8 +17,8 @@ Returns: `Client`
 
 ### Parameter: `ClientOptions`
 
-* **bodyTimeout** `number | null` (optional) - Default: `30e3` - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 30 seconds.
-* **headersTimeout** `number | null` (optional) - Default: `30e3` - The amount of time the parser will wait to receive the complete HTTP headers while not sending the request. Defaults to 30 seconds.
+* **bodyTimeout** `number | null` (optional) - Default: `300e3` - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 300 seconds.
+* **headersTimeout** `number | null` (optional) - Default: `300e3` - The amount of time the parser will wait to receive the complete HTTP headers while not sending the request. Defaults to 300 seconds.
 * **keepAliveMaxTimeout** `number | null` (optional) - Default: `600e3` - The maximum allowed `keepAliveTimeout` when overridden by *keep-alive* hints from the server. Defaults to 10 minutes.
 * **keepAliveTimeout** `number | null` (optional) - Default: `4e3` - The timeout after which a socket without active requests will time out. Monitors time between activity on a connected socket. This value may be overridden by *keep-alive* hints from the server. See [MDN: HTTP - Headers - Keep-Alive directives](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Keep-Alive#directives) for more details. Defaults to 4 seconds.
 * **keepAliveTimeoutThreshold** `number | null` (optional) - Default: `1e3` - A number subtracted from server *keep-alive* hints when overriding `keepAliveTimeout` to account for timing inaccuracies caused by e.g. transport latency. Defaults to 1 second.
diff --git a/docs/api/Dispatcher.md b/docs/api/Dispatcher.md
index fa8ae2dd6fc..a50642948aa 100644
--- a/docs/api/Dispatcher.md
+++ b/docs/api/Dispatcher.md
@@ -199,8 +199,8 @@ Returns: `Boolean` - `false` if dispatcher is busy and further dispatch calls wo
 * **idempotent** `boolean` (optional) - Default: `true` if `method` is `'HEAD'` or `'GET'` - Whether the requests can be safely retried or not. If `false` the request won't be sent until all preceding requests in the pipeline has completed.
 * **blocking** `boolean` (optional) - Default: `false` - Whether the response is expected to take a long time and would end up blocking the pipeline. When this is set to `true` further pipelining will be avoided on the same connection until headers have been received.
 * **upgrade** `string | null` (optional) - Default: `null` - Upgrade the request. Should be used to specify the kind of upgrade i.e. `'Websocket'`.
-* **bodyTimeout** `number | null` (optional) - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 30 seconds.
-* **headersTimeout** `number | null` (optional) - The amount of time the parser will wait to receive the complete HTTP headers while not sending the request. Defaults to 30 seconds.
+* **bodyTimeout** `number | null` (optional) - The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Defaults to 300 seconds.
+* **headersTimeout** `number | null` (optional) - The amount of time the parser will wait to receive the complete HTTP headers while not sending the request. Defaults to 300 seconds.
 * **throwOnError** `boolean` (optional) - Default: `false` - Whether Undici should throw an error upon receiving a 4xx or 5xx response from the server.
 
 #### Parameter: `DispatchHandler`
diff --git a/lib/client.js b/lib/client.js
index 49d51f3400c..9dbd2eefe47 100644
--- a/lib/client.js
+++ b/lib/client.js
@@ -222,8 +222,8 @@ class Client extends DispatcherBase {
     this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming
     this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming
     this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n`
-    this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 30e3
-    this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 30e3
+    this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3
+    this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3
     this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength
     this[kMaxRedirections] = maxRedirections
     this[kMaxRequests] = maxRequestsPerClient
diff --git a/test/request-timeout.js b/test/request-timeout.js
index 25e92294e84..3ec5c107e79 100644
--- a/test/request-timeout.js
+++ b/test/request-timeout.js
@@ -608,8 +608,8 @@ test('stream timeout', (t) => {
   const server = createServer((req, res) => {
     setTimeout(() => {
       res.end('hello')
-    }, 31e3)
-    clock.tick(31e3)
+    }, 301e3)
+    clock.tick(301e3)
   })
   t.teardown(server.close.bind(server))
 
@@ -682,8 +682,8 @@ test('pipeline timeout', (t) => {
   const server = createServer((req, res) => {
     setTimeout(() => {
       req.pipe(res)
-    }, 31e3)
-    clock.tick(31e3)
+    }, 301e3)
+    clock.tick(301e3)
   })
   t.teardown(server.close.bind(server))
 
diff --git a/types/client.d.ts b/types/client.d.ts
index d147233408d..871e3c2448a 100644
--- a/types/client.d.ts
+++ b/types/client.d.ts
@@ -31,9 +31,9 @@ declare namespace Client {
     connect?: buildConnector.BuildOptions | buildConnector.connector | null;
     /** The maximum length of request headers in bytes. Default: `16384` (16KiB). */
     maxHeaderSize?: number | null;
-    /** The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Default: `30e3` milliseconds (30s). */
+    /** The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use `0` to disable it entirely. Default: `300e3` milliseconds (300s). */
     bodyTimeout?: number | null;
-    /** The amount of time the parser will wait to receive the complete HTTP headers (Node 14 and above only). Default: `30e3` milliseconds (30s). */
+    /** The amount of time the parser will wait to receive the complete HTTP headers (Node 14 and above only). Default: `300e3` milliseconds (300s). */
     headersTimeout?: number | null;
     /** If `true`, an error is thrown when the request content-length header doesn't match the length of the request body. Default: `true`. */
     strictContentLength?: boolean;
diff --git a/types/dispatcher.d.ts b/types/dispatcher.d.ts
index 68135d1e5c1..c6b0c8875eb 100644
--- a/types/dispatcher.d.ts
+++ b/types/dispatcher.d.ts
@@ -109,9 +109,9 @@ declare namespace Dispatcher {
     blocking?: boolean;
     /** Upgrade the request. Should be used to specify the kind of upgrade i.e. `'Websocket'`. Default: `method === 'CONNECT' || null`. */
     upgrade?: boolean | string | null;
-    /** The amount of time the parser will wait to receive the complete HTTP headers. Defaults to 30 seconds. */
+    /** The amount of time the parser will wait to receive the complete HTTP headers. Defaults to 300 seconds. */
     headersTimeout?: number | null;
-    /** The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use 0 to disable it entirely. Defaults to 30 seconds. */
+    /** The timeout after which a request will time out, in milliseconds. Monitors time between receiving body data. Use 0 to disable it entirely. Defaults to 300 seconds. */
     bodyTimeout?: number | null;
     /** Whether the request should stablish a keep-alive or not. Default `false` */
     reset?: boolean;