@@ -551,14 +551,14 @@ function Server(/* [options], listener */) {
551
551
true ,
552
552
self . requestCert ,
553
553
self . rejectUnauthorized ) ;
554
- pair . encrypted . pipe ( socket ) ;
555
- socket . pipe ( pair . encrypted ) ;
556
554
557
- pair . cleartext . socket = socket ;
555
+ var cleartext = pipe ( pair , socket ) ;
556
+ cleartext . _controlReleased = false ;
558
557
559
558
pair . on ( 'secure' , function ( ) {
560
559
pair . cleartext . authorized = false ;
561
560
if ( ! self . requestCert ) {
561
+ cleartext . _controlReleased = true ;
562
562
self . emit ( 'secureConnection' , pair . cleartext , pair . encrypted ) ;
563
563
} else {
564
564
var verifyError = pair . _ssl . verifyError ( ) ;
@@ -569,10 +569,12 @@ function Server(/* [options], listener */) {
569
569
socket . destroy ( ) ;
570
570
pair . _destroy ( ) ;
571
571
} else {
572
+ cleartext . _controlReleased = true ;
572
573
self . emit ( 'secureConnection' , pair . cleartext , pair . encrypted ) ;
573
574
}
574
575
} else {
575
576
pair . cleartext . authorized = true ;
577
+ cleartext . _controlReleased = true ;
576
578
self . emit ( 'secureConnection' , pair . cleartext , pair . encrypted ) ;
577
579
}
578
580
}
@@ -661,13 +663,7 @@ exports.connect = function(port /* host, options, cb */) {
661
663
662
664
var pair = new SecurePair ( sslcontext , false ) ;
663
665
664
- pair . encrypted . pipe ( socket ) ;
665
- socket . pipe ( pair . encrypted ) ;
666
-
667
- var cleartext = pair . cleartext ;
668
- cleartext . socket = socket ;
669
- cleartext . encrypted = pair . encrypted ;
670
- cleartext . authorized = false ;
666
+ var cleartext = pipe ( pair , socket ) ;
671
667
672
668
socket . connect ( port , host ) ;
673
669
@@ -684,5 +680,33 @@ exports.connect = function(port /* host, options, cb */) {
684
680
if ( cb ) cb ( ) ;
685
681
} ) ;
686
682
683
+ cleartext . _controlReleased = true ;
687
684
return cleartext ;
688
685
} ;
686
+
687
+
688
+ function pipe ( pair , socket ) {
689
+ pair . encrypted . pipe ( socket ) ;
690
+ socket . pipe ( pair . encrypted ) ;
691
+
692
+ var cleartext = pair . cleartext ;
693
+ cleartext . socket = socket ;
694
+ cleartext . encrypted = pair . encrypted ;
695
+ cleartext . authorized = false ;
696
+
697
+ function onerror ( e ) {
698
+ if ( cleartext . _controlReleased ) {
699
+ cleartext . emit ( 'error' , e ) ;
700
+ }
701
+ }
702
+
703
+ function onclose ( ) {
704
+ socket . removeListener ( 'error' , onerror ) ;
705
+ socket . removeListener ( 'close' , onclose ) ;
706
+ }
707
+
708
+ socket . on ( 'error' , onerror ) ;
709
+ socket . on ( 'close' , onclose ) ;
710
+
711
+ return cleartext ;
712
+ }
0 commit comments