@@ -530,24 +530,30 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
530
530
}
531
531
}
532
532
533
- function onUpgrade ( reverseProxy ) {
533
+ function onUpgrade ( out , reverseProxy ) {
534
+ if ( ! out ) {
535
+ reverseProxy . end ( ) ;
536
+ socket . end ( ) ;
537
+ return ;
538
+ }
539
+
534
540
var listeners = { } ;
535
541
536
542
// We're now connected to the server, so lets change server socket
537
543
reverseProxy . on ( 'data' , listeners . _r_data = function ( data ) {
538
544
// Pass data to client
539
- if ( socket . writable ) {
545
+ if ( out . incoming . socket . writable ) {
540
546
try {
541
- socket . write ( data ) ;
547
+ out . incoming . socket . write ( data ) ;
542
548
}
543
549
catch ( e ) {
544
- socket . end ( ) ;
550
+ out . incoming . socket . end ( ) ;
545
551
reverseProxy . end ( ) ;
546
552
}
547
553
}
548
554
} ) ;
549
555
550
- socket . on ( 'data' , listeners . _data = function ( data ) {
556
+ out . incoming . socket . on ( 'data' , listeners . _data = function ( data ) {
551
557
// Pass data from client to server
552
558
try {
553
559
reverseProxy . write ( data ) ;
@@ -562,13 +568,13 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
562
568
function detach ( ) {
563
569
reverseProxy . removeListener ( 'close' , listeners . _r_close ) ;
564
570
reverseProxy . removeListener ( 'data' , listeners . _r_data ) ;
565
- socket . removeListener ( 'data' , listeners . _data ) ;
566
- socket . removeListener ( 'close' , listeners . _close ) ;
571
+ out . incoming . socket . removeListener ( 'data' , listeners . _data ) ;
572
+ out . incoming . socket . removeListener ( 'close' , listeners . _close ) ;
567
573
}
568
574
569
575
// Hook disconnections
570
576
reverseProxy . on ( 'end' , listeners . _r_close = function ( ) {
571
- socket . end ( ) ;
577
+ out . incoming . socket . end ( ) ;
572
578
detach ( ) ;
573
579
} ) ;
574
580
@@ -592,27 +598,47 @@ HttpProxy.prototype.proxyWebSocketRequest = function (req, socket, head, options
592
598
outgoing = {
593
599
host : options . host ,
594
600
port : options . port ,
595
- agent : agent ,
596
601
method : 'GET' ,
597
602
path : req . url ,
598
- headers : req . headers
603
+ headers : req . headers ,
599
604
} ;
600
605
601
606
// Make the outgoing WebSocket request
602
- var request = http . request ( outgoing , function ( ) { } ) ;
603
-
604
- // Not disconnect on update
605
- agent . on ( 'upgrade' , function ( request , remoteSocket , head ) {
606
- // Prepare socket
607
- _socket ( remoteSocket , true ) ;
607
+ var request = agent . appendMessage ( outgoing ) ;
608
608
609
- // Emit event
610
- onUpgrade ( remoteSocket ) ;
611
- } ) ;
609
+ //
610
+ // Here we set the incoming `req`, `socket` and `head` data to the outgoing
611
+ // request so that we can reuse this data later on in the closure scope
612
+ // available to the `upgrade` event. This bookkeeping is not tracked anywhere
613
+ // in nodejs core and is **very** specific to proxying WebSockets.
614
+ //
615
+ request . agent = agent ;
616
+ request . incoming = {
617
+ request : req ,
618
+ socket : socket ,
619
+ head : head
620
+ } ;
621
+
622
+ //
623
+ // If the agent for this particular `host` and `port` combination
624
+ // is not already listening for the `upgrade` event, then do so once.
625
+ // This will force us not to disconnect.
626
+ //
627
+ // In addition, it's important to note the closure scope here. Since
628
+ // there is no mapping of the
629
+ //
630
+ if ( ! agent . _events || agent . _events [ 'upgrade' ] . length === 0 ) {
631
+ agent . on ( 'upgrade' , function ( out , remoteSocket , head ) {
632
+ // Prepare socket
633
+ _socket ( remoteSocket , true ) ;
634
+
635
+ // Emit event
636
+ onUpgrade ( remoteSocket . _httpMessage , remoteSocket ) ;
637
+ } ) ;
638
+ }
612
639
613
- var handshake ;
614
640
if ( typeof request . socket !== 'undefined' ) {
615
- request . socket . on ( 'data' , handshake = function ( data ) {
641
+ request . socket . on ( 'data' , function handshake ( data ) {
616
642
// Handshaking
617
643
618
644
// Ok, kind of harmfull part of code
0 commit comments