@@ -54,7 +54,7 @@ const EE = require('events');
54
54
const net = require ( 'net' ) ;
55
55
const tls = require ( 'tls' ) ;
56
56
const common = require ( '_tls_common' ) ;
57
- const { kWrapConnectedHandle } = require ( 'internal/net' ) ;
57
+ const { kReinitializeHandle } = require ( 'internal/net' ) ;
58
58
const JSStreamSocket = require ( 'internal/js_stream_socket' ) ;
59
59
const { Buffer } = require ( 'buffer' ) ;
60
60
let debug = require ( 'internal/util/debuglog' ) . debuglog ( 'tls' , ( fn ) => {
@@ -633,14 +633,27 @@ TLSSocket.prototype._wrapHandle = function(wrap, handle) {
633
633
return res ;
634
634
} ;
635
635
636
- TLSSocket . prototype [ kWrapConnectedHandle ] = function ( handle ) {
637
- this . _handle = this . _wrapHandle ( null , handle ) ;
636
+ TLSSocket . prototype [ kReinitializeHandle ] = function reinitializeHandle ( handle ) {
637
+ const originalServername = this . _handle . getServername ( ) ;
638
+ const originalSession = this . _handle . getSession ( ) ;
639
+
640
+ this . handle = this . _wrapHandle ( null , handle ) ;
638
641
this . ssl = this . _handle ;
642
+
643
+ net . Socket . prototype [ kReinitializeHandle ] . call ( this , this . handle ) ;
639
644
this . _init ( ) ;
640
645
641
646
if ( this . _tlsOptions . enableTrace ) {
642
647
this . _handle . enableTrace ( ) ;
643
648
}
649
+
650
+ if ( originalSession ) {
651
+ this . setSession ( originalSession ) ;
652
+ }
653
+
654
+ if ( originalServername ) {
655
+ this . setServername ( originalServername ) ;
656
+ }
644
657
} ;
645
658
646
659
// This eliminates a cyclic reference to TLSWrap
@@ -679,6 +692,30 @@ TLSSocket.prototype._destroySSL = function _destroySSL() {
679
692
this [ kIsVerified ] = false ;
680
693
} ;
681
694
695
+ function keylogNewListener ( event ) {
696
+ if ( event !== 'keylog' )
697
+ return ;
698
+
699
+ // Guard against enableKeylogCallback after destroy
700
+ if ( ! this . _handle ) return ;
701
+ this . _handle . enableKeylogCallback ( ) ;
702
+
703
+ // Remove this listener since it's no longer needed.
704
+ this . removeListener ( 'newListener' , keylogNewListener ) ;
705
+ }
706
+
707
+ function newListener ( event ) {
708
+ if ( event !== 'session' )
709
+ return ;
710
+
711
+ // Guard against enableSessionCallbacks after destroy
712
+ if ( ! this . _handle ) return ;
713
+ this . _handle . enableSessionCallbacks ( ) ;
714
+
715
+ // Remove this listener since it's no longer needed.
716
+ this . removeListener ( 'newListener' , newListener ) ;
717
+ }
718
+
682
719
// Constructor guts, arbitrarily factored out.
683
720
let warnOnTlsKeylog = true ;
684
721
let warnOnTlsKeylogError = true ;
@@ -704,18 +741,9 @@ TLSSocket.prototype._init = function(socket, wrap) {
704
741
705
742
// Only call .onkeylog if there is a keylog listener.
706
743
ssl . onkeylog = onkeylog ;
707
- this . on ( 'newListener' , keylogNewListener ) ;
708
744
709
- function keylogNewListener ( event ) {
710
- if ( event !== 'keylog' )
711
- return ;
712
-
713
- // Guard against enableKeylogCallback after destroy
714
- if ( ! this . _handle ) return ;
715
- this . _handle . enableKeylogCallback ( ) ;
716
-
717
- // Remove this listener since it's no longer needed.
718
- this . removeListener ( 'newListener' , keylogNewListener ) ;
745
+ if ( this . listenerCount ( 'newListener' , keylogNewListener ) === 0 ) {
746
+ this . on ( 'newListener' , keylogNewListener ) ;
719
747
}
720
748
721
749
if ( options . isServer ) {
@@ -750,18 +778,8 @@ TLSSocket.prototype._init = function(socket, wrap) {
750
778
ssl . onnewsession = onnewsessionclient ;
751
779
752
780
// Only call .onnewsession if there is a session listener.
753
- this . on ( 'newListener' , newListener ) ;
754
-
755
- function newListener ( event ) {
756
- if ( event !== 'session' )
757
- return ;
758
-
759
- // Guard against enableSessionCallbacks after destroy
760
- if ( ! this . _handle ) return ;
761
- this . _handle . enableSessionCallbacks ( ) ;
762
-
763
- // Remove this listener since it's no longer needed.
764
- this . removeListener ( 'newListener' , newListener ) ;
781
+ if ( this . listenerCount ( 'newListener' , newListener ) === 0 ) {
782
+ this . on ( 'newListener' , newListener ) ;
765
783
}
766
784
}
767
785
0 commit comments