mirror of
https://github.com/fankes/komari-agent.git
synced 2025-12-10 23:43:40 +08:00
fix: 修复域名转化 ipv6 失效
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -16,8 +17,15 @@ func ConvertIDNToASCII(urlStr string) (string, error) {
|
|||||||
return urlStr, err
|
return urlStr, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hostname := parsedURL.Hostname()
|
||||||
|
|
||||||
|
// 检查是否为 IP 地址(IPv4 或 IPv6),如果是则不需要转换
|
||||||
|
if net.ParseIP(hostname) != nil {
|
||||||
|
return parsedURL.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
// 转换主机名为 Punycode
|
// 转换主机名为 Punycode
|
||||||
asciiHost, err := idna.ToASCII(parsedURL.Hostname())
|
asciiHost, err := idna.ToASCII(hostname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return urlStr, err
|
return urlStr, err
|
||||||
}
|
}
|
||||||
@@ -37,18 +45,45 @@ func ConvertIDNToASCII(urlStr string) (string, error) {
|
|||||||
func ConvertHostToASCII(host string) (string, error) {
|
func ConvertHostToASCII(host string) (string, error) {
|
||||||
// 分离主机名和端口
|
// 分离主机名和端口
|
||||||
var hostname, port string
|
var hostname, port string
|
||||||
if idx := strings.LastIndex(host, ":"); idx != -1 {
|
|
||||||
hostname = host[:idx]
|
// 处理 IPv6 地址格式 [::1]:port
|
||||||
port = host[idx:]
|
if strings.HasPrefix(host, "[") {
|
||||||
|
if idx := strings.LastIndex(host, "]"); idx != -1 {
|
||||||
|
hostname = host[1:idx] // 去掉方括号
|
||||||
|
if len(host) > idx+1 {
|
||||||
|
port = host[idx+1:] // 包含冒号
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hostname = host
|
||||||
|
}
|
||||||
|
} else if idx := strings.LastIndex(host, ":"); idx != -1 {
|
||||||
|
// 检查是否为 IPv6 地址(包含多个冒号)
|
||||||
|
if strings.Count(host, ":") > 1 {
|
||||||
|
// 可能是不带方括号的 IPv6 地址
|
||||||
|
hostname = host
|
||||||
|
} else {
|
||||||
|
// IPv4:port 格式
|
||||||
|
hostname = host[:idx]
|
||||||
|
port = host[idx:]
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
hostname = host
|
hostname = host
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查是否为 IP 地址,如果是则不需要转换
|
||||||
|
if net.ParseIP(hostname) != nil {
|
||||||
|
return host, nil
|
||||||
|
}
|
||||||
|
|
||||||
// 转换为 ASCII
|
// 转换为 ASCII
|
||||||
asciiHost, err := idna.ToASCII(hostname)
|
asciiHost, err := idna.ToASCII(hostname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return host, err
|
return host, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重新组装,如果原始输入有方括号则保留
|
||||||
|
if strings.HasPrefix(host, "[") && port != "" {
|
||||||
|
return "[" + asciiHost + "]" + port, nil
|
||||||
|
}
|
||||||
return asciiHost + port, nil
|
return asciiHost + port, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user