mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-04 19:59:54 +08:00
@@ -4,6 +4,7 @@ const config = require('./config');
|
||||
const Koa = require('koa');
|
||||
const fs = require('fs');
|
||||
const logger = require('./utils/logger');
|
||||
require('./utils/agent-wrapper');
|
||||
|
||||
const onerror = require('./middleware/onerror');
|
||||
const header = require('./middleware/header');
|
||||
|
||||
83
lib/utils/agent-wrapper.js
Normal file
83
lib/utils/agent-wrapper.js
Normal file
@@ -0,0 +1,83 @@
|
||||
const config = require('@/config');
|
||||
const SocksProxyAgent = require('socks-proxy-agent');
|
||||
const tunnel = require('tunnel');
|
||||
const logger = require('./logger');
|
||||
const http = require('http');
|
||||
const https = require('https');
|
||||
|
||||
let agent = null;
|
||||
if (config.proxy && config.proxy.protocol && config.proxy.host && config.proxy.port) {
|
||||
agent = {};
|
||||
const proxyUrl = `${config.proxy.protocol}://${config.proxy.host}:${config.proxy.port}`;
|
||||
|
||||
switch (config.proxy.protocol) {
|
||||
case 'socks':
|
||||
agent.http = new SocksProxyAgent(proxyUrl);
|
||||
agent.https = new SocksProxyAgent(proxyUrl);
|
||||
break;
|
||||
case 'http':
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
|
||||
agent.http = tunnel.httpOverHttp({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
agent.https = tunnel.httpsOverHttp({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
break;
|
||||
case 'https':
|
||||
agent.http = tunnel.httpOverHttps({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
agent.https = tunnel.httpsOverHttps({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const agentWrapper = (url, options) => {
|
||||
if (agent && new RegExp(config.proxy.url_regex).test(url)) {
|
||||
let agentResult;
|
||||
try {
|
||||
agentResult = agent[(options.protocol || url.match(/(https?:)/)[1]).slice(0, -1)];
|
||||
} catch (error) {
|
||||
agentResult = null;
|
||||
}
|
||||
options.agent = agentResult;
|
||||
|
||||
if (config.proxy.auth) {
|
||||
options.headers['Proxy-Authorization'] = `Basic ${config.proxy.auth}`;
|
||||
}
|
||||
logger.info(`Proxy for ${url}`);
|
||||
}
|
||||
};
|
||||
|
||||
const httpWrap = (func) => {
|
||||
const origin = func;
|
||||
return function(url, request) {
|
||||
if (typeof url === 'object') {
|
||||
const req = url;
|
||||
agentWrapper(req.url || req.href || `${req.protocol}//${req.hostname}${req.path}`, req);
|
||||
} else {
|
||||
agentWrapper(url, request);
|
||||
}
|
||||
return origin.apply(this, arguments);
|
||||
};
|
||||
};
|
||||
|
||||
http.get = httpWrap(http.get);
|
||||
https.get = httpWrap(https.get);
|
||||
http.request = httpWrap(http.request);
|
||||
https.request = httpWrap(https.request);
|
||||
@@ -1,52 +1,8 @@
|
||||
const logger = require('./logger');
|
||||
const config = require('@/config');
|
||||
const SocksProxyAgent = require('socks-proxy-agent');
|
||||
const tunnel = require('tunnel');
|
||||
const got = require('got');
|
||||
const queryString = require('query-string');
|
||||
|
||||
let agent = null;
|
||||
if (config.proxy && config.proxy.protocol && config.proxy.host && config.proxy.port) {
|
||||
agent = {};
|
||||
const proxyUrl = `${config.proxy.protocol}://${config.proxy.host}:${config.proxy.port}`;
|
||||
|
||||
switch (config.proxy.protocol) {
|
||||
case 'socks':
|
||||
agent.http = new SocksProxyAgent(proxyUrl);
|
||||
agent.https = new SocksProxyAgent(proxyUrl);
|
||||
break;
|
||||
case 'http':
|
||||
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
|
||||
agent.http = tunnel.httpOverHttp({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
agent.https = tunnel.httpsOverHttp({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
break;
|
||||
case 'https':
|
||||
agent.http = tunnel.httpOverHttps({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
agent.https = tunnel.httpsOverHttps({
|
||||
proxy: {
|
||||
host: config.proxy.host,
|
||||
port: parseInt(config.proxy.port),
|
||||
},
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const custom = got.extend({
|
||||
retry: {
|
||||
retries: config.requestRetry,
|
||||
@@ -82,15 +38,6 @@ const custom = got.extend({
|
||||
options.query = options.query || queryString.stringify(options.params);
|
||||
options.searchParams = options.query; // for Got v11 after
|
||||
}
|
||||
|
||||
if (agent && new RegExp(config.proxy.url_regex).test(options.href)) {
|
||||
options.agent = agent[options.protocol.slice(0, -1)];
|
||||
|
||||
if (config.proxy.auth) {
|
||||
options.headers['Proxy-Authorization'] = `Basic ${config.proxy.auth}`;
|
||||
}
|
||||
logger.info(`Proxy for ${options.href}`);
|
||||
}
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user