fix: trojan uri parser
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
import getTrojanURIParser from "@/utils/trojan-uri";
|
||||
|
||||
export default function parseUri(uri: string): IProxyConfig {
|
||||
const head = uri.split("://")[0];
|
||||
switch (head) {
|
||||
@@ -467,7 +465,19 @@ function URI_VMESS(line: string): IProxyVmessConfig {
|
||||
opts["v2ray-http-upgrade"] = true;
|
||||
opts["v2ray-http-upgrade-fast-open"] = true;
|
||||
}
|
||||
proxy[`${proxy.network}-opts`] = opts;
|
||||
switch (proxy.network) {
|
||||
case "ws":
|
||||
proxy["ws-opts"] = opts;
|
||||
break;
|
||||
case "http":
|
||||
proxy["http-opts"] = opts;
|
||||
break;
|
||||
case "h2":
|
||||
proxy["h2-opts"] = opts;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
delete proxy.network;
|
||||
@@ -530,16 +540,7 @@ function URI_VLESS(line: string): IProxyVlessConfig {
|
||||
proxy.servername = params.sni || params.peer;
|
||||
proxy.flow = params.flow ? "xtls-rprx-vision" : undefined;
|
||||
|
||||
proxy["client-fingerprint"] = params.fp as
|
||||
| "chrome"
|
||||
| "firefox"
|
||||
| "safari"
|
||||
| "iOS"
|
||||
| "android"
|
||||
| "edge"
|
||||
| "360"
|
||||
| "qq"
|
||||
| "random";
|
||||
proxy["client-fingerprint"] = params.fp as ClientFingerprint;
|
||||
proxy.alpn = params.alpn ? params.alpn.split(",") : undefined;
|
||||
proxy["skip-cert-verify"] = /(TRUE)|1/i.test(params.allowInsecure);
|
||||
|
||||
@@ -635,16 +636,89 @@ function URI_VLESS(line: string): IProxyVlessConfig {
|
||||
}
|
||||
|
||||
function URI_Trojan(line: string): IProxyTrojanConfig {
|
||||
let [newLine, name] = line.split(/#(.+)/, 2);
|
||||
const parser = getTrojanURIParser();
|
||||
const proxy: IProxyTrojanConfig = parser.parse(newLine);
|
||||
if (isNotBlank(name)) {
|
||||
try {
|
||||
proxy.name = decodeURIComponent(name).trim();
|
||||
} catch (e) {
|
||||
throw Error("Can not get proxy name");
|
||||
line = line.split("trojan://")[1];
|
||||
let [__, password, server, ___, port, ____, addons = "", name] =
|
||||
/^(.*?)@(.*?)(:(\d+))?\/?(\?(.*?))?(?:#(.*?))?$/.exec(line) || [];
|
||||
|
||||
let portNum = parseInt(`${port}`, 10);
|
||||
if (isNaN(portNum)) {
|
||||
portNum = 443;
|
||||
}
|
||||
|
||||
password = decodeURIComponent(password);
|
||||
|
||||
let decodedName = trimStr(decodeURIComponent(name));
|
||||
|
||||
name = decodedName ?? `Trojan ${server}:${portNum}`;
|
||||
const proxy: IProxyTrojanConfig = {
|
||||
type: "trojan",
|
||||
name,
|
||||
server,
|
||||
port: portNum,
|
||||
password,
|
||||
};
|
||||
let host = "";
|
||||
let path = "";
|
||||
|
||||
for (const addon of addons.split("&")) {
|
||||
let [key, value] = addon.split("=");
|
||||
value = decodeURIComponent(value);
|
||||
switch (key) {
|
||||
case "type":
|
||||
if (["ws", "h2"].includes(value)) {
|
||||
proxy.network = value as NetworkType;
|
||||
} else {
|
||||
proxy.network = "tcp";
|
||||
}
|
||||
break;
|
||||
case "host":
|
||||
host = value;
|
||||
break;
|
||||
case "path":
|
||||
path = value;
|
||||
break;
|
||||
case "alpn":
|
||||
proxy["alpn"] = value ? value.split(",") : undefined;
|
||||
break;
|
||||
case "sni":
|
||||
proxy["sni"] = value;
|
||||
break;
|
||||
case "skip-cert-verify":
|
||||
proxy["skip-cert-verify"] = /(TRUE)|1/i.test(value);
|
||||
break;
|
||||
case "fingerprint":
|
||||
proxy["fingerprint"] = value;
|
||||
break;
|
||||
case "fp":
|
||||
proxy["fingerprint"] = value;
|
||||
break;
|
||||
case "encryption":
|
||||
let encryption = value.split(";");
|
||||
if (encryption.length === 3) {
|
||||
proxy["ss-opts"] = {
|
||||
enabled: true,
|
||||
method: encryption[1],
|
||||
password: encryption[2],
|
||||
};
|
||||
}
|
||||
case "client-fingerprint":
|
||||
proxy["client-fingerprint"] = value as ClientFingerprint;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (proxy.network === "ws") {
|
||||
proxy["ws-opts"] = {
|
||||
headers: { Host: host },
|
||||
path,
|
||||
} as WsOptions;
|
||||
} else if (proxy.network === "grpc") {
|
||||
proxy["grpc-opts"] = {
|
||||
"grpc-service-name": path,
|
||||
} as GrpcOptions;
|
||||
}
|
||||
|
||||
return proxy;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user