@@ -25,6 +25,7 @@ const {
25
25
ArrayIsArray,
26
26
Error,
27
27
MathMin,
28
+ NumberIsFinite,
28
29
ObjectKeys,
29
30
ObjectSetPrototypeOf,
30
31
ReflectApply,
@@ -184,8 +185,6 @@ const kConnections = Symbol('http.server.connections');
184
185
const kConnectionsCheckingInterval = Symbol ( 'http.server.connectionsCheckingInterval' ) ;
185
186
186
187
const HTTP_SERVER_TRACE_EVENT_NAME = 'http.server.request' ;
187
- // TODO(jazelly): make this configurable
188
- const HTTP_SERVER_KEEP_ALIVE_TIMEOUT_BUFFER = 1000 ;
189
188
190
189
class HTTPServerAsyncResource {
191
190
constructor ( type , socket ) {
@@ -484,6 +483,14 @@ function storeHTTPOptions(options) {
484
483
this . keepAliveTimeout = 5_000 ; // 5 seconds;
485
484
}
486
485
486
+ const keepAliveTimeoutBuffer = options . keepAliveTimeoutBuffer ;
487
+ if ( keepAliveTimeoutBuffer !== undefined ) {
488
+ validateInteger ( keepAliveTimeoutBuffer , 'keepAliveTimeoutBuffer' , 0 ) ;
489
+ this . keepAliveTimeoutBuffer = keepAliveTimeoutBuffer ;
490
+ } else {
491
+ this . keepAliveTimeoutBuffer = 1000 ;
492
+ }
493
+
487
494
const connectionsCheckingInterval = options . connectionsCheckingInterval ;
488
495
if ( connectionsCheckingInterval !== undefined ) {
489
496
validateInteger ( connectionsCheckingInterval , 'connectionsCheckingInterval' , 0 ) ;
@@ -546,6 +553,13 @@ function Server(options, requestListener) {
546
553
}
547
554
548
555
storeHTTPOptions . call ( this , options ) ;
556
+
557
+ // Optional buffer added to the keep-alive timeout when setting socket timeouts.
558
+ // Helps reduce ECONNRESET errors from clients by extending the internal timeout.
559
+ // Default is 1000ms if not specified.
560
+ const buf = options . keepAliveTimeoutBuffer ;
561
+ this . keepAliveTimeoutBuffer =
562
+ ( typeof buf === 'number' && NumberIsFinite ( buf ) && buf >= 0 ) ? buf : 1000 ;
549
563
net . Server . call (
550
564
this ,
551
565
{ allowHalfOpen : true , noDelay : options . noDelay ?? true ,
@@ -1012,9 +1026,10 @@ function resOnFinish(req, res, socket, state, server) {
1012
1026
}
1013
1027
} else if ( state . outgoing . length === 0 ) {
1014
1028
if ( server . keepAliveTimeout && typeof socket . setTimeout === 'function' ) {
1015
- // Increase the internal timeout wrt the advertised value to reduce
1029
+ // Extend the internal timeout by the configured buffer to reduce
1016
1030
// the likelihood of ECONNRESET errors.
1017
- socket . setTimeout ( server . keepAliveTimeout + HTTP_SERVER_KEEP_ALIVE_TIMEOUT_BUFFER ) ;
1031
+ // This allows fine-tuning beyond the advertised keepAliveTimeout.
1032
+ socket . setTimeout ( server . keepAliveTimeout + server . keepAliveTimeoutBuffer ) ;
1018
1033
state . keepAliveTimeoutSet = true ;
1019
1034
}
1020
1035
} else {
0 commit comments