Skip to content

Commit 436293e

Browse files
authored
Merge pull request #921 from cmliu/beta2.0
Beta2.0
2 parents 6e31457 + 97343ee commit 436293e

1 file changed

Lines changed: 63 additions & 8 deletions

File tree

_worker.js

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ export default {
325325
订阅内容 = Singbox订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.Fingerprint, config_JSON.ECH ? await getECH(host) : null);
326326
responseHeaders["content-type"] = 'application/json; charset=utf-8';
327327
} else if (订阅类型 === 'clash') {
328-
订阅内容 = Clash订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.ECH);
328+
订阅内容 = Clash订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.ECH, config_JSON.HOSTS);
329329
responseHeaders["content-type"] = 'application/x-yaml; charset=utf-8';
330330
}
331331
return new Response(订阅内容, { status: 200, headers: responseHeaders });
@@ -786,10 +786,14 @@ async function httpConnect(targetHost, targetPort, initialData) {
786786
}
787787
}
788788
//////////////////////////////////////////////////功能性函数///////////////////////////////////////////////
789-
function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, ECH启用 = false) {
790-
if (!ECH启用) return Clash_原始订阅内容;
789+
function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, ECH启用 = false, HOSTS = []) {
790+
if (!ECH启用 || HOSTS.length === 0) return Clash_原始订阅内容;
791791

792-
const clash_yaml = `dns:
792+
// 生成 HOSTS 的 nameserver-policy 条目
793+
const hostsEntries = HOSTS.map(host => ` "${host}":\n - tls://8.8.8.8\n - https://doh.cmliussss.com/CMLiussss\n - ${ECH_DOH}`).join('\n');
794+
795+
// 完整的 DNS 配置块(用于没有 dns: 字段时添加)
796+
const fullDnsBlock = `dns:
793797
enable: true
794798
default-nameserver:
795799
- 223.5.5.5
@@ -810,10 +814,61 @@ function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null,
810814
- 240.0.0.0/4
811815
- 0.0.0.0/32
812816
geoip-code: CN
813-
proxy-server-nameserver:
814-
- https://doh.cmliussss.com/CMLiussss
815-
- ${ECH_DOH}
816-
` + Clash_原始订阅内容;
817+
nameserver-policy:
818+
${hostsEntries}
819+
`;
820+
821+
let clash_yaml = Clash_原始订阅内容;
822+
823+
// 检查是否存在 dns: 字段(可能在任意行,行首无缩进)
824+
const hasDns = /^dns:\s*(?:\n|$)/m.test(clash_yaml);
825+
826+
if (hasDns) {
827+
// 存在 dns: 字段,检查是否存在 nameserver-policy:
828+
const hasNameserverPolicy = /^\s{2}nameserver-policy:\s*(?:\n|$)/m.test(clash_yaml);
829+
830+
if (hasNameserverPolicy) {
831+
// 存在 nameserver-policy:,在其后添加 HOSTS 条目
832+
clash_yaml = clash_yaml.replace(
833+
/^(\s{2}nameserver-policy:\s*\n)/m,
834+
`$1${hostsEntries}\n`
835+
);
836+
} else {
837+
// 不存在 nameserver-policy:,需要在 dns: 块内添加整个 nameserver-policy
838+
// 找到 dns: 块的结束位置(下一个顶级字段之前)
839+
const lines = clash_yaml.split('\n');
840+
let dnsBlockEndIndex = -1;
841+
let inDnsBlock = false;
842+
843+
for (let i = 0; i < lines.length; i++) {
844+
const line = lines[i];
845+
if (/^dns:\s*$/.test(line)) {
846+
inDnsBlock = true;
847+
continue;
848+
}
849+
if (inDnsBlock) {
850+
// 检查是否是新的顶级字段(行首无空格且不是空行且不是注释)
851+
if (/^[a-zA-Z]/.test(line)) {
852+
dnsBlockEndIndex = i;
853+
break;
854+
}
855+
}
856+
}
857+
858+
// 在 dns 块末尾插入 nameserver-policy
859+
const nameserverPolicyBlock = ` nameserver-policy:\n${hostsEntries}`;
860+
if (dnsBlockEndIndex !== -1) {
861+
lines.splice(dnsBlockEndIndex, 0, nameserverPolicyBlock);
862+
} else {
863+
// dns: 是最后一个顶级块,在文件末尾添加
864+
lines.push(nameserverPolicyBlock);
865+
}
866+
clash_yaml = lines.join('\n');
867+
}
868+
} else {
869+
// 不存在 dns: 字段,在文件开头添加完整的 DNS 配置块
870+
clash_yaml = fullDnsBlock + clash_yaml;
871+
}
817872

818873
if (!uuid) return clash_yaml;
819874
const lines = clash_yaml.split('\n');

0 commit comments

Comments
 (0)