mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-18 22:33:26 +08:00
* style: add eslint-unicorn * style: fix unicorn/no-useless-spread * style: fix unicorn/no-useless-promise-resolve-reject * style: fix unicorn/no-for-loop * fix: codeql bad HTML filtering regexp * fix: codeql incomplete replace * fix: unicorn/no-abusive-eslint-disable * style: fix unicorn/no-new-array * style: fix unicorn/no-typeof-undefined * style: fix unicorn/no-zero-fractions * style: fix unicorn/no-empty-file * style: fix unicorn/prefer-date-now * revert: auto fix unicorn/prefer-switch on lib/v2/kuaidi100/utils.js * style: fix unicorn/prefer-array-find * style: fix unicorn/prefer-array-flat * style: fix unicorn/prefer-array-flat-map * style: fix unicorn/prefer-at * style: fix unicorn/prefer-string-starts-ends-with * style: fix unicorn/prefer-includes * fix: codeql URL substring sanitization * style: fix unicorn/prefer-optional-catch-binding * style: fix unicorn/catch-error-name * style: fix unicorn/escape-case * style: fix unicorn/prefer-native-coercion-functions * style: fix unicorn/prefer-regexp-test * style: fix unicorn/require-array-join-separator * style: fix unicorn/prefer-math-trunc * style: fix unicorn/prefer-negative-index * style: fix unicorn/prefer-dom-node-dataset * style: fix unicorn/prefer-dom-node-text-content * style: fix unicorn/prefer-query-selector * style: fix unicorn/no-array-for-each * style: fix unicorn/no-negated-condition * style: fix unicorn/prefer-add-event-listener * style: fix unicorn/import-style * style: fix prefer-regex-literals * style: disable unicorn/no-useless-switch-case * style: disable unicorn/text-encoding-identifier-case * style: fix unicorn/prefer-set-has * style: fix unicorn/prefer-spread * revert: auto fix on lib/routes/universities/ynnu/edu/base64.js * style: fix unicorn/no-useless-undefined * style: fix unicorn/no-array-push-push * style: fix unicorn/no-useless-undefined again * style: fix unicorn/no-lonely-if * style: fix unicorn/prefer-reflect-apply * style: fix unicorn/switch-case-braces * style: fix unicorn/prefer-switch * style: fix unicorn/prefer-array-some * fix: deepscan UNUSED_VAR_ASSIGN * style: fix unicorn/prefer-ternary * fix: follow-up of unicorn/prefer-ternary * revert: auto fix of unicorn/prefer-string-slice for substring() * style: disable unicorn/prefer-string-slice fix: auto fix slice over deprecated substr * style: fix unicorn/throw-new-error * style: fix unicorn/filename-case * test: fix dateParser renaming * style: fix unicorn/better-regex * style: fix unicorn/prefer-string-replace-all * fix(deps): add sanitize-html * style: fix no-prototype-builtins * style: fix unicorn/consistent-destructuring * style: fix unicorn/consistent-function-scoping * style: fix unicorn/prefer-regexp-test * style: fix unicorn/prefer-logical-operator-over-ternary * style: fix unicorn/no-array-callback-reference * style: add prefer-object-has-own * style: warn unicorn/no-empty-file * style: fix unicorn/prefer-number-properties * style: fix no-useless-undefined again * style: fix unicorn/numeric-separators-style * style: disable unicorn/no-array-callback-reference false postive with cheerio
132 lines
4.0 KiB
JavaScript
132 lines
4.0 KiB
JavaScript
const config = require('@/config').value;
|
|
const proxyIsPAC = config.pacUri || config.pacScript;
|
|
const { proxyUri, proxyObj, proxyUrlHandler } = proxyIsPAC ? require('./pac-proxy') : require('./unify-proxy');
|
|
const logger = require('./logger');
|
|
const http = require('http');
|
|
const https = require('https');
|
|
|
|
let agent = null;
|
|
if (proxyIsPAC) {
|
|
const { PacProxyAgent } = require('pac-proxy-agent');
|
|
agent = new PacProxyAgent(`pac+${proxyUri}`);
|
|
} else if (proxyUri) {
|
|
if (proxyUri.startsWith('http')) {
|
|
const { HttpsProxyAgent } = require('https-proxy-agent');
|
|
agent = new HttpsProxyAgent(proxyUri);
|
|
} else if (proxyUri.startsWith('socks')) {
|
|
const { SocksProxyAgent } = require('socks-proxy-agent');
|
|
agent = new SocksProxyAgent(proxyUri);
|
|
}
|
|
}
|
|
|
|
let proxyWrapper = () => false;
|
|
if (agent) {
|
|
const proxyRegex = new RegExp(proxyObj.url_regex);
|
|
const protocolMatch = (protocolLike) => protocolLike && protocolLike.toLowerCase().startsWith('http');
|
|
|
|
proxyWrapper = (url, options) => {
|
|
let urlHandler;
|
|
try {
|
|
urlHandler = new URL(url);
|
|
} catch {
|
|
// ignore
|
|
}
|
|
if (proxyRegex.test(url) && (protocolMatch(options.protocol) || protocolMatch(url)) && (!urlHandler || urlHandler.host !== proxyUrlHandler.host)) {
|
|
options.agent = agent;
|
|
if (proxyObj.auth) {
|
|
options.headers['Proxy-Authorization'] = `Basic ${proxyObj.auth}`;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
} else if (config.reverseProxyUrl) {
|
|
proxyWrapper = (url, options) => {
|
|
const urlIn = options.url?.toString() || url;
|
|
const proxyRegex = new RegExp(proxyObj.url_regex);
|
|
if (
|
|
proxyRegex.test(urlIn) &&
|
|
!urlIn.startsWith(config.reverseProxyUrl) &&
|
|
!options.cookieJar &&
|
|
!options.headers['user-agent']?.startsWith('PixivIOSApp') &&
|
|
!options.headers['x-goog-api-client'] &&
|
|
options.headers.accept !== 'application/dns-json'
|
|
) {
|
|
options.url = new URL(`${config.reverseProxyUrl}${encodeURIComponent(urlIn)}`);
|
|
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
}
|
|
|
|
const requestWrapper = (
|
|
url,
|
|
options = {
|
|
headers: {},
|
|
}
|
|
) => {
|
|
options.headers = options.headers || {};
|
|
const headersLowerCaseKeys = new Set(Object.keys(options.headers).map((key) => key.toLowerCase()));
|
|
|
|
let prxied = false;
|
|
if (config.proxyStrategy === 'all') {
|
|
prxied = proxyWrapper(url, options);
|
|
} else if (config.proxyStrategy === 'on_retry' && options.retryCount) {
|
|
prxied = proxyWrapper(url, options);
|
|
}
|
|
if (prxied) {
|
|
logger.http(`Proxy for ${url}`);
|
|
} else {
|
|
logger.http(`Requesting ${url}`);
|
|
}
|
|
|
|
// ua
|
|
if (!headersLowerCaseKeys.has('user-agent')) {
|
|
options.headers['user-agent'] = config.ua;
|
|
}
|
|
|
|
// Accept
|
|
if (!headersLowerCaseKeys.has('Accept')) {
|
|
options.headers.Accept = '*/*';
|
|
}
|
|
|
|
let urlHandler;
|
|
try {
|
|
urlHandler = new URL(options.url || url);
|
|
} catch {
|
|
// ignore
|
|
}
|
|
|
|
if (
|
|
urlHandler && // referer
|
|
!headersLowerCaseKeys.has('referer')
|
|
) {
|
|
options.headers.referer = urlHandler.origin;
|
|
}
|
|
};
|
|
|
|
const httpWrap = (func) => {
|
|
const origin = func;
|
|
return function (url, request) {
|
|
const args = Array.prototype.slice.call(arguments);
|
|
if (typeof url === 'object') {
|
|
if (url instanceof URL) {
|
|
requestWrapper(url.toString(), request);
|
|
} else {
|
|
const req = url;
|
|
requestWrapper(req.url || req.href || `${req.protocol}//${req.hostname || req.host}${req.path}`, req);
|
|
}
|
|
} else {
|
|
requestWrapper(url, request);
|
|
}
|
|
args[0] = request?.url || url;
|
|
return origin.apply(this, args);
|
|
};
|
|
};
|
|
|
|
http.get = httpWrap(http.get);
|
|
https.get = httpWrap(https.get);
|
|
http.request = httpWrap(http.request);
|
|
https.request = httpWrap(https.request);
|