Add CLI for request proxy

Closes #364, #377, #1756
This commit is contained in:
Cohee 2024-09-12 20:25:58 +03:00
parent 051cdf5548
commit b9d5c61b2e
2 changed files with 38 additions and 14 deletions

View File

@ -76,6 +76,10 @@ const DEFAULT_AVOID_LOCALHOST = false;
const DEFAULT_AUTORUN_HOSTNAME = 'auto'; const DEFAULT_AUTORUN_HOSTNAME = 'auto';
const DEFAULT_AUTORUN_PORT = -1; const DEFAULT_AUTORUN_PORT = -1;
const DEFAULT_PROXY_ENABLED = false;
const DEFAULT_PROXY_URL = '';
const DEFAULT_PROXY_BYPASS = [];
const cliArguments = yargs(hideBin(process.argv)) const cliArguments = yargs(hideBin(process.argv))
.usage('Usage: <your-start-script> <command> [options]') .usage('Usage: <your-start-script> <command> [options]')
.option('enableIPv6', { .option('enableIPv6', {
@ -146,6 +150,18 @@ const cliArguments = yargs(hideBin(process.argv))
type: 'boolean', type: 'boolean',
default: null, default: null,
describe: 'Enables basic authentication', describe: 'Enables basic authentication',
}).option('requestProxyEnabled', {
type: 'boolean',
default: null,
describe: 'Enables request proxy',
}).option('requestProxyUrl', {
type: 'string',
default: null,
describe: 'Request proxy URL',
}).option('requestProxyBypasss', {
type: 'array',
default: null,
describe: 'Request proxy bypass',
}).parseSync(); }).parseSync();
// change all relative paths // change all relative paths
@ -182,6 +198,10 @@ const dnsPreferIPv6 = cliArguments.dnsPreferIPv6 ?? getConfigValue('dnsPreferIPv
const avoidLocalhost = cliArguments.avoidLocalhost ?? getConfigValue('avoidLocalhost', DEFAULT_AVOID_LOCALHOST); const avoidLocalhost = cliArguments.avoidLocalhost ?? getConfigValue('avoidLocalhost', DEFAULT_AVOID_LOCALHOST);
const proxyEnabled = cliArguments.requestProxyEnabled ?? getConfigValue('requestProxy.enabled', DEFAULT_PROXY_ENABLED);
const proxyUrl = cliArguments.requestProxyUrl ?? getConfigValue('requestProxy.url', DEFAULT_PROXY_URL);
const proxyBypass = cliArguments.requestProxyBypass ?? getConfigValue('requestProxy.bypass', DEFAULT_PROXY_BYPASS);
if (dnsPreferIPv6) { if (dnsPreferIPv6) {
// Set default DNS resolution order to IPv6 first // Set default DNS resolution order to IPv6 first
dns.setDefaultResultOrder('ipv6first'); dns.setDefaultResultOrder('ipv6first');
@ -665,7 +685,7 @@ const preSetupTasks = async function () {
}); });
// Add request proxy. // Add request proxy.
initRequestProxy(); initRequestProxy({ enabled: proxyEnabled, url: proxyUrl, bypass: proxyBypass });
}; };
/** /**

View File

@ -1,40 +1,44 @@
const http = require('node:http'); const http = require('node:http');
const https = require('node:https'); const https = require('node:https');
const { getConfigValue, isValidUrl, color } = require('./util.js'); const { isValidUrl, color } = require('./util.js');
const LOG_HEADER = '[Request Proxy]'; const LOG_HEADER = '[Request Proxy]';
function initRequestProxy() { /**
* Initialize request proxy.
* @param {ProxySettings} settings Proxy settings.
* @typedef {object} ProxySettings
* @property {boolean} enabled Whether proxy is enabled.
* @property {string} url Proxy URL.
* @property {string[]} bypass List of URLs to bypass proxy.
*/
function initRequestProxy({ enabled, url, bypass }) {
try { try {
const { ProxyAgent } = require('proxy-agent'); const { ProxyAgent } = require('proxy-agent');
const proxyEnabled = getConfigValue('requestProxy.enabled', false);
// No proxy is enabled, so return // No proxy is enabled, so return
if (!proxyEnabled) { if (!enabled) {
return; return;
} }
const proxyUrl = getConfigValue('requestProxy.url', ''); if (!url) {
if (!proxyUrl) {
console.error(color.red(LOG_HEADER), 'No proxy URL provided'); console.error(color.red(LOG_HEADER), 'No proxy URL provided');
return; return;
} }
if (!isValidUrl(proxyUrl)) { if (!isValidUrl(url)) {
console.error(color.red(LOG_HEADER), 'Invalid proxy URL provided'); console.error(color.red(LOG_HEADER), 'Invalid proxy URL provided');
return; return;
} }
// ProxyAgent uses proxy-from-env under the hood // ProxyAgent uses proxy-from-env under the hood
// Reference: https://github.com/Rob--W/proxy-from-env // Reference: https://github.com/Rob--W/proxy-from-env
process.env.all_proxy = proxyUrl; process.env.all_proxy = url;
const proxyBypass = getConfigValue('requestProxy.bypass', []);
if (Array.isArray(proxyBypass) && proxyBypass.length > 0) { if (Array.isArray(bypass) && bypass.length > 0) {
process.env.no_proxy = proxyBypass.join(','); process.env.no_proxy = bypass.join(',');
} }
const proxyAgent = new ProxyAgent(); const proxyAgent = new ProxyAgent();
@ -42,7 +46,7 @@ function initRequestProxy() {
https.globalAgent = proxyAgent; https.globalAgent = proxyAgent;
console.log(); console.log();
console.log(color.green(LOG_HEADER), 'Proxy URL is used:', color.blue(proxyUrl)); console.log(color.green(LOG_HEADER), 'Proxy URL is used:', color.blue(url));
console.log(); console.log();
} catch (error) { } catch (error) {
console.error(color.red(LOG_HEADER), 'Failed to initialize request proxy:', error); console.error(color.red(LOG_HEADER), 'Failed to initialize request proxy:', error);