Files
navi/internal/linknorm/normalize.go
T

61 lines
1.7 KiB
Go

package linknorm
import (
"fmt"
"vpnclient/internal/config"
"vpnclient/internal/protocols/awg"
"vpnclient/internal/protocols/hysteria2"
"vpnclient/internal/protocols/naive"
"vpnclient/internal/protocols/xray"
)
// Normalize normalizes a share/proxy URI for the given protocol (or auto-detect).
func Normalize(proto config.Protocol, raw string) (normalized string, detected config.Protocol, remark string, err error) {
raw = SanitizeShareText(raw)
if raw == "" {
return "", proto, "", fmt.Errorf("пустая ссылка")
}
if proto == "" {
proto = config.DetectProtocol(raw)
}
switch proto {
case config.ProtocolHysteria2:
u, rem, err := hysteria2.NormalizeShareLink(raw)
return u, config.ProtocolHysteria2, rem, err
case config.ProtocolAWG:
u, rem, err := awg.NormalizeShareLink(raw)
return u, config.ProtocolAWG, rem, err
case config.ProtocolVLESS, config.ProtocolVMess, config.ProtocolTrojan:
u, rem, err := xray.NormalizeShareLink(raw)
if err != nil {
return "", proto, "", err
}
detected = xray.DetectProtocol(u)
if detected == "" {
detected = proto
}
return u, detected, rem, nil
case config.ProtocolNaive, "":
if awg.Detect(raw) {
u, rem, err := awg.NormalizeShareLink(raw)
return u, config.ProtocolAWG, rem, err
}
if xray.Detect(raw) {
u, rem, err := xray.NormalizeShareLink(raw)
return u, xray.DetectProtocol(raw), rem, err
}
u, rem, err := naive.ParseShareLink(raw)
if err != nil {
if hysteria2.Detect(raw) {
u2, rem2, err2 := hysteria2.NormalizeShareLink(raw)
return u2, config.ProtocolHysteria2, rem2, err2
}
return "", config.ProtocolNaive, "", err
}
return u, config.ProtocolNaive, rem, nil
default:
return "", proto, "", fmt.Errorf("unsupported protocol %q", proto)
}
}