feat: 优化 SOCKS5 地址解析,支持 IPv6 地址带端口格式

This commit is contained in:
cmliu
2025-07-12 01:40:34 +08:00
parent 93eabe13a3
commit 0bb3c178aa

View File

@@ -1217,15 +1217,24 @@ function socks5AddressParser(address) {
// 解析服务器地址部分
const latters = latter.split(":");
// 从末尾提取端口号(因为 IPv6 地址中也包含冒号)
port = Number(latters.pop().replace(/[^\d]/g, ''));
// 检查是否是IPv6地址带端口格式 [xxx]:port
if (latters.length > 2 && latter.includes("]:")) {
// IPv6地址带端口格式[2001:db8::1]:8080
port = Number(latter.split("]:")[1].replace(/[^\d]/g, ''));
hostname = latter.split("]:")[0] + "]"; // 正确提取hostname部分
} else if (latters.length === 2) {
// IPv4地址带端口或域名带端口
port = Number(latters.pop().replace(/[^\d]/g, ''));
hostname = latters.join(":");
} else {
port = 80;
hostname = latter;
}
if (isNaN(port)) {
throw new Error('无效的 SOCKS 地址格式:端口号必须是数字');
}
// 剩余部分就是主机名可能是域名、IPv4 或 IPv6 地址)
hostname = latters.join(":");
// 处理 IPv6 地址的特殊情况
// IPv6 地址包含多个冒号,所以必须用方括号括起来,如 [2001:db8::1]
const regex = /^\[.*\]$/;