'use strict'; const url = require('url'); const getProxy = require('get-proxy'); const isurl = require('isurl'); const tunnelAgent = require('tunnel-agent'); const urlToOptions = require('url-to-options'); module.exports = (proxy, opts) => { proxy = proxy || getProxy(); opts = Object.assign({}, opts); if (typeof proxy === 'object') { opts = proxy; proxy = getProxy(); } if (!proxy) { return null; } proxy = isurl.lenient(proxy) ? urlToOptions(proxy) : url.parse(proxy); const uriProtocol = opts.protocol === 'https' ? 'https' : 'http'; const proxyProtocol = proxy.protocol === 'https:' ? 'Https' : 'Http'; const port = proxy.port || (proxyProtocol === 'Https' ? 443 : 80); const method = `${uriProtocol}Over${proxyProtocol}`; delete opts.protocol; return tunnelAgent[method](Object.assign({ proxy: { port, host: proxy.hostname, proxyAuth: proxy.auth } }, opts)); };