Files
dns-server/dns/.trae/documents/plan_20260104_105942.md
Alex Yang cdac4fcf43 update
2026-01-16 11:09:11 +08:00

113 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 支持Base64编码GFWList格式的实现计划
### 问题分析
当前的GFWList加载代码直接按行解析文件内容无法处理Base64编码的GFWList格式。Base64编码的GFWList文件包含
1. 头部注释行(以!开头)
2. Base64编码的规则内容整个文件或主要部分
3. 可能的尾部注释
### 解决方案
修改`gfw/manager.go`中的`LoadRules`函数添加Base64解码支持
1. **检测Base64编码**
- 读取文件内容
- 跳过注释行
- 检查剩余内容是否为Base64编码
2. **解码Base64内容**
- 如果是Base64编码使用`encoding/base64`包解码
- 解码后得到原始规则文本
3. **解析规则**
- 按行分割解码后的内容
- 调用现有的`parseRule`函数处理每一行
### 具体修改点
1. **添加Base64依赖**
-`gfw/manager.go`中添加`encoding/base64`导入
2. **修改LoadRules函数**
- 读取文件内容
- 过滤注释行收集可能的Base64内容
- 尝试Base64解码
- 解析解码后的规则
3. **测试**
- 使用现有的Base64编码GFWList文件测试
- 确保解码和规则解析正常工作
### 预期效果
- 服务器能够正确加载Base64编码的GFWList文件
- 兼容现有的纯文本GFWList格式
- 规则解析结果与原格式一致
### 代码修改示例
```go
// 在import中添加encoding/base64
import (
// 现有导入
"encoding/base64"
// 现有导入
)
// 修改LoadRules函数
func (m *GFWListManager) LoadRules() error {
// 现有代码...
// 从文件路径读取GFWList内容
content, err := os.ReadFile(m.config.Content)
if err != nil {
return fmt.Errorf("读取GFWList文件失败: %w", err)
}
// 处理Base64编码
rawContent := string(content)
// 过滤注释行收集Base64内容
var base64Content strings.Builder
lines := strings.Split(rawContent, "\n")
for _, line := range lines {
line = strings.TrimSpace(line)
if line == "" || strings.HasPrefix(line, "!") || strings.HasPrefix(line, "[") {
// 跳过注释行和头信息
continue
}
base64Content.WriteString(line)
}
// 尝试Base64解码
decoded, err := base64.StdEncoding.DecodeString(base64Content.String())
if err == nil {
// 解码成功,使用解码后的内容
rawContent = string(decoded)
} else {
// 解码失败,使用原始内容(可能是纯文本格式)
}
// 按行解析规则
ruleLines := strings.Split(rawContent, "\n")
for _, line := range ruleLines {
line = strings.TrimSpace(line)
if line == "" || strings.HasPrefix(line, "!") || strings.HasPrefix(line, "[") {
// 跳过空行、注释行和头信息行
continue
}
m.parseRule(line)
}
// 现有代码...
}
```
### 实施步骤
1. 修改`gfw/manager.go`添加Base64支持
2. 编译并测试
3. 验证规则加载是否正常
这个修改将使服务器能够同时支持纯文本和Base64编码的GFWList格式提高了兼容性和灵活性。