@@ -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