sublinker / node /tuic.go
YimoEx
init
bb9df9e
package node
import (
"fmt"
"net/url"
"strconv"
"strings"
)
type Tuic struct {
Name string
Password string
Host string
Port int
Uuid string
Congestion_control string
Alpn []string
Sni string
Udp_relay_mode string
Disable_sni int
}
// Tuic 解码
func DecodeTuicURL(s string) (Tuic, error) {
u, err := url.Parse(s)
if err != nil {
return Tuic{}, fmt.Errorf("解析失败的URL: %s", s)
}
if u.Scheme != "tuic" {
return Tuic{}, fmt.Errorf("非tuic协议: %s", s)
}
uuid := u.User.Username()
password, _ := u.User.Password()
// log.Println(password)
// password = Base64Decode2(password)
server := u.Hostname()
port, _ := strconv.Atoi(u.Port())
Congestioncontrol := u.Query().Get("Congestion_control")
alpns := u.Query().Get("alpn")
alpn := strings.Split(alpns, ",")
if alpns == "" {
alpn = nil
}
sni := u.Query().Get("sni")
Udprelay_mode := u.Query().Get("Udp_relay_mode")
Disablesni, _ := strconv.Atoi(u.Query().Get("Disable_sni"))
name := u.Fragment
// 如果没有设置 Name,则使用 Host:Port 作为 Fragment
if name == "" {
name = server + ":" + u.Port()
}
if CheckEnvironment() {
fmt.Println("password:", password)
fmt.Println("server:", server)
fmt.Println("port:", port)
fmt.Println("insecure:", Congestioncontrol)
fmt.Println("uuid:", uuid)
fmt.Println("Udprelay_mode:", Udprelay_mode)
fmt.Println("alpn:", alpn)
fmt.Println("sni:", sni)
fmt.Println("Disablesni:", Disablesni)
fmt.Println("name:", name)
}
return Tuic{
Name: name,
Password: password,
Host: server,
Port: port,
Uuid: uuid,
Congestion_control: Congestioncontrol,
Alpn: alpn,
Sni: sni,
Udp_relay_mode: Udprelay_mode,
Disable_sni: Disablesni,
}, nil
}