@@ -49,7 +49,9 @@ const {
4949 kEnqueue,
5050 kKeepAliveTimeout,
5151 kMaxHeadersSize,
52- kHeadersTimeout
52+ kHeadersTimeout,
53+ kMaxIdleTimeout,
54+ kIdleThreshold
5355} = require ( './symbols' )
5456const makeStream = require ( './client-stream' )
5557const makeRequest = require ( './client-request' )
@@ -69,6 +71,8 @@ class Client extends EventEmitter {
6971 headersTimeout,
7072 socketTimeout,
7173 idleTimeout,
74+ maxIdleTimeout,
75+ idleThreshold,
7276 socketPath,
7377 requestTimeout,
7478 pipelining,
@@ -120,6 +124,18 @@ class Client extends EventEmitter {
120124 throw new InvalidArgumentError ( 'invalid idleTimeout' )
121125 }
122126
127+ if ( idleTimeout != null && ( ! Number . isFinite ( idleTimeout ) || idleTimeout <= 0 ) ) {
128+ throw new InvalidArgumentError ( 'invalid idleTimeout' )
129+ }
130+
131+ if ( maxIdleTimeout != null && ( ! Number . isFinite ( maxIdleTimeout ) || maxIdleTimeout <= 0 ) ) {
132+ throw new InvalidArgumentError ( 'invalid maxIdleTimeout' )
133+ }
134+
135+ if ( idleThreshold != null && ! Number . isFinite ( idleThreshold ) ) {
136+ throw new InvalidArgumentError ( 'invalid idleThreshold' )
137+ }
138+
123139 if ( requestTimeout != null && ! Number . isFinite ( requestTimeout ) ) {
124140 throw new InvalidArgumentError ( 'invalid requestTimeout' )
125141 }
@@ -136,7 +152,9 @@ class Client extends EventEmitter {
136152 this [ kUrl ] = url
137153 this [ kSocketPath ] = socketPath
138154 this [ kSocketTimeout ] = socketTimeout == null ? 30e3 : socketTimeout
155+ this [ kMaxIdleTimeout ] = maxIdleTimeout == null ? 600e3 : maxIdleTimeout
139156 this [ kIdleTimeout ] = idleTimeout == null ? 4e3 : idleTimeout
157+ this [ kIdleThreshold ] = idleThreshold == null ? 1e3 : idleThreshold
140158 this [ kKeepAliveTimeout ] = this [ kIdleTimeout ]
141159 this [ kRequestTimeout ] = requestTimeout == null ? 30e3 : requestTimeout
142160 this [ kClosed ] = false
@@ -494,12 +512,14 @@ class Parser extends HTTPParser {
494512 if ( headers [ 'keep-alive' ] ) {
495513 const m = headers [ 'keep-alive' ] . match ( / t i m e o u t = ( \d + ) / )
496514 if ( m ) {
497- const timeout = Number ( m [ 1 ] )
498- if ( ! timeout ) {
515+ const keepAliveTimeout = Math . min (
516+ Number ( m [ 1 ] ) * 1000 - client [ kIdleThreshold ] ,
517+ client [ kMaxIdleTimeout ]
518+ )
519+ if ( ! keepAliveTimeout || keepAliveTimeout < 1e3 ) {
499520 client [ kReset ] = true
500521 } else {
501- // Set timeout to 500ms less than hint to account for timing inaccuracies.
502- client [ kKeepAliveTimeout ] = timeout * 1000 - 500
522+ client [ kKeepAliveTimeout ] = keepAliveTimeout
503523 }
504524 }
505525 } else {
0 commit comments