Skip to content

Commit 94ac8bb

Browse files
committed
feat: 组合订阅可设置是否透传单条订阅的流量信息(前端 >= 2.16.84)
1 parent 729e853 commit 94ac8bb

2 files changed

Lines changed: 85 additions & 74 deletions

File tree

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "sub-store",
3-
"version": "2.22.16",
3+
"version": "2.22.17",
44
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and Shadowrocket.",
55
"main": "src/main.js",
66
"scripts": {

backend/src/restful/download.js

Lines changed: 84 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -521,88 +521,99 @@ async function downloadCollection(req, res) {
521521
ua: reqUA,
522522
});
523523
let subUserInfoOfSub;
524-
// forward flow header from the first subscription in this collection
525-
const allSubs = $.read(SUBS_KEY);
526-
const subnames = collection.subscriptions;
527-
if (subnames.length > 0) {
528-
const sub = findByName(allSubs, subnames[0]);
529-
if (
530-
sub.source !== 'local' ||
531-
['localFirst', 'remoteFirst'].includes(sub.mergeSources)
532-
) {
533-
try {
534-
let url =
535-
`${sub.url}`
536-
.split(/[\r\n]+/)
537-
.map((i) => i.trim())
538-
.filter((i) => i.length)?.[0] || '';
539-
540-
let $arguments = {};
541-
const rawArgs = url.split('#');
542-
url = url.split('#')[0];
543-
if (rawArgs.length > 1) {
544-
try {
545-
// 支持 `#${encodeURIComponent(JSON.stringify({arg1: "1"}))}`
546-
$arguments = JSON.parse(
547-
decodeURIComponent(rawArgs[1]),
548-
);
549-
} catch (e) {
550-
for (const pair of rawArgs[1].split('&')) {
551-
const key = pair.split('=')[0];
552-
const value = pair.split('=')[1];
553-
// 部分兼容之前的逻辑 const value = pair.split('=')[1] || true;
554-
$arguments[key] =
555-
value == null || value === ''
556-
? true
557-
: decodeURIComponent(value);
524+
// 默认透传第一个子订阅的流量信息,除非 firstSubFlow 显式设置为 false
525+
if (collection.firstSubFlow !== false) {
526+
// forward flow header from the first subscription in this collection
527+
const allSubs = $.read(SUBS_KEY);
528+
const subnames = collection.subscriptions;
529+
if (subnames.length > 0) {
530+
const sub = findByName(allSubs, subnames[0]);
531+
if (
532+
sub.source !== 'local' ||
533+
['localFirst', 'remoteFirst'].includes(sub.mergeSources)
534+
) {
535+
try {
536+
let url =
537+
`${sub.url}`
538+
.split(/[\r\n]+/)
539+
.map((i) => i.trim())
540+
.filter((i) => i.length)?.[0] || '';
541+
542+
let $arguments = {};
543+
const rawArgs = url.split('#');
544+
url = url.split('#')[0];
545+
if (rawArgs.length > 1) {
546+
try {
547+
// 支持 `#${encodeURIComponent(JSON.stringify({arg1: "1"}))}`
548+
$arguments = JSON.parse(
549+
decodeURIComponent(rawArgs[1]),
550+
);
551+
} catch (e) {
552+
for (const pair of rawArgs[1].split('&')) {
553+
const key = pair.split('=')[0];
554+
const value = pair.split('=')[1];
555+
// 部分兼容之前的逻辑 const value = pair.split('=')[1] || true;
556+
$arguments[key] =
557+
value == null || value === ''
558+
? true
559+
: decodeURIComponent(value);
560+
}
558561
}
559562
}
560-
}
561-
if (!$arguments.noFlow && /^https?:/.test(url)) {
562-
subUserInfoOfSub = await getFlowHeaders(
563-
$arguments?.insecure ? `${url}#insecure` : url,
564-
$arguments.flowUserAgent,
565-
undefined,
566-
proxy || sub.proxy || collection.proxy,
567-
$arguments.flowUrl,
563+
if (!$arguments.noFlow && /^https?:/.test(url)) {
564+
subUserInfoOfSub = await getFlowHeaders(
565+
$arguments?.insecure
566+
? `${url}#insecure`
567+
: url,
568+
$arguments.flowUserAgent,
569+
undefined,
570+
proxy || sub.proxy || collection.proxy,
571+
$arguments.flowUrl,
572+
);
573+
}
574+
} catch (err) {
575+
$.error(
576+
`组合订阅 ${name} 中的子订阅 ${
577+
sub.name
578+
} 获取流量信息时发生错误: ${
579+
err.message ?? err
580+
}`,
568581
);
569582
}
570-
} catch (err) {
571-
$.error(
572-
`组合订阅 ${name} 中的子订阅 ${
573-
sub.name
574-
} 获取流量信息时发生错误: ${err.message ?? err}`,
575-
);
576583
}
577-
}
578-
if (sub.subUserinfo) {
579-
let subUserInfo;
580-
if (/^https?:\/\//.test(sub.subUserinfo)) {
581-
try {
582-
subUserInfo = await getFlowHeaders(
583-
undefined,
584-
undefined,
585-
undefined,
586-
proxy || sub.proxy,
587-
sub.subUserinfo,
588-
);
589-
} catch (e) {
590-
$.error(
591-
`组合订阅 ${name} 使用自定义流量链接 ${
592-
sub.subUserinfo
593-
} 获取流量信息时发生错误: ${JSON.stringify(e)}`,
594-
);
584+
if (sub.subUserinfo) {
585+
let subUserInfo;
586+
if (/^https?:\/\//.test(sub.subUserinfo)) {
587+
try {
588+
subUserInfo = await getFlowHeaders(
589+
undefined,
590+
undefined,
591+
undefined,
592+
proxy || sub.proxy,
593+
sub.subUserinfo,
594+
);
595+
} catch (e) {
596+
$.error(
597+
`组合订阅 ${name} 使用自定义流量链接 ${
598+
sub.subUserinfo
599+
} 获取流量信息时发生错误: ${JSON.stringify(
600+
e,
601+
)}`,
602+
);
603+
}
604+
} else {
605+
subUserInfo = sub.subUserinfo;
595606
}
596-
} else {
597-
subUserInfo = sub.subUserinfo;
607+
subUserInfoOfSub = [subUserInfo, subUserInfoOfSub]
608+
.filter((i) => i)
609+
.join('; ');
598610
}
599-
subUserInfoOfSub = [subUserInfo, subUserInfoOfSub]
600-
.filter((i) => i)
601-
.join('; ');
602611
}
603-
}
604612

605-
$.info(`组合订阅 ${name} 透传的的流量信息: ${subUserInfoOfSub}`);
613+
$.info(
614+
`组合订阅 ${name} 透传的的流量信息: ${subUserInfoOfSub}`,
615+
);
616+
}
606617

607618
let subUserInfoOfCol;
608619
if (/^https?:\/\//.test(collection.subUserinfo)) {

0 commit comments

Comments
 (0)