Skip to content

Commit 8576a94

Browse files
committed
op: 优化内存占用
1 parent fbd084c commit 8576a94

File tree

4 files changed

+42
-35
lines changed

4 files changed

+42
-35
lines changed

proxy/get.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import (
1717
"gopkg.in/yaml.v3"
1818
)
1919

20+
var proxyRegex = regexp.MustCompile("(ssr|ss|vmess|trojan|vless|hysteria|hy2|hysteria2)://")
21+
2022
func GetProxies() ([]map[string]any, error) {
2123
slog.Info(fmt.Sprintf("当前设置订阅链接数量: %d", len(config.GlobalConfig.SubUrls)))
2224

@@ -53,11 +55,10 @@ func GetProxies() ([]map[string]any, error) {
5355
var con map[string]any
5456
err = yaml.Unmarshal(data, &con)
5557
if err != nil {
56-
reg, _ := regexp.Compile("(ssr|ss|vmess|trojan|vless|hysteria|hy2|hysteria2)://")
57-
if !reg.Match(data) {
58+
if !proxyRegex.Match(data) {
5859
data = []byte(parser.DecodeBase64(string(data)))
5960
}
60-
if reg.Match(data) {
61+
if proxyRegex.Match(data) {
6162
scanner := bufio.NewScanner(strings.NewReader(string(data)))
6263
for scanner.Scan() {
6364
proxy := scanner.Text()

proxy/parser/vless.go

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
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
}

proxy/parser/vmess.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ func ParseVmess(data string) (map[string]any, error) {
3636
// 移除 "vmess://" 前缀
3737
data = data[8:]
3838

39+
// 移除 ` 符号,不知道为什么很多节点结尾有这个
40+
data = strings.ReplaceAll(data, "`", "")
41+
3942
// base64解码
4043
decoded, err := base64.StdEncoding.DecodeString(data)
4144
if err != nil {

save/save.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ func genUrls(data []byte) (*bytes.Buffer, error) {
291291
}
292292
case "Host":
293293
q.Set("host", v)
294+
case "grpc-service-name":
295+
q.Set("serviceName", v)
294296
default:
295297
q.Set(k, v)
296298
}

0 commit comments

Comments
 (0)