Skip to content

Commit

Permalink
https: make https.globalAgent overridable also under ECMAScript Modules
Browse files Browse the repository at this point in the history
Under ECMAScript modules when you do "import * as https from 'https'"
you get a new object with properties copied from https module exports.
So if this is a regular data property, you will just override a copy,
but if this would be a accessor property, we can still access the actual
https.globalAgent.

Refs: nodejs#25170, nodejs#9386
  • Loading branch information
whut committed Jul 17, 2023
1 parent 7196946 commit a0dfaa5
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 2 deletions.
17 changes: 15 additions & 2 deletions lib/https.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const {
FunctionPrototypeCall,
JSONStringify,
ObjectAssign,
ObjectDefineProperty,
ObjectSetPrototypeOf,
ReflectApply,
ReflectConstruct,
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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;
},
});
41 changes: 41 additions & 0 deletions test/parallel/test-https-client-override-global-agent.mjs
Original file line number Diff line number Diff line change
@@ -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());
}

0 comments on commit a0dfaa5

Please sign in to comment.