@@ -54,7 +54,7 @@ const EE = require('events');
5454const net = require ( 'net' ) ;
5555const tls = require ( 'tls' ) ;
5656const common = require ( '_tls_common' ) ;
57- const { kWrapConnectedHandle } = require ( 'internal/net' ) ;
57+ const { kReinitializeHandle } = require ( 'internal/net' ) ;
5858const JSStreamSocket = require ( 'internal/js_stream_socket' ) ;
5959const { Buffer } = require ( 'buffer' ) ;
6060let debug = require ( 'internal/util/debuglog' ) . debuglog ( 'tls' , ( fn ) => {
@@ -633,14 +633,27 @@ TLSSocket.prototype._wrapHandle = function(wrap, handle) {
633633 return res ;
634634} ;
635635
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 ) ;
638641 this . ssl = this . _handle ;
642+
643+ net . Socket . prototype [ kReinitializeHandle ] . call ( this , this . handle ) ;
639644 this . _init ( ) ;
640645
641646 if ( this . _tlsOptions . enableTrace ) {
642647 this . _handle . enableTrace ( ) ;
643648 }
649+
650+ if ( originalSession ) {
651+ this . setSession ( originalSession ) ;
652+ }
653+
654+ if ( originalServername ) {
655+ this . setServername ( originalServername ) ;
656+ }
644657} ;
645658
646659// This eliminates a cyclic reference to TLSWrap
@@ -679,6 +692,30 @@ TLSSocket.prototype._destroySSL = function _destroySSL() {
679692 this [ kIsVerified ] = false ;
680693} ;
681694
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+
682719// Constructor guts, arbitrarily factored out.
683720let warnOnTlsKeylog = true ;
684721let warnOnTlsKeylogError = true ;
@@ -704,18 +741,9 @@ TLSSocket.prototype._init = function(socket, wrap) {
704741
705742 // Only call .onkeylog if there is a keylog listener.
706743 ssl . onkeylog = onkeylog ;
707- this . on ( 'newListener' , keylogNewListener ) ;
708744
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 ) ;
719747 }
720748
721749 if ( options . isServer ) {
@@ -750,18 +778,8 @@ TLSSocket.prototype._init = function(socket, wrap) {
750778 ssl . onnewsession = onnewsessionclient ;
751779
752780 // 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 ) ;
765783 }
766784 }
767785
0 commit comments