|
|
|
@ -1,7 +1,13 @@
|
|
|
|
|
const { R } = require("redbean-node");
|
|
|
|
|
const HttpProxyAgent = require("http-proxy-agent");
|
|
|
|
|
const HttpsProxyAgent = require("https-proxy-agent");
|
|
|
|
|
const SocksProxyAgent = require("socks-proxy-agent");
|
|
|
|
|
const { debug } = require("../src/util");
|
|
|
|
|
|
|
|
|
|
class Proxy {
|
|
|
|
|
|
|
|
|
|
static SUPPORTED_PROXY_PROTOCOLS = ["http", "https", "socks", "socks5", "socks4"]
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Saves and updates given proxy entity
|
|
|
|
|
*
|
|
|
|
@ -25,8 +31,11 @@ class Proxy {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Make sure given proxy protocol is supported
|
|
|
|
|
if (!["http", "https"].includes(proxy.protocol)) {
|
|
|
|
|
throw new Error(`Unsupported proxy protocol "${proxy.protocol}. Supported protocols are http and https."`);
|
|
|
|
|
if (!this.SUPPORTED_PROXY_PROTOCOLS.includes(proxy.protocol)) {
|
|
|
|
|
throw new Error(`
|
|
|
|
|
Unsupported proxy protocol "${proxy.protocol}.
|
|
|
|
|
Supported protocols are ${this.SUPPORTED_PROXY_PROTOCOLS.join(", ")}."`
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// When proxy is default update deactivate old default proxy
|
|
|
|
@ -73,6 +82,68 @@ class Proxy {
|
|
|
|
|
// Delete proxy from list
|
|
|
|
|
await R.trash(bean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create HTTP and HTTPS agents related with given proxy bean object
|
|
|
|
|
*
|
|
|
|
|
* @param proxy proxy bean object
|
|
|
|
|
* @param options http and https agent options
|
|
|
|
|
* @return {{httpAgent: Agent, httpsAgent: Agent}}
|
|
|
|
|
*/
|
|
|
|
|
static createAgents(proxy, options) {
|
|
|
|
|
const { httpAgentOptions, httpsAgentOptions } = options || {};
|
|
|
|
|
let agent;
|
|
|
|
|
let httpAgent;
|
|
|
|
|
let httpsAgent;
|
|
|
|
|
|
|
|
|
|
const proxyOptions = {
|
|
|
|
|
protocol: proxy.protocol,
|
|
|
|
|
host: proxy.host,
|
|
|
|
|
port: proxy.port,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (proxy.auth) {
|
|
|
|
|
proxyOptions.auth = `${proxy.username}:${proxy.password}`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
debug(`Proxy Options: ${JSON.stringify(proxyOptions)}`);
|
|
|
|
|
debug(`HTTP Agent Options: ${JSON.stringify(httpAgentOptions)}`);
|
|
|
|
|
debug(`HTTPS Agent Options: ${JSON.stringify(httpsAgentOptions)}`);
|
|
|
|
|
|
|
|
|
|
switch (proxy.protocol) {
|
|
|
|
|
case "http":
|
|
|
|
|
case "https":
|
|
|
|
|
httpAgent = new HttpProxyAgent({
|
|
|
|
|
...httpAgentOptions || {},
|
|
|
|
|
...proxyOptions
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
httpsAgent = new HttpsProxyAgent({
|
|
|
|
|
...httpsAgentOptions || {},
|
|
|
|
|
...proxyOptions,
|
|
|
|
|
});
|
|
|
|
|
break;
|
|
|
|
|
case "socks":
|
|
|
|
|
case "socks5":
|
|
|
|
|
case "socks4":
|
|
|
|
|
agent = new SocksProxyAgent({
|
|
|
|
|
...httpAgentOptions,
|
|
|
|
|
...httpsAgentOptions,
|
|
|
|
|
...proxyOptions,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
httpAgent = agent;
|
|
|
|
|
httpsAgent = agent;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default: throw new Error(`Unsupported proxy protocol provided. ${proxy.protocol}`);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
httpAgent,
|
|
|
|
|
httpsAgent
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|