From 7d8132d7cdd9719b9ad3019fb0caaa35bfe75ce5 Mon Sep 17 00:00:00 2001 From: xream Date: Tue, 19 Nov 2024 23:06:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=BB=98=E8=AE=A4=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=94=B9=E4=B8=BA=20V2Ray;=20accept=20?= =?UTF-8?q?=E4=B8=BA=20application/json=20=E6=97=B6,=20=E8=BE=93=E5=87=BA?= =?UTF-8?q?=20JSON;=20=E5=93=8D=E5=BA=94=E5=A2=9E=E5=8A=A0=20X-Powered-By?= =?UTF-8?q?=20Sub-Store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/package.json | 2 +- backend/src/utils/flow.js | 24 +++++++++++------------- backend/src/utils/user-agent.js | 23 +++++++++++++++-------- backend/src/vendor/express.js | 1 + 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/backend/package.json b/backend/package.json index 51f26e4..9b43438 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.422", + "version": "2.14.423", "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 1911b15..23291d7 100644 --- a/backend/src/utils/flow.js +++ b/backend/src/utils/flow.js @@ -6,21 +6,19 @@ import $ from '@/core/app'; import headersResourceCache from '@/utils/headers-resource-cache'; export function getFlowField(headers) { - let subKey = ''; - let webPageKey = ''; - - Object.keys(headers).some((k) => { - if (/SUBSCRIPTION-USERINFO/i.test(k)) { - subKey = k; - } else if (/PROFILE-WEB-PAGE-URL/i.test(k)) { - webPageKey = k; + const keys = Object.keys(headers); + let sub = ''; + let webPage = ''; + for (let k of keys) { + const lower = k.toLowerCase(); + if (lower === 'subscription-userinfo') { + sub = headers[k]; + } else if (lower === 'profile-web-page-url') { + webPage = headers[k]; } - return subKey && webPageKey; - }); + } - return `${headers[subKey] || ''}${ - webPageKey ? `;app_url=${headers[webPageKey]}` : '' - }`; + return `${sub || ''}${webPage ? `;app_url=${webPage}` : ''}`; } export async function getFlowHeaders( rawUrl, diff --git a/backend/src/utils/user-agent.js b/backend/src/utils/user-agent.js index a6ee611..aabb33d 100644 --- a/backend/src/utils/user-agent.js +++ b/backend/src/utils/user-agent.js @@ -2,16 +2,20 @@ export function getUserAgentFromHeaders(headers) { const keys = Object.keys(headers); let UA = ''; let ua = ''; + let accept = ''; for (let k of keys) { - if (/USER-AGENT/i.test(k)) { + const lower = k.toLowerCase(); + if (lower === 'user-agent') { UA = headers[k]; ua = UA.toLowerCase(); - break; + } else if (lower === 'accept') { + accept = headers[k]; } } - return { UA, ua }; + return { UA, ua, accept }; } -export function getPlatformFromUserAgent({ ua, UA }) { + +export function getPlatformFromUserAgent({ ua, UA, accept }) { if (UA.indexOf('Quantumult%20X') !== -1) { return 'QX'; } else if (UA.indexOf('Surfboard') !== -1) { @@ -35,15 +39,18 @@ export function getPlatformFromUserAgent({ ua, UA }) { return 'ClashMeta'; } else if (ua.indexOf('clash') !== -1) { return 'Clash'; - } else if (ua.indexOf('v2ray') !== -1) { + } else if (ua.indexOf('v2ray') !== -1 || ua.indexOf('egern') !== -1) { return 'V2Ray'; } else if (ua.indexOf('sing-box') !== -1) { return 'sing-box'; - } else { + } else if (accept.indexOf('application/json') === 0) { return 'JSON'; + } else { + return 'V2Ray'; } } + export function getPlatformFromHeaders(headers) { - const { UA, ua } = getUserAgentFromHeaders(headers); - return getPlatformFromUserAgent({ ua, UA }); + const { UA, ua, accept } = getUserAgentFromHeaders(headers); + return getPlatformFromUserAgent({ ua, UA, accept }); } diff --git a/backend/src/vendor/express.js b/backend/src/vendor/express.js index 4c67962..a2c7220 100644 --- a/backend/src/vendor/express.js +++ b/backend/src/vendor/express.js @@ -9,6 +9,7 @@ export default function express({ substore: $, port, host }) { 'Access-Control-Allow-Methods': 'POST,GET,OPTIONS,PATCH,PUT,DELETE', 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept', + 'X-Powered-By': 'Sub-Store', }; // node support