diff --git a/backend/package.json b/backend/package.json index 4cd353e..e3e06f8 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.387", + "version": "2.14.388", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/utils/flow.js b/backend/src/utils/flow.js index 84d53ac..46c8f77 100644 --- a/backend/src/utils/flow.js +++ b/backend/src/utils/flow.js @@ -10,7 +10,13 @@ export function getFlowField(headers) { )[0]; return headers[subkey]; } -export async function getFlowHeaders(rawUrl, ua, timeout, proxy, flowUrl) { +export async function getFlowHeaders( + rawUrl, + ua, + timeout, + customProxy, + flowUrl, +) { let url = flowUrl || rawUrl || ''; let $arguments = {}; const rawArgs = url.split('#'); @@ -41,7 +47,9 @@ export async function getFlowHeaders(rawUrl, ua, timeout, proxy, flowUrl) { // $.info(`使用缓存的流量信息: ${url}`); flowInfo = cached; } else { - const { defaultFlowUserAgent, defaultTimeout } = $.read(SETTINGS_KEY); + const { defaultProxy, defaultFlowUserAgent, defaultTimeout } = + $.read(SETTINGS_KEY); + const proxy = customProxy || defaultProxy; const userAgent = ua || defaultFlowUserAgent || @@ -67,7 +75,7 @@ export async function getFlowHeaders(rawUrl, ua, timeout, proxy, flowUrl) { $.info( `使用 HEAD 方法从响应头获取流量信息: ${url}, User-Agent: ${ userAgent || '' - }`, + }, Proxy: ${proxy}`, ); const { headers } = await http.head({ url: url @@ -97,14 +105,14 @@ export async function getFlowHeaders(rawUrl, ua, timeout, proxy, flowUrl) { $.error( `使用 HEAD 方法从响应头获取流量信息失败: ${url}, User-Agent: ${ userAgent || '' - }: ${e.message ?? e}`, + }, Proxy: ${proxy}: ${e.message ?? e}`, ); } if (!flowInfo) { $.info( `使用 GET 方法获取流量信息: ${url}, User-Agent: ${ userAgent || '' - }`, + }, Proxy: ${proxy}`, ); const { headers } = await http.get({ url: url @@ -113,8 +121,21 @@ export async function getFlowHeaders(rawUrl, ua, timeout, proxy, flowUrl) { .filter((i) => i.length)[0], headers: { 'User-Agent': userAgent, + ...(isStash && proxy + ? { + 'X-Stash-Selected-Proxy': + encodeURIComponent(proxy), + } + : {}), + ...(isShadowRocket && proxy + ? { 'X-Surge-Policy': proxy } + : {}), }, timeout: requestTimeout, + ...(proxy ? { proxy } : {}), + ...(isLoon && proxy ? { node: proxy } : {}), + ...(isQX && proxy ? { opts: { policy: proxy } } : {}), + ...(proxy ? getPolicyDescriptor(proxy) : {}), }); flowInfo = getFlowField(headers); } diff --git a/backend/src/utils/gist.js b/backend/src/utils/gist.js index 78b1075..317603e 100644 --- a/backend/src/utils/gist.js +++ b/backend/src/utils/gist.js @@ -1,10 +1,17 @@ -import { HTTP } from '@/vendor/open-api'; +import { HTTP, ENV } from '@/vendor/open-api'; +import { getPolicyDescriptor } from '@/utils'; +import $ from '@/core/app'; +import { SETTINGS_KEY } from '@/constants'; /** * Gist backup */ export default class Gist { constructor({ token, key, syncPlatform }) { + const { isStash, isLoon, isShadowRocket, isQX } = ENV(); + const { defaultProxy: proxy, defaultTimeout: timeout } = + $.read(SETTINGS_KEY); + if (syncPlatform === 'gitlab') { this.headers = { 'PRIVATE-TOKEN': `${token}`, @@ -13,7 +20,25 @@ export default class Gist { }; this.http = HTTP({ baseURL: 'https://gitlab.com/api/v4', - headers: { ...this.headers }, + headers: { + ...this.headers, + ...(isStash && proxy + ? { + 'X-Stash-Selected-Proxy': + encodeURIComponent(proxy), + } + : {}), + ...(isShadowRocket && proxy + ? { 'X-Surge-Policy': proxy } + : {}), + }, + + ...(proxy ? { proxy } : {}), + ...(isLoon && proxy ? { node: proxy } : {}), + ...(isQX && proxy ? { opts: { policy: proxy } } : {}), + ...(proxy ? getPolicyDescriptor(proxy) : {}), + timeout, + events: { onResponse: (resp) => { if (/^[45]/.test(String(resp.statusCode))) { @@ -35,7 +60,25 @@ export default class Gist { }; this.http = HTTP({ baseURL: 'https://api.github.com', - headers: { ...this.headers }, + headers: { + ...this.headers, + ...(isStash && proxy + ? { + 'X-Stash-Selected-Proxy': + encodeURIComponent(proxy), + } + : {}), + ...(isShadowRocket && proxy + ? { 'X-Surge-Policy': proxy } + : {}), + }, + + ...(proxy ? { proxy } : {}), + ...(isLoon && proxy ? { node: proxy } : {}), + ...(isQX && proxy ? { opts: { policy: proxy } } : {}), + ...(proxy ? getPolicyDescriptor(proxy) : {}), + timeout, + events: { onResponse: (resp) => { if (/^[45]/.test(String(resp.statusCode))) {