mirror of
https://github.com/bestnite/sub2clash.git
synced 2025-06-17 12:43:18 +08:00
update regex to dynamically include all supported prefixes for improved proxy parsing.
This commit is contained in:
@ -148,7 +148,11 @@ func BuildSub(clashType model.ClashType, query model.SubConfig, template string,
|
|||||||
err = yaml.Unmarshal(data, &sub)
|
err = yaml.Unmarshal(data, &sub)
|
||||||
var newProxies []P.Proxy
|
var newProxies []P.Proxy
|
||||||
if err != nil {
|
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) {
|
if reg.Match(data) {
|
||||||
p := parser.ParseProxies(strings.Split(string(data), "\n")...)
|
p := parser.ParseProxies(strings.Split(string(data), "\n")...)
|
||||||
newProxies = p
|
newProxies = p
|
||||||
|
@ -7,29 +7,23 @@ import (
|
|||||||
P "github.com/bestnite/sub2clash/model/proxy"
|
P "github.com/bestnite/sub2clash/model/proxy"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ProxyParser 定义代理解析器接口
|
|
||||||
type ProxyParser interface {
|
type ProxyParser interface {
|
||||||
// Parse 解析代理字符串并返回Proxy对象
|
|
||||||
Parse(proxy string) (P.Proxy, error)
|
Parse(proxy string) (P.Proxy, error)
|
||||||
// GetPrefix 返回支持的协议前缀(可以返回多个)
|
|
||||||
GetPrefixes() []string
|
GetPrefixes() []string
|
||||||
// GetType 返回协议类型名称
|
|
||||||
GetType() string
|
GetType() string
|
||||||
SupportClash() bool
|
SupportClash() bool
|
||||||
SupportMeta() bool
|
SupportMeta() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// parserRegistry 解析器注册中心
|
|
||||||
type parserRegistry struct {
|
type parserRegistry struct {
|
||||||
mu sync.RWMutex
|
mu sync.RWMutex
|
||||||
parsers map[string]ProxyParser // prefix -> parser
|
parsers map[string]ProxyParser
|
||||||
}
|
}
|
||||||
|
|
||||||
var registry = &parserRegistry{
|
var registry = &parserRegistry{
|
||||||
parsers: make(map[string]ProxyParser),
|
parsers: make(map[string]ProxyParser),
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegisterParser 注册解析器
|
|
||||||
func RegisterParser(parser ProxyParser) {
|
func RegisterParser(parser ProxyParser) {
|
||||||
registry.mu.Lock()
|
registry.mu.Lock()
|
||||||
defer registry.mu.Unlock()
|
defer registry.mu.Unlock()
|
||||||
@ -39,7 +33,6 @@ func RegisterParser(parser ProxyParser) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetParser 根据前缀获取解析器
|
|
||||||
func GetParser(prefix string) (ProxyParser, bool) {
|
func GetParser(prefix string) (ProxyParser, bool) {
|
||||||
registry.mu.RLock()
|
registry.mu.RLock()
|
||||||
defer registry.mu.RUnlock()
|
defer registry.mu.RUnlock()
|
||||||
@ -48,7 +41,6 @@ func GetParser(prefix string) (ProxyParser, bool) {
|
|||||||
return parser, exists
|
return parser, exists
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetAllParsers 获取所有注册的解析器
|
|
||||||
func GetAllParsers() map[string]ProxyParser {
|
func GetAllParsers() map[string]ProxyParser {
|
||||||
registry.mu.RLock()
|
registry.mu.RLock()
|
||||||
defer registry.mu.RUnlock()
|
defer registry.mu.RUnlock()
|
||||||
@ -60,14 +52,23 @@ func GetAllParsers() map[string]ProxyParser {
|
|||||||
return result
|
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) {
|
func ParseProxyWithRegistry(proxy string) (P.Proxy, error) {
|
||||||
proxy = strings.TrimSpace(proxy)
|
proxy = strings.TrimSpace(proxy)
|
||||||
if proxy == "" {
|
if proxy == "" {
|
||||||
return P.Proxy{}, &ParseError{Type: ErrInvalidStruct, Raw: proxy, Message: "empty proxy string"}
|
return P.Proxy{}, &ParseError{Type: ErrInvalidStruct, Raw: proxy, Message: "empty proxy string"}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查找匹配的解析器
|
|
||||||
for prefix, parser := range registry.parsers {
|
for prefix, parser := range registry.parsers {
|
||||||
if strings.HasPrefix(proxy, prefix) {
|
if strings.HasPrefix(proxy, prefix) {
|
||||||
return parser.Parse(proxy)
|
return parser.Parse(proxy)
|
||||||
|
Reference in New Issue
Block a user