From 9d12aa45163be2faf604cec6a26b50e65ec7609b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E8=89=AF?= <841369634@qq.com> Date: Wed, 11 Sep 2024 18:27:48 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E8=AF=B7=E6=B1=82=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=92=8C=E8=BF=9E=E6=8E=A5=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8F=AF=E9=85=8D=E7=BD=AE=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/src/config/index.js | 2 + packages/gui/src/view/pages/server.vue | 12 ++++- .../mitmproxy/src/lib/proxy/common/util.js | 48 ++++++++++++++++--- .../proxy/mitmproxy/createRequestHandler.js | 2 +- 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/packages/core/src/config/index.js b/packages/core/src/config/index.js index e0be0d7..ddb7438 100644 --- a/packages/core/src/config/index.js +++ b/packages/core/src/config/index.js @@ -44,6 +44,8 @@ module.exports = { setting: { NODE_TLS_REJECT_UNAUTHORIZED: true, verifySsl: true, + timeout: 20000, // 代理请求超时时间 + keepAliveTimeout: 30000, // socket连接的超时时间 script: { enabled: true, defaultDir: './extra/scripts/' diff --git a/packages/gui/src/view/pages/server.vue b/packages/gui/src/view/pages/server.vue index d7f5a83..47062aa 100644 --- a/packages/gui/src/view/pages/server.vue +++ b/packages/gui/src/view/pages/server.vue @@ -36,6 +36,14 @@
修改后需要重启应用
+
+ + ms,对应 timeout 属性 + + + ms,对应 keepAliveTimeout 属性 + +
NODE_TLS_REJECT_UNAUTHORIZED @@ -54,6 +62,7 @@ +
启用拦截 @@ -136,8 +145,7 @@ - - ms + ms
使用以下dns获取ip进行测速
diff --git a/packages/mitmproxy/src/lib/proxy/common/util.js b/packages/mitmproxy/src/lib/proxy/common/util.js index 0dd89c8..f5e2198 100644 --- a/packages/mitmproxy/src/lib/proxy/common/util.js +++ b/packages/mitmproxy/src/lib/proxy/common/util.js @@ -15,10 +15,50 @@ const httpAgent = new Agent({ timeout: 20000, keepAliveTimeout: 30000 // free socket keepalive for 30 seconds }) +const httpsAgentCache = {} +const httpAgentCache = {} + let socketId = 0 let httpsOverHttpAgent, httpOverHttpsAgent, httpsOverHttpsAgent +function createHttpsAgent (serverSetting) { + const key = (serverSetting.timeout || 20000) + '-' + (serverSetting.keepAliveTimeout || 30000) + if (!httpsAgentCache[key]) { + httpsAgentCache[key] = new HttpsAgent({ + keepAlive: true, + timeout: serverSetting.timeout || 20000, + keepAliveTimeout: serverSetting.keepAliveTimeout || 30000, + rejectUnauthorized: false + }) + } + return httpsAgentCache[key] +} + +function createHttpAgent (serverSetting) { + const key = (serverSetting.timeout || 20000) + '-' + (serverSetting.keepAliveTimeout || 30000) + if (!httpAgentCache[key]) { + httpAgentCache[key] = new Agent({ + keepAlive: true, + timeout: serverSetting.timeout || 20000, + keepAliveTimeout: serverSetting.keepAliveTimeout || 30000 + }) + } + return httpAgentCache[key] +} + +function createAgent (protocol, serverSetting) { + if (protocol === 'https:') { + return !serverSetting || (serverSetting.timeout === 20000 && serverSetting.keepAliveTimeout === 30000) + ? httpsAgent + : createHttpsAgent(serverSetting) + } else { + return !serverSetting || (serverSetting.timeout === 20000 && serverSetting.keepAliveTimeout === 30000) + ? httpAgent + : createHttpAgent(serverSetting) + } +} + util.parseHostnameAndPort = (host, defaultPort) => { let arr = host.match(/^(\[[^\]]+\])(?::(\d+))?$/) // 尝试解析IPv6 if (arr) { @@ -42,7 +82,7 @@ util.parseHostnameAndPort = (host, defaultPort) => { return arr } -util.getOptionsFromRequest = (req, ssl, externalProxy = null) => { +util.getOptionsFromRequest = (req, ssl, externalProxy = null, serverSetting) => { // eslint-disable-next-line node/no-deprecated-api const urlObject = url.parse(req.url) const defaultPort = ssl ? 443 : 80 @@ -67,11 +107,7 @@ util.getOptionsFromRequest = (req, ssl, externalProxy = null) => { if (!externalProxyUrl) { // keepAlive if (headers.connection !== 'close') { - if (protocol === 'https:') { - agent = httpsAgent - } else { - agent = httpAgent - } + agent = createAgent(protocol, serverSetting) headers.connection = 'keep-alive' } else { agent = false diff --git a/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js b/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js index 98e1bc1..1ee5edc 100644 --- a/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js +++ b/packages/mitmproxy/src/lib/proxy/mitmproxy/createRequestHandler.js @@ -15,7 +15,7 @@ module.exports = function createRequestHandler (createIntercepts, middlewares, e return function requestHandler (req, res, ssl) { let proxyReq - const rOptions = commonUtil.getOptionsFromRequest(req, ssl, externalProxy) + const rOptions = commonUtil.getOptionsFromRequest(req, ssl, externalProxy, setting) if (rOptions.agent) { rOptions.agent.options.rejectUnauthorized = setting.verifySsl