diff --git a/lib/https.js b/lib/https.js index d8b42c85493f7e..801a5ee95063a3 100644 --- a/lib/https.js +++ b/lib/https.js @@ -30,6 +30,7 @@ const { FunctionPrototypeCall, JSONStringify, ObjectAssign, + ObjectDefineProperty, ObjectSetPrototypeOf, ReflectApply, ReflectConstruct, @@ -350,7 +351,7 @@ Agent.prototype._evictSession = function _evictSession(key) { delete this._sessionCache.map[key]; }; -const globalAgent = new Agent({ keepAlive: true, scheduling: 'lifo', timeout: 5000 }); +let globalAgent = new Agent({ keepAlive: true, scheduling: 'lifo', timeout: 5000 }); /** * Makes a request to a secure web server. @@ -415,9 +416,21 @@ function get(input, options, cb) { module.exports = { Agent, - globalAgent, Server, createServer, get, request, }; + +// Make https.globalAgent overridable also under ECMAScript Modules +ObjectDefineProperty(module.exports, 'globalAgent', { + __proto__: null, + configurable: true, + enumerable: true, + get() { + return globalAgent; + }, + set(value) { + globalAgent = value; + }, +}); diff --git a/test/parallel/test-https-client-override-global-agent.mjs b/test/parallel/test-https-client-override-global-agent.mjs new file mode 100644 index 00000000000000..462a12ea71c7e4 --- /dev/null +++ b/test/parallel/test-https-client-override-global-agent.mjs @@ -0,0 +1,41 @@ +import { hasCrypto, skip, mustCall } from '../common'; +if (!hasCrypto) skip('missing crypto'); +import { readKey } from '../common/fixtures'; +import assert from 'assert'; +// To override https.globalAgent we need to use namespace import +import * as https from 'https'; + +// Disable strict server certificate validation by the client +process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + +const options = { + key: readKey('agent1-key.pem'), + cert: readKey('agent1-cert.pem'), +}; + +const server = https.Server( + options, + mustCall((req, res) => { + res.writeHead(200); + res.end('Hello, World!'); + }) +); + +server.listen( + 0, + mustCall(() => { + const agent = new https.Agent(); + const name = agent.getName({ port: server.address().port }); + https.globalAgent = agent; + + makeRequest(); + assert(name in agent.sockets); // Agent has indeed been used + }) +); + +function makeRequest() { + const req = https.get({ + port: server.address().port, + }); + req.on('close', () => server.close()); +}