mirror of
https://github.com/lush2020/edgetunnel.git
synced 2026-03-21 00:42:43 +08:00
71
_worker.js
71
_worker.js
@@ -325,7 +325,7 @@ export default {
|
|||||||
订阅内容 = Singbox订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.Fingerprint, config_JSON.ECH ? await getECH(host) : null);
|
订阅内容 = Singbox订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.Fingerprint, config_JSON.ECH ? await getECH(host) : null);
|
||||||
responseHeaders["content-type"] = 'application/json; charset=utf-8';
|
responseHeaders["content-type"] = 'application/json; charset=utf-8';
|
||||||
} else if (订阅类型 === 'clash') {
|
} else if (订阅类型 === 'clash') {
|
||||||
订阅内容 = Clash订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.ECH);
|
订阅内容 = Clash订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.ECH, config_JSON.HOSTS);
|
||||||
responseHeaders["content-type"] = 'application/x-yaml; charset=utf-8';
|
responseHeaders["content-type"] = 'application/x-yaml; charset=utf-8';
|
||||||
}
|
}
|
||||||
return new Response(订阅内容, { status: 200, headers: responseHeaders });
|
return new Response(订阅内容, { status: 200, headers: responseHeaders });
|
||||||
@@ -786,10 +786,14 @@ async function httpConnect(targetHost, targetPort, initialData) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//////////////////////////////////////////////////功能性函数///////////////////////////////////////////////
|
//////////////////////////////////////////////////功能性函数///////////////////////////////////////////////
|
||||||
function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, ECH启用 = false) {
|
function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, ECH启用 = false, HOSTS = []) {
|
||||||
if (!ECH启用) return Clash_原始订阅内容;
|
if (!ECH启用 || HOSTS.length === 0) return Clash_原始订阅内容;
|
||||||
|
|
||||||
const clash_yaml = `dns:
|
// 生成 HOSTS 的 nameserver-policy 条目
|
||||||
|
const hostsEntries = HOSTS.map(host => ` "${host}":\n - tls://8.8.8.8\n - https://doh.cmliussss.com/CMLiussss\n - ${ECH_DOH}`).join('\n');
|
||||||
|
|
||||||
|
// 完整的 DNS 配置块(用于没有 dns: 字段时添加)
|
||||||
|
const fullDnsBlock = `dns:
|
||||||
enable: true
|
enable: true
|
||||||
default-nameserver:
|
default-nameserver:
|
||||||
- 223.5.5.5
|
- 223.5.5.5
|
||||||
@@ -810,10 +814,61 @@ function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null,
|
|||||||
- 240.0.0.0/4
|
- 240.0.0.0/4
|
||||||
- 0.0.0.0/32
|
- 0.0.0.0/32
|
||||||
geoip-code: CN
|
geoip-code: CN
|
||||||
proxy-server-nameserver:
|
nameserver-policy:
|
||||||
- https://doh.cmliussss.com/CMLiussss
|
${hostsEntries}
|
||||||
- ${ECH_DOH}
|
`;
|
||||||
` + Clash_原始订阅内容;
|
|
||||||
|
let clash_yaml = Clash_原始订阅内容;
|
||||||
|
|
||||||
|
// 检查是否存在 dns: 字段(可能在任意行,行首无缩进)
|
||||||
|
const hasDns = /^dns:\s*(?:\n|$)/m.test(clash_yaml);
|
||||||
|
|
||||||
|
if (hasDns) {
|
||||||
|
// 存在 dns: 字段,检查是否存在 nameserver-policy:
|
||||||
|
const hasNameserverPolicy = /^\s{2}nameserver-policy:\s*(?:\n|$)/m.test(clash_yaml);
|
||||||
|
|
||||||
|
if (hasNameserverPolicy) {
|
||||||
|
// 存在 nameserver-policy:,在其后添加 HOSTS 条目
|
||||||
|
clash_yaml = clash_yaml.replace(
|
||||||
|
/^(\s{2}nameserver-policy:\s*\n)/m,
|
||||||
|
`$1${hostsEntries}\n`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// 不存在 nameserver-policy:,需要在 dns: 块内添加整个 nameserver-policy
|
||||||
|
// 找到 dns: 块的结束位置(下一个顶级字段之前)
|
||||||
|
const lines = clash_yaml.split('\n');
|
||||||
|
let dnsBlockEndIndex = -1;
|
||||||
|
let inDnsBlock = false;
|
||||||
|
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
const line = lines[i];
|
||||||
|
if (/^dns:\s*$/.test(line)) {
|
||||||
|
inDnsBlock = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (inDnsBlock) {
|
||||||
|
// 检查是否是新的顶级字段(行首无空格且不是空行且不是注释)
|
||||||
|
if (/^[a-zA-Z]/.test(line)) {
|
||||||
|
dnsBlockEndIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 在 dns 块末尾插入 nameserver-policy
|
||||||
|
const nameserverPolicyBlock = ` nameserver-policy:\n${hostsEntries}`;
|
||||||
|
if (dnsBlockEndIndex !== -1) {
|
||||||
|
lines.splice(dnsBlockEndIndex, 0, nameserverPolicyBlock);
|
||||||
|
} else {
|
||||||
|
// dns: 是最后一个顶级块,在文件末尾添加
|
||||||
|
lines.push(nameserverPolicyBlock);
|
||||||
|
}
|
||||||
|
clash_yaml = lines.join('\n');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 不存在 dns: 字段,在文件开头添加完整的 DNS 配置块
|
||||||
|
clash_yaml = fullDnsBlock + clash_yaml;
|
||||||
|
}
|
||||||
|
|
||||||
if (!uuid) return clash_yaml;
|
if (!uuid) return clash_yaml;
|
||||||
const lines = clash_yaml.split('\n');
|
const lines = clash_yaml.split('\n');
|
||||||
|
|||||||
Reference in New Issue
Block a user