@@ -271,7 +271,7 @@ function Server(requestListener) {
271
271
this . on ( 'connection' , connectionListener ) ;
272
272
273
273
this . timeout = 2 * 60 * 1000 ;
274
-
274
+ this . keepAliveTimeout = 5000 ;
275
275
this . _pendingResponseData = 0 ;
276
276
this . maxHeadersCount = null ;
277
277
}
@@ -323,7 +323,8 @@ function connectionListener(socket) {
323
323
// inactive responses. If more data than the high watermark is queued - we
324
324
// need to pause TCP socket/HTTP parser, and wait until the data will be
325
325
// sent to the client.
326
- outgoingData : 0
326
+ outgoingData : 0 ,
327
+ keepAliveTimeoutSet : false
327
328
} ;
328
329
state . onData = socketOnData . bind ( undefined , this , socket , parser , state ) ;
329
330
state . onEnd = socketOnEnd . bind ( undefined , this , socket , parser , state ) ;
@@ -431,8 +432,16 @@ function socketOnEnd(server, socket, parser, state) {
431
432
function socketOnData ( server , socket , parser , state , d ) {
432
433
assert ( ! socket . _paused ) ;
433
434
debug ( 'SERVER socketOnData %d' , d . length ) ;
434
- var ret = parser . execute ( d ) ;
435
435
436
+ if ( state . keepAliveTimeoutSet ) {
437
+ socket . setTimeout ( 0 ) ;
438
+ if ( server . timeout ) {
439
+ socket . setTimeout ( server . timeout ) ;
440
+ }
441
+ state . keepAliveTimeoutSet = false ;
442
+ }
443
+
444
+ var ret = parser . execute ( d ) ;
436
445
onParserExecuteCommon ( server , socket , parser , state , ret , d ) ;
437
446
}
438
447
@@ -496,7 +505,7 @@ function onParserExecuteCommon(server, socket, parser, state, ret, d) {
496
505
}
497
506
}
498
507
499
- function resOnFinish ( req , res , socket , state ) {
508
+ function resOnFinish ( req , res , socket , state , server ) {
500
509
// Usually the first incoming element should be our request. it may
501
510
// be that in the case abortIncoming() was called that the incoming
502
511
// array will be empty.
@@ -514,6 +523,12 @@ function resOnFinish(req, res, socket, state) {
514
523
515
524
if ( res . _last ) {
516
525
socket . destroySoon ( ) ;
526
+ } else if ( state . outgoing . length === 0 ) {
527
+ if ( server . keepAliveTimeout ) {
528
+ socket . setTimeout ( 0 ) ;
529
+ socket . setTimeout ( server . keepAliveTimeout ) ;
530
+ state . keepAliveTimeoutSet = true ;
531
+ }
517
532
} else {
518
533
// start sending the next message
519
534
var m = state . outgoing . shift ( ) ;
@@ -560,7 +575,8 @@ function parserOnIncoming(server, socket, state, req, keepAlive) {
560
575
561
576
// When we're finished writing the response, check if this is the last
562
577
// response, if so destroy the socket.
563
- res . on ( 'finish' , resOnFinish . bind ( undefined , req , res , socket , state ) ) ;
578
+ res . on ( 'finish' ,
579
+ resOnFinish . bind ( undefined , req , res , socket , state , server ) ) ;
564
580
565
581
if ( req . headers . expect !== undefined &&
566
582
( req . httpVersionMajor === 1 && req . httpVersionMinor === 1 ) ) {
0 commit comments