From bc1247efaf6ed1655a1fa3f4930a14a36cee4c35 Mon Sep 17 00:00:00 2001 From: xream Date: Sun, 17 Nov 2024 22:53:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=8B=E5=8A=A8=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=9A=84=E8=AE=A2=E9=98=85=E6=B5=81=E9=87=8F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BC=9A=E9=99=84=E5=8A=A0=E5=88=B0=E8=AE=A2=E9=98=85=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E7=9A=84=E6=B5=81=E9=87=8F=E4=BF=A1=E6=81=AF=E4=B9=8B?= =?UTF-8?q?=E5=89=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/package.json | 2 +- backend/src/restful/download.js | 17 ++++-- backend/src/restful/subscriptions.js | 83 ++++++++++++---------------- backend/src/utils/flow.js | 2 +- 4 files changed, 49 insertions(+), 55 deletions(-) diff --git a/backend/package.json b/backend/package.json index abaec5d..51f26e4 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.420", + "version": "2.14.422", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/restful/download.js b/backend/src/restful/download.js index 168ed32..b2060f5 100644 --- a/backend/src/restful/download.js +++ b/backend/src/restful/download.js @@ -158,7 +158,7 @@ async function downloadSubscription(req, res) { proxy, noCache, }); - + let flowInfo; if ( sub.source !== 'local' || ['localFirst', 'remoteFirst'].includes(sub.mergeSources) @@ -193,7 +193,7 @@ async function downloadSubscription(req, res) { } if (!$arguments.noFlow) { // forward flow headers - const flowInfo = await getFlowHeaders( + flowInfo = await getFlowHeaders( $arguments?.insecure ? `${url}#insecure` : url, $arguments.flowUserAgent, undefined, @@ -213,7 +213,10 @@ async function downloadSubscription(req, res) { } } if (sub.subUserinfo) { - res.set('subscription-userinfo', sub.subUserinfo); + res.set( + 'subscription-userinfo', + [sub.subUserinfo, flowInfo].filter((i) => i).join('; '), + ); } if (platform === 'JSON') { @@ -358,6 +361,7 @@ async function downloadCollection(req, res) { const subnames = collection.subscriptions; if (subnames.length > 0) { const sub = findByName(allSubs, subnames[0]); + let flowInfo; if ( sub.source !== 'local' || ['localFirst', 'remoteFirst'].includes(sub.mergeSources) @@ -391,7 +395,7 @@ async function downloadCollection(req, res) { } } if (!$arguments.noFlow) { - const flowInfo = await getFlowHeaders( + flowInfo = await getFlowHeaders( $arguments?.insecure ? `${url}#insecure` : url, $arguments.flowUserAgent, undefined, @@ -411,7 +415,10 @@ async function downloadCollection(req, res) { } } if (sub.subUserinfo) { - res.set('subscription-userinfo', sub.subUserinfo); + res.set( + 'subscription-userinfo', + [sub.subUserinfo, flowInfo].filter((i) => i).join('; '), + ); } } diff --git a/backend/src/restful/subscriptions.js b/backend/src/restful/subscriptions.js index 0f066df..083ec9e 100644 --- a/backend/src/restful/subscriptions.js +++ b/backend/src/restful/subscriptions.js @@ -125,66 +125,53 @@ async function getFlowInfo(req, res) { ); return; } - if (sub.subUserinfo) { - try { - const remainingDays = getRmainingDays({ - resetDay: $arguments.resetDay, - startDate: $arguments.startDate, - cycleDays: $arguments.cycleDays, - }); - const result = { - ...parseFlowHeaders(sub.subUserinfo), - }; - if (remainingDays != null) { - result.remainingDays = remainingDays; - } - success(res, result); - } catch (e) { - $.error( - `Failed to parse flow info for local subscription ${name}: ${ - e.message ?? e - }`, - ); - failed( - res, - new RequestInvalidError( - 'NO_FLOW_INFO', - 'N/A', - `Failed to parse flow info`, - ), - ); - } - } else { - const flowHeaders = await getFlowHeaders( - $arguments?.insecure ? `${url}#insecure` : url, - $arguments.flowUserAgent, - undefined, - sub.proxy, - $arguments.flowUrl, + const flowHeaders = await getFlowHeaders( + $arguments?.insecure ? `${url}#insecure` : url, + $arguments.flowUserAgent, + undefined, + sub.proxy, + $arguments.flowUrl, + ); + if (!flowHeaders && !sub.subUserinfo) { + failed( + res, + new InternalServerError( + 'NO_FLOW_INFO', + 'No flow info', + `Failed to fetch flow headers`, + ), ); - if (!flowHeaders) { - failed( - res, - new InternalServerError( - 'NO_FLOW_INFO', - 'No flow info', - `Failed to fetch flow headers`, - ), - ); - return; - } + return; + } + try { const remainingDays = getRmainingDays({ resetDay: $arguments.resetDay, startDate: $arguments.startDate, cycleDays: $arguments.cycleDays, }); const result = { - ...parseFlowHeaders(flowHeaders), + ...parseFlowHeaders( + [sub.subUserinfo, flowHeaders].filter((i) => i).join('; '), + ), }; if (remainingDays != null) { result.remainingDays = remainingDays; } success(res, result); + } catch (e) { + $.error( + `Failed to parse flow info for local subscription ${name}: ${ + e.message ?? e + }`, + ); + failed( + res, + new RequestInvalidError( + 'NO_FLOW_INFO', + 'N/A', + `Failed to parse flow info`, + ), + ); } } catch (err) { failed( diff --git a/backend/src/utils/flow.js b/backend/src/utils/flow.js index fa45b92..1911b15 100644 --- a/backend/src/utils/flow.js +++ b/backend/src/utils/flow.js @@ -205,7 +205,7 @@ export function parseFlowHeaders(flowHeaders) { : undefined; const appUrlMatch = flowHeaders.match(/app_url=(.*?)\s*?(;|$)/); - const appUrl = appUrlMatch ? appUrlMatch[1] : undefined; + const appUrl = appUrlMatch ? decodeURIComponent(appUrlMatch[1]) : undefined; const planNameMatch = flowHeaders.match(/plan_name=(.*?)\s*?(;|$)/); const planName = planNameMatch