Files
https-socks5-http/pkg/proxy/directlist.go
2025-01-10 14:07:07 +08:00

95 lines
1.9 KiB
Go

package proxy
import (
"bufio"
"os"
"path/filepath"
"strings"
"sync"
"s5/pkg/logger"
)
// DirectList 直连域名管理器
type DirectList struct {
patterns []string // 域名匹配模式
mu sync.RWMutex // 读写锁
}
// NewDirectList 创建新的直连域名管理器
func NewDirectList(filename string) *DirectList {
dl := &DirectList{}
if err := dl.Load(filename); err != nil {
log := logger.Get()
log.Errorf("[DIRECT] 加载直连域名列表失败: %v", err)
}
return dl
}
// Load 加载直连域名列表
func (dl *DirectList) Load(filename string) error {
log := logger.Get()
log.Debugf("[DIRECT] 开始加载直连域名列表...")
// 获取绝对路径
absPath, err := filepath.Abs(filename)
if err != nil {
return err
}
file, err := os.Open(absPath)
if err != nil {
return err
}
defer file.Close()
var patterns []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
pattern := strings.TrimSpace(scanner.Text())
if pattern == "" || strings.HasPrefix(pattern, "#") {
continue
}
patterns = append(patterns, pattern)
}
dl.mu.Lock()
dl.patterns = patterns
dl.mu.Unlock()
log.Infof("[DIRECT] 直连域名列表加载完成,共 %d 条规则", len(patterns))
//for _, pattern := range patterns {
//log.Debugf("[DIRECT] - %s", pattern)
//}
return scanner.Err()
}
// Match 检查域名是否匹配直连列表
func (dl *DirectList) Match(domain string) bool {
dl.mu.RLock()
defer dl.mu.RUnlock()
log := logger.Get()
log.Debugf("[DIRECT] 检查域名: %s", domain)
domain = strings.ToLower(domain)
for _, pattern := range dl.patterns {
if matchDomain(domain, pattern) {
log.Debugf("[DIRECT] - 匹配规则: %s", pattern)
return true
}
}
return false
}
// matchDomain 检查域名是否匹配模式
func matchDomain(domain, pattern string) bool {
if pattern[0] == '*' {
suffix := pattern[1:]
return strings.HasSuffix(domain, suffix)
}
return domain == pattern
}