44 "fmt"
55 "net/url"
66 "strconv"
7- "strings"
87)
98
109// 将vless格式的节点转换为clash的节点
@@ -18,20 +17,22 @@ func ParseVless(data string) (map[string]any, error) {
1817 return nil , fmt .Errorf ("不是vless格式" )
1918 }
2019
21- hostPort := strings .Split (parsedURL .Host , ":" )
22- if len (hostPort ) != 2 {
23- return nil , nil
24- }
25-
2620 port , err := strconv .Atoi (parsedURL .Port ())
2721 if err != nil {
2822 return nil , fmt .Errorf ("格式错误: 端口格式不正确" )
2923 }
3024
3125 // 解析参数
3226 query := parsedURL .Query ()
27+ sni := query .Get ("sni" )
28+ path := query .Get ("path" )
29+ host := query .Get ("host" )
30+ pbk := query .Get ("pbk" )
31+ sid := query .Get ("sid" )
32+ fp := query .Get ("fp" )
33+ serviceName := query .Get ("serviceName" )
3334
34- // 构建 clash 格式的代理配置
35+ // 构建 clash 格式的代理配置,这里边也加上了URI用到的参数,方便后边解析
3536 proxy := map [string ]any {
3637 "name" : parsedURL .Fragment ,
3738 "type" : "vless" ,
@@ -41,33 +42,33 @@ func ParseVless(data string) (map[string]any, error) {
4142 "network" : query .Get ("type" ),
4243 "tls" : query .Get ("security" ) != "none" ,
4344 "udp" : query .Get ("udp" ) == "true" ,
44- "servername" : query . Get ( " sni" ) ,
45+ "servername" : sni ,
4546 "flow" : query .Get ("flow" ),
46- "client-fingerprint" : query .Get ("fp" ),
47- "ws-opts" : map [string ]any {
48- "path" : query .Get ("path" ),
49- "headers" : map [string ]string {
50- "Host" : query .Get ("host" ),
51- },
52- },
53- "reality-opts" : map [string ]string {
54- "public-key" : query .Get ("pbk" ),
55- "short-id" : query .Get ("sid" ),
56- },
57- "grpc-opts" : map [string ]string {
58- "grpc-service-name" : query .Get ("serviceName" ),
59- },
60- // 给 URI使用,Clash 的 参数不叫这个
61- "security" : query .Get ("security" ),
62- "sni" : query .Get ("sni" ),
63- "fp" : query .Get ("fp" ),
64- "pbk" : query .Get ("pbk" ),
65- "sid" : query .Get ("sid" ),
66- "path" : query .Get ("path" ),
67- "host" : query .Get ("host" ),
68- "serviceName" : query .Get ("serviceName" ),
69- "mode" : query .Get ("mode" ),
47+ "mode" : query .Get ("mode" ),
48+ "client-fingerprint" : fp ,
49+ }
50+
51+ if path != "" || host != "" {
52+ wsOpts := make (map [string ]any , 2 )
53+ wsOpts ["path" ] = path
54+ if host != "" {
55+ headers := map [string ]string {"Host" : host }
56+ wsOpts ["headers" ] = headers
57+ }
58+ proxy ["ws-opts" ] = wsOpts
7059 }
7160
61+ if pbk != "" || sid != "" {
62+ proxy ["reality-opts" ] = map [string ]string {
63+ "public-key" : pbk ,
64+ "short-id" : sid ,
65+ }
66+ }
67+
68+ if serviceName != "" {
69+ proxy ["grpc-opts" ] = map [string ]string {
70+ "grpc-service-name" : serviceName ,
71+ }
72+ }
7273 return proxy , nil
7374}
0 commit comments