@@ -79,6 +79,8 @@ const STATUS_CODES = exports.STATUS_CODES = {
7979 511 : 'Network Authentication Required' // RFC 6585
8080} ;
8181
82+ const kOnExecute = HTTPParser . kOnExecute | 0 ;
83+
8284
8385function ServerResponse ( req ) {
8486 OutgoingMessage . call ( this ) ;
@@ -317,6 +319,21 @@ function connectionListener(socket) {
317319 socket . on ( 'end' , socketOnEnd ) ;
318320 socket . on ( 'data' , socketOnData ) ;
319321
322+ // We are consuming socket, so it won't get any actual data
323+ socket . on ( 'resume' , onSocketResume ) ;
324+ socket . on ( 'pause' , onSocketPause ) ;
325+
326+ socket . on ( 'drain' , socketOnDrain ) ;
327+
328+ // Override on to unconsume on `data`, `readable` listeners
329+ socket . on = socketOnWrap ;
330+
331+ var external = socket . _handle . _externalStream ;
332+ if ( external )
333+ parser . consume ( external ) ;
334+ external = null ;
335+ parser [ kOnExecute ] = onParserExecute ;
336+
320337 // TODO(isaacs): Move all these functions out of here
321338 function socketOnError ( e ) {
322339 self . emit ( 'clientError' , e , this ) ;
@@ -326,6 +343,16 @@ function connectionListener(socket) {
326343 assert ( ! socket . _paused ) ;
327344 debug ( 'SERVER socketOnData %d' , d . length ) ;
328345 var ret = parser . execute ( d ) ;
346+
347+ onParserExecuteCommon ( ret , d ) ;
348+ }
349+
350+ function onParserExecute ( ret , d ) {
351+ debug ( 'SERVER socketOnParserExecute %d' , ret ) ;
352+ onParserExecuteCommon ( ret , undefined ) ;
353+ }
354+
355+ function onParserExecuteCommon ( ret , d ) {
329356 if ( ret instanceof Error ) {
330357 debug ( 'parse error' ) ;
331358 socket . destroy ( ret ) ;
@@ -335,9 +362,13 @@ function connectionListener(socket) {
335362 var req = parser . incoming ;
336363 debug ( 'SERVER upgrade or connect' , req . method ) ;
337364
365+ if ( ! d )
366+ d = parser . getCurrentBuffer ( ) ;
367+
338368 socket . removeListener ( 'data' , socketOnData ) ;
339369 socket . removeListener ( 'end' , socketOnEnd ) ;
340370 socket . removeListener ( 'close' , serverSocketCloseListener ) ;
371+ parser . unconsume ( socket . _handle . _externalStream ) ;
341372 parser . finish ( ) ;
342373 freeParser ( parser , req , null ) ;
343374 parser = null ;
@@ -400,7 +431,6 @@ function connectionListener(socket) {
400431 socket . resume ( ) ;
401432 }
402433 }
403- socket . on ( 'drain' , socketOnDrain ) ;
404434
405435 function parserOnIncoming ( req , shouldKeepAlive ) {
406436 incoming . push ( req ) ;
@@ -480,3 +510,24 @@ function connectionListener(socket) {
480510 }
481511}
482512exports . _connectionListener = connectionListener ;
513+
514+ function onSocketResume ( ) {
515+ this . _handle . readStart ( ) ;
516+ }
517+
518+ function onSocketPause ( ) {
519+ this . _handle . readStop ( ) ;
520+ }
521+
522+ function socketOnWrap ( ev , fn ) {
523+ var res = net . Socket . prototype . on . call ( this , ev , fn ) ;
524+ if ( ! this . parser ) {
525+ this . on = net . Socket . prototype . on ;
526+ return res ;
527+ }
528+
529+ if ( ev === 'data' || ev === 'readable' )
530+ this . parser . unconsume ( this . _handle . _externalStream ) ;
531+
532+ return res ;
533+ }
0 commit comments