@@ -520,6 +520,7 @@ function requestWithCallback(url, args, callback) {
520520 }
521521 return ;
522522 }
523+
523524 var cb = callback ;
524525 callback = null ;
525526 var headers = { } ;
@@ -529,49 +530,16 @@ function requestWithCallback(url, args, callback) {
529530 headers = res . headers ;
530531 }
531532
532- // handle digest auth
533- if ( statusCode === 401 && headers [ 'www-authenticate' ]
534- && ! options . headers . authorization && args . digestAuth ) {
535- var authenticate = headers [ 'www-authenticate' ] ;
536- if ( authenticate . indexOf ( 'Digest ' ) >= 0 ) {
537- debug ( 'Request#%d %s: got digest auth header WWW-Authenticate: %s' , reqId , url , authenticate ) ;
538- options . headers . authorization = digestAuthHeader ( options . method , options . path , authenticate , args . digestAuth ) ;
539- debug ( 'Request#%d %s: auth with digest header: %s' , reqId , url , options . headers . authorization ) ;
540- if ( res . headers [ 'set-cookie' ] ) {
541- options . headers . cookie = res . headers [ 'set-cookie' ] . join ( ';' ) ;
542- }
543- args . headers = options . headers ;
544- return exports . requestWithCallback ( url , args , cb ) ;
545- }
533+ if ( handleDigestAuth ( res , cb ) ) {
534+ return ;
546535 }
547536
548- var requestUseTime = Date . now ( ) - requestStartTime ;
549- if ( timing ) {
550- timing . contentDownload = requestUseTime ;
551- }
537+ var response = createCallbackResponse ( data , res ) ;
552538
553539 debug ( '[%sms] done, %s bytes HTTP %s %s %s %s, keepAliveSocket: %s, timing: %j, socketHandledRequests: %s, socketHandledResponses: %s' ,
554- requestUseTime , responseSize , statusCode , options . method , options . host , options . path ,
540+ response . requestUseTime , responseSize , statusCode , options . method , options . host , options . path ,
555541 keepAliveSocket , timing , socketHandledRequests , socketHandledResponses ) ;
556542
557- var response = {
558- status : statusCode ,
559- statusCode : statusCode ,
560- statusMessage : statusMessage ,
561- headers : headers ,
562- size : responseSize ,
563- aborted : responseAborted ,
564- rt : requestUseTime ,
565- keepAliveSocket : keepAliveSocket ,
566- data : data ,
567- requestUrls : args . requestUrls ,
568- timing : timing ,
569- remoteAddress : remoteAddress ,
570- remotePort : remotePort ,
571- socketHandledRequests : socketHandledRequests ,
572- socketHandledResponses : socketHandledResponses ,
573- } ;
574-
575543 if ( err ) {
576544 var agentStatus = '' ;
577545 if ( agent && typeof agent . getCurrentStatus === 'function' ) {
@@ -620,6 +588,45 @@ function requestWithCallback(url, args, callback) {
620588
621589 cb ( err , data , args . streaming ? res : response ) ;
622590
591+ emitResponseEvent ( err , response ) ;
592+ }
593+
594+ function createAndEmitResponseEvent ( data , res ) {
595+ var response = createCallbackResponse ( data , res ) ;
596+ emitResponseEvent ( null , response ) ;
597+ }
598+
599+ function createCallbackResponse ( data , res ) {
600+ var requestUseTime = Date . now ( ) - requestStartTime ;
601+ if ( timing ) {
602+ timing . contentDownload = requestUseTime ;
603+ }
604+
605+ var headers = { } ;
606+ if ( res && res . headers ) {
607+ headers = res . headers ;
608+ }
609+
610+ return {
611+ status : statusCode ,
612+ statusCode : statusCode ,
613+ statusMessage : statusMessage ,
614+ headers : headers ,
615+ size : responseSize ,
616+ aborted : responseAborted ,
617+ rt : requestUseTime ,
618+ keepAliveSocket : keepAliveSocket ,
619+ data : data ,
620+ requestUrls : args . requestUrls ,
621+ timing : timing ,
622+ remoteAddress : remoteAddress ,
623+ remotePort : remotePort ,
624+ socketHandledRequests : socketHandledRequests ,
625+ socketHandledResponses : socketHandledResponses ,
626+ } ;
627+ }
628+
629+ function emitResponseEvent ( err , response ) {
623630 if ( args . emitter ) {
624631 // keep to use the same reqMeta object on request event before
625632 reqMeta . url = parsedUrl . href ;
@@ -637,6 +644,30 @@ function requestWithCallback(url, args, callback) {
637644 }
638645 }
639646
647+ function handleDigestAuth ( res , cb ) {
648+ var headers = { } ;
649+ if ( res && res . headers ) {
650+ headers = res . headers ;
651+ }
652+ // handle digest auth
653+ if ( statusCode === 401 && headers [ 'www-authenticate' ]
654+ && ! options . headers . authorization && args . digestAuth ) {
655+ var authenticate = headers [ 'www-authenticate' ] ;
656+ if ( authenticate . indexOf ( 'Digest ' ) >= 0 ) {
657+ debug ( 'Request#%d %s: got digest auth header WWW-Authenticate: %s' , reqId , url , authenticate ) ;
658+ options . headers . authorization = digestAuthHeader ( options . method , options . path , authenticate , args . digestAuth ) ;
659+ debug ( 'Request#%d %s: auth with digest header: %s' , reqId , url , options . headers . authorization ) ;
660+ if ( res . headers [ 'set-cookie' ] ) {
661+ options . headers . cookie = res . headers [ 'set-cookie' ] . join ( ';' ) ;
662+ }
663+ args . headers = options . headers ;
664+ exports . requestWithCallback ( url , args , cb ) ;
665+ return true ;
666+ }
667+ }
668+ return false ;
669+ }
670+
640671 function handleRedirect ( res ) {
641672 var err = null ;
642673 if ( args . followRedirect && statuses . redirect [ res . statusCode ] ) { // handle redirect
@@ -740,6 +771,7 @@ function requestWithCallback(url, args, callback) {
740771 var result = handleRedirect ( res ) ;
741772 if ( result . redirect ) {
742773 res . resume ( ) ;
774+ createAndEmitResponseEvent ( null , res ) ;
743775 return ;
744776 }
745777 if ( result . error ) {
@@ -781,6 +813,7 @@ function requestWithCallback(url, args, callback) {
781813 var result = handleRedirect ( res ) ;
782814 if ( result . redirect ) {
783815 res . resume ( ) ;
816+ createAndEmitResponseEvent ( null , res ) ;
784817 return ;
785818 }
786819 if ( result . error ) {
@@ -874,6 +907,7 @@ function requestWithCallback(url, args, callback) {
874907 return done ( result . error , body , res ) ;
875908 }
876909 if ( result . redirect ) {
910+ createAndEmitResponseEvent ( null , res ) ;
877911 return ;
878912 }
879913
0 commit comments