@@ -35,6 +35,7 @@ const {
3535 ObjectSetPrototypeOf,
3636 ReflectApply,
3737 ReflectConstruct,
38+ Symbol,
3839 SymbolAsyncDispose,
3940} = primordials ;
4041
@@ -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,
@@ -281,6 +284,8 @@ function establishTunnel(agent, socket, options, tunnelConfig, afterSocket) {
281284 tunneldSocket . removeListener ( 'error' , onTLSHandshakeError ) ;
282285 afterSocket ( null , tunneldSocket ) ;
283286 } ) ;
287+ if ( requestOptions [ kPerRequestCheckServerIdentity ] )
288+ tunneldSocket [ kPerRequestCheckServerIdentity ] = true ;
284289 tunneldSocket . on ( 'free' , ( ) => {
285290 debug ( 'Propagate free event from tunneled socket to tunnel socket' ) ;
286291 socket . emit ( 'free' ) ;
@@ -349,7 +354,9 @@ function createConnection(...args) {
349354
350355 debug ( 'createConnection' , options ) ;
351356
352- if ( options . _agentKey ) {
357+ const reuseSession = options . _agentKey &&
358+ ! options [ kPerRequestCheckServerIdentity ] ;
359+ if ( reuseSession ) {
353360 const session = this . _getSession ( options . _agentKey ) ;
354361 if ( session ) {
355362 debug ( 'reuse session for %j' , options . _agentKey ) ;
@@ -416,7 +423,10 @@ function createConnection(...args) {
416423 socket [ kWaitForProxyTunnel ] = true ;
417424 }
418425
419- if ( options . _agentKey ) {
426+ if ( options [ kPerRequestCheckServerIdentity ] )
427+ socket [ kPerRequestCheckServerIdentity ] = true ;
428+
429+ if ( reuseSession ) {
420430 // Cache new session for reuse
421431 socket . on ( 'session' , ( session ) => {
422432 this . _cacheSession ( options . _agentKey , session ) ;
@@ -471,6 +481,12 @@ function Agent(options) {
471481ObjectSetPrototypeOf ( Agent . prototype , HttpAgent . prototype ) ;
472482ObjectSetPrototypeOf ( Agent , HttpAgent ) ;
473483Agent . prototype . createConnection = createConnection ;
484+ Agent . prototype . keepSocketAlive = function keepSocketAlive ( socket ) {
485+ if ( socket [ kPerRequestCheckServerIdentity ] )
486+ return false ;
487+
488+ return FunctionPrototypeCall ( HttpAgent . prototype . keepSocketAlive , this , socket ) ;
489+ } ;
474490
475491function getPfxAgentKey ( pfx , passphrase ) {
476492 if ( ! ArrayIsArray ( pfx ) )
@@ -579,6 +595,9 @@ Agent.prototype.getName = function getName(options = kEmptyObject) {
579595 if ( options . privateKeyEngine )
580596 name += options . privateKeyEngine ;
581597
598+ if ( options [ kPerRequestCheckServerIdentity ] )
599+ name += `:${ options [ kPerRequestCheckServerIdentity ] } ` ;
600+
582601 return name ;
583602} ;
584603
@@ -619,6 +638,20 @@ Agent.prototype._evictSession = function _evictSession(key) {
619638
620639const globalAgent = getGlobalAgent ( getOptionValue ( '--use-env-proxy' ) ? process . env : undefined , Agent ) ;
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