@@ -543,56 +543,56 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
543
543
}
544
544
}
545
545
546
- function onUpgrade ( out , reverseProxy ) {
547
- if ( ! out ) {
548
- reverseProxy . end ( ) ;
546
+ function onUpgrade ( reverseProxy , proxySocket ) {
547
+ if ( ! reverseProxy ) {
548
+ proxySocket . end ( ) ;
549
549
socket . end ( ) ;
550
550
return ;
551
551
}
552
552
553
553
var listeners = { } ;
554
554
555
555
// We're now connected to the server, so lets change server socket
556
- reverseProxy . on ( 'data' , listeners . _r_data = function ( data ) {
556
+ proxySocket . on ( 'data' , listeners . _r_data = function ( data ) {
557
557
// Pass data to client
558
- if ( out . incoming . socket . writable ) {
558
+ if ( reverseProxy . incoming . socket . writable ) {
559
559
try {
560
- out . incoming . socket . write ( data ) ;
560
+ reverseProxy . incoming . socket . write ( data ) ;
561
561
}
562
562
catch ( e ) {
563
- out . incoming . socket . end ( ) ;
564
- reverseProxy . end ( ) ;
563
+ reverseProxy . incoming . socket . end ( ) ;
564
+ proxySocket . end ( ) ;
565
565
}
566
566
}
567
567
} ) ;
568
568
569
- out . incoming . socket . on ( 'data' , listeners . _data = function ( data ) {
569
+ reverseProxy . incoming . socket . on ( 'data' , listeners . _data = function ( data ) {
570
570
// Pass data from client to server
571
571
try {
572
- reverseProxy . write ( data ) ;
572
+ proxySocket . write ( data ) ;
573
573
}
574
574
catch ( e ) {
575
- reverseProxy . end ( ) ;
575
+ proxySocket . end ( ) ;
576
576
socket . end ( ) ;
577
577
}
578
578
} ) ;
579
579
580
580
// Detach event listeners from reverseProxy
581
581
function detach ( ) {
582
- reverseProxy . removeListener ( 'end' , listeners . _r_close ) ;
583
- reverseProxy . removeListener ( 'data' , listeners . _r_data ) ;
584
- out . incoming . socket . removeListener ( 'data' , listeners . _data ) ;
585
- out . incoming . socket . removeListener ( 'end' , listeners . _close ) ;
582
+ proxySocket . removeListener ( 'end' , listeners . _r_close ) ;
583
+ proxySocket . removeListener ( 'data' , listeners . _r_data ) ;
584
+ reverseProxy . incoming . socket . removeListener ( 'data' , listeners . _data ) ;
585
+ reverseProxy . incoming . socket . removeListener ( 'end' , listeners . _close ) ;
586
586
}
587
587
588
588
// Hook disconnections
589
- reverseProxy . on ( 'end' , listeners . _r_close = function ( ) {
590
- out . incoming . socket . end ( ) ;
589
+ proxySocket . on ( 'end' , listeners . _r_close = function ( ) {
590
+ reverseProxy . incoming . socket . end ( ) ;
591
591
detach ( ) ;
592
592
} ) ;
593
593
594
- out . incoming . socket . on ( 'end' , listeners . _close = function ( ) {
595
- reverseProxy . end ( ) ;
594
+ reverseProxy . incoming . socket . on ( 'end' , listeners . _close = function ( ) {
595
+ proxySocket . end ( ) ;
596
596
detach ( ) ;
597
597
} ) ;
598
598
} ;
@@ -620,16 +620,16 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
620
620
} ;
621
621
622
622
// Make the outgoing WebSocket request
623
- var request = agent . appendMessage ( outgoing ) ;
623
+ var reverseProxy = agent . appendMessage ( outgoing ) ;
624
624
625
625
//
626
626
// Here we set the incoming `req`, `socket` and `head` data to the outgoing
627
627
// request so that we can reuse this data later on in the closure scope
628
628
// available to the `upgrade` event. This bookkeeping is not tracked anywhere
629
629
// in nodejs core and is **very** specific to proxying WebSockets.
630
630
//
631
- request . agent = agent ;
632
- request . incoming = {
631
+ reverseProxy . agent = agent ;
632
+ reverseProxy . incoming = {
633
633
request : req ,
634
634
socket : socket ,
635
635
head : head
@@ -644,69 +644,84 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
644
644
// there is no mapping of the
645
645
//
646
646
if ( ! agent . _events || agent . _events [ 'upgrade' ] . length === 0 ) {
647
- agent . on ( 'upgrade' , function ( out , remoteSocket , head ) {
648
- // Prepare socket
647
+ agent . on ( 'upgrade' , function ( _ , remoteSocket , head ) {
648
+ //
649
+ // Prepare the socket for the reverseProxy request and begin to
650
+ // stream data between the two sockets
651
+ //
649
652
_socket ( remoteSocket , true ) ;
650
-
651
- // Emit event
652
653
onUpgrade ( remoteSocket . _httpMessage , remoteSocket ) ;
653
654
} ) ;
654
655
}
655
656
656
- if ( typeof request . socket !== 'undefined' ) {
657
- request . socket . on ( 'data' , function handshake ( data ) {
658
- // Handshaking
659
-
660
- // Ok, kind of harmfull part of code
661
- // Socket.IO is sending hash at the end of handshake
662
- // If protocol = 76
663
- // But we need to replace 'host' and 'origin' in response
664
- // So we split data to printable data and to non-printable
665
- // (Non-printable will come after double-CRLF)
657
+ //
658
+ // If the reverseProxy connection has an underlying socket,
659
+ // then behing the handshake.
660
+ //
661
+ if ( typeof reverseProxy . socket !== 'undefined' ) {
662
+ reverseProxy . socket . on ( 'data' , function handshake ( data ) {
663
+ //
664
+ // Ok, kind of harmfull part of code. Socket.IO sends a hash
665
+ // at the end of handshake if protocol === 76, but we need
666
+ // to replace 'host' and 'origin' in response so we split
667
+ // data to printable data and to non-printable. (Non-printable
668
+ // will come after double-CRLF).
669
+ //
666
670
var sdata = data . toString ( ) ;
667
671
668
- // Get Printable
672
+ // Get the Printable data
669
673
sdata = sdata . substr ( 0 , sdata . search ( CRLF + CRLF ) ) ;
670
674
671
- // Get Non-Printable
675
+ // Get the Non-Printable data
672
676
data = data . slice ( Buffer . byteLength ( sdata ) , data . length ) ;
673
677
674
- // Replace host and origin
678
+ // Replace the host and origin headers in the Printable data
675
679
sdata = sdata . replace ( remoteHost , options . host )
676
680
. replace ( remoteHost , options . host ) ;
677
681
678
682
try {
679
- // Write printable
683
+ //
684
+ // Write the printable and non-printable data to the socket
685
+ // from the original incoming request.
686
+ //
680
687
socket . write ( sdata ) ;
681
-
682
- // Write non-printable
683
688
socket . write ( data ) ;
684
689
}
685
690
catch ( e ) {
686
- request . end ( ) ;
691
+ reverseProxy . end ( ) ;
687
692
socket . end ( ) ;
688
693
}
689
694
690
695
// Catch socket errors
691
696
socket . on ( 'error' , function ( ) {
692
- request . end ( ) ;
697
+ reverseProxy . end ( ) ;
698
+ socket . end ( ) ;
693
699
} ) ;
694
700
695
701
// Remove data listener now that the 'handshake' is complete
696
- request . socket . removeListener ( 'data' , handshake ) ;
702
+ reverseProxy . socket . removeListener ( 'data' , handshake ) ;
697
703
} ) ;
698
704
}
705
+
706
+ reverseProxy . on ( 'error' , function ( err ) {
707
+ reverseProxy . end ( ) ;
708
+ socket . end ( ) ;
709
+ } ) ;
699
710
700
- // Write upgrade-head
701
711
try {
702
- request . write ( head ) ;
712
+ //
713
+ // Attempt to write the upgrade-head to the reverseProxy request.
714
+ //
715
+ reverseProxy . write ( head ) ;
703
716
}
704
717
catch ( ex ) {
705
- request . end ( ) ;
718
+ reverseProxy . end ( ) ;
706
719
socket . end ( ) ;
707
720
}
708
721
722
+ //
709
723
// If we have been passed buffered data, resume it.
724
+ //
710
725
if ( options . buffer && ! errState ) {
711
726
options . buffer . resume ( ) ;
712
727
}
0 commit comments