diff --git a/common/sub.go b/common/sub.go index 4e70545..cb47a82 100644 --- a/common/sub.go +++ b/common/sub.go @@ -148,7 +148,11 @@ func BuildSub(clashType model.ClashType, query model.SubConfig, template string, err = yaml.Unmarshal(data, &sub) var newProxies []P.Proxy if err != nil { - reg, _ := regexp.Compile("(ssr|ss|vmess|trojan|vless|hysteria|hy2|hysteria2|socks)://") + reg, err := regexp.Compile("(" + strings.Join(parser.GetAllPrefixes(), "|") + ")://") + if err != nil { + logger.Logger.Debug("compile regex failed", zap.Error(err)) + return nil, NewRegexInvalidError("prefix", err) + } if reg.Match(data) { p := parser.ParseProxies(strings.Split(string(data), "\n")...) newProxies = p diff --git a/parser/registry.go b/parser/registry.go index ea21e2d..49928eb 100644 --- a/parser/registry.go +++ b/parser/registry.go @@ -7,29 +7,23 @@ import ( P "github.com/bestnite/sub2clash/model/proxy" ) -// ProxyParser 定义代理解析器接口 type ProxyParser interface { - // Parse 解析代理字符串并返回Proxy对象 Parse(proxy string) (P.Proxy, error) - // GetPrefix 返回支持的协议前缀(可以返回多个) GetPrefixes() []string - // GetType 返回协议类型名称 GetType() string SupportClash() bool SupportMeta() bool } -// parserRegistry 解析器注册中心 type parserRegistry struct { mu sync.RWMutex - parsers map[string]ProxyParser // prefix -> parser + parsers map[string]ProxyParser } var registry = &parserRegistry{ parsers: make(map[string]ProxyParser), } -// RegisterParser 注册解析器 func RegisterParser(parser ProxyParser) { registry.mu.Lock() defer registry.mu.Unlock() @@ -39,7 +33,6 @@ func RegisterParser(parser ProxyParser) { } } -// GetParser 根据前缀获取解析器 func GetParser(prefix string) (ProxyParser, bool) { registry.mu.RLock() defer registry.mu.RUnlock() @@ -48,7 +41,6 @@ func GetParser(prefix string) (ProxyParser, bool) { return parser, exists } -// GetAllParsers 获取所有注册的解析器 func GetAllParsers() map[string]ProxyParser { registry.mu.RLock() defer registry.mu.RUnlock() @@ -60,14 +52,23 @@ func GetAllParsers() map[string]ProxyParser { return result } -// ParseProxyWithRegistry 使用注册机制解析代理 +func GetAllPrefixes() []string { + registry.mu.RLock() + defer registry.mu.RUnlock() + + prefixes := make([]string, 0, len(registry.parsers)) + for prefix := range registry.parsers { + prefixes = append(prefixes, prefix) + } + return prefixes +} + func ParseProxyWithRegistry(proxy string) (P.Proxy, error) { proxy = strings.TrimSpace(proxy) if proxy == "" { return P.Proxy{}, &ParseError{Type: ErrInvalidStruct, Raw: proxy, Message: "empty proxy string"} } - // 查找匹配的解析器 for prefix, parser := range registry.parsers { if strings.HasPrefix(proxy, prefix) { return parser.Parse(proxy)