@@ -35,6 +35,7 @@ const {
3535 ObjectSetPrototypeOf,
3636 ReflectApply,
3737 ReflectConstruct,
38+ Symbol,
3839} = primordials ;
3940
4041const {
@@ -48,6 +49,8 @@ const { ERR_PROXY_TUNNEL } = require('internal/errors').codes;
4849assertCrypto ( ) ;
4950
5051const tls = require ( 'tls' ) ;
52+ const kPerRequestCheckServerIdentity = Symbol ( 'per-request checkServerIdentity' ) ;
53+ let perRequestCheckServerIdentityIndex = 0 ;
5154const {
5255 kProxyConfig,
5356 checkShouldUseProxy,
@@ -277,6 +280,8 @@ function establishTunnel(agent, socket, options, tunnelConfig, afterSocket) {
277280 tunneldSocket . removeListener ( 'error' , onTLSHandshakeError ) ;
278281 afterSocket ( null , tunneldSocket ) ;
279282 } ) ;
283+ if ( requestOptions [ kPerRequestCheckServerIdentity ] )
284+ tunneldSocket [ kPerRequestCheckServerIdentity ] = true ;
280285 tunneldSocket . on ( 'free' , ( ) => {
281286 debug ( 'Propagate free event from tunneled socket to tunnel socket' ) ;
282287 socket . emit ( 'free' ) ;
@@ -345,7 +350,9 @@ function createConnection(...args) {
345350
346351 debug ( 'createConnection' , options ) ;
347352
348- if ( options . _agentKey ) {
353+ const reuseSession = options . _agentKey &&
354+ ! options [ kPerRequestCheckServerIdentity ] ;
355+ if ( reuseSession ) {
349356 const session = this . _getSession ( options . _agentKey ) ;
350357 if ( session ) {
351358 debug ( 'reuse session for %j' , options . _agentKey ) ;
@@ -412,7 +419,10 @@ function createConnection(...args) {
412419 socket [ kWaitForProxyTunnel ] = true ;
413420 }
414421
415- if ( options . _agentKey ) {
422+ if ( options [ kPerRequestCheckServerIdentity ] )
423+ socket [ kPerRequestCheckServerIdentity ] = true ;
424+
425+ if ( reuseSession ) {
416426 // Cache new session for reuse
417427 socket . on ( 'session' , ( session ) => {
418428 this . _cacheSession ( options . _agentKey , session ) ;
@@ -467,6 +477,12 @@ function Agent(options) {
467477ObjectSetPrototypeOf ( Agent . prototype , HttpAgent . prototype ) ;
468478ObjectSetPrototypeOf ( Agent , HttpAgent ) ;
469479Agent . prototype . createConnection = createConnection ;
480+ Agent . prototype . keepSocketAlive = function keepSocketAlive ( socket ) {
481+ if ( socket [ kPerRequestCheckServerIdentity ] )
482+ return false ;
483+
484+ return FunctionPrototypeCall ( HttpAgent . prototype . keepSocketAlive , this , socket ) ;
485+ } ;
470486
471487function getPfxAgentKey ( pfx , passphrase ) {
472488 if ( ! ArrayIsArray ( pfx ) )
@@ -575,6 +591,9 @@ Agent.prototype.getName = function getName(options = kEmptyObject) {
575591 if ( options . privateKeyEngine )
576592 name += options . privateKeyEngine ;
577593
594+ if ( options [ kPerRequestCheckServerIdentity ] )
595+ name += `:${ options [ kPerRequestCheckServerIdentity ] } ` ;
596+
578597 return name ;
579598} ;
580599
@@ -619,6 +638,20 @@ const globalAgent = new Agent({
619638 proxyEnv : getOptionValue ( '--use-env-proxy' ) ? filterEnvForProxies ( process . env ) : undefined ,
620639} ) ;
621640
641+ function hasAgentCheckServerIdentity ( options ) {
642+ let { agent } = options ;
643+ if ( agent === false )
644+ return false ;
645+
646+ if ( agent === null || agent === undefined ) {
647+ if ( typeof options . createConnection === 'function' )
648+ return false ;
649+ agent = module . exports . globalAgent ;
650+ }
651+
652+ return agent ?. options ?. checkServerIdentity !== undefined ;
653+ }
654+
622655/**
623656 * Makes a request to a secure web server.
624657 * @param {...any } args
@@ -638,6 +671,13 @@ function request(...args) {
638671 ObjectAssign ( options , ArrayPrototypeShift ( args ) ) ;
639672 }
640673
674+ if ( options . checkServerIdentity !== undefined &&
675+ options . checkServerIdentity !== tls . checkServerIdentity &&
676+ ! hasAgentCheckServerIdentity ( options ) ) {
677+ options [ kPerRequestCheckServerIdentity ] =
678+ ++ perRequestCheckServerIdentityIndex ;
679+ }
680+
641681 options . _defaultAgent = module . exports . globalAgent ;
642682 ArrayPrototypeUnshift ( args , options ) ;
643683
0 commit comments