95 lines
1.9 KiB
Go
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
|
|
}
|