const http = require('node:http'), tls = require('node:tls'), fs = require('node:fs'), vscode = require('vscode'); function tryIt(label, make) { return new Promise(resolve => { const socket = tls.connect({ host: 'example.com', port: 443, servername: 'example.com' }); let done = false; const fin = r => { if (!done) { done = true; socket.destroy(); resolve(label + ': ' + r); } }; setTimeout(() => fin('timeout'), 15000); socket.once('secureConnect', () => { const req = make({ host: 'example.com', port: 443, path: '/', method: 'GET', headers: { Host: 'example.com' }, createConnection: () => socket }); req.on('response', res => { let b = ''; res.on('data', d => b += d); res.on('end', () => fin(res.statusCode + ' tlsSocketUsed=' + (req.socket === socket) + ' ' + b.slice(0, 80).replace(/\s+/g, ' '))); }); req.on('error', e => fin('error ' + e.code + ' ' + e.message)); req.end(); }); socket.on('error', e => fin('socket error ' + e.message)); }); } exports.run = async () => { const out = []; out.push('vscode ' + vscode.version + ' node ' + process.version + ' proxySupport=' + vscode.workspace.getConfiguration('http').get('proxySupport')); out.push('http.request name=' + http.request.name + ' patched=' + !/^function request\(url, options, cb\)/.test(http.request.toString().slice(0, 40)) + ' src=' + http.request.toString().slice(0, 60).replace(/\s+/g, ' ')); out.push(await tryIt('http.request + createConnection', o => http.request(o))); out.push(await tryIt('http.request + createConnection + agent:false', o => http.request({ ...o, agent: false }))); out.push(await tryIt('new http.ClientRequest + createConnection', o => new http.ClientRequest(o))); out.push(await tryIt('http.request + custom Agent overriding createConnection', o => { const { createConnection, ...rest } = o; class A extends http.Agent { createConnection() { return createConnection(); } } return http.request({ ...rest, agent: new A() }); })); fs.writeFileSync(process.env.REPRO_OUT, out.join('\n') + '\n'); };