update
This commit is contained in:
113
dns/.trae/documents/plan_20260104_105942.md
Normal file
113
dns/.trae/documents/plan_20260104_105942.md
Normal file
@@ -0,0 +1,113 @@
|
||||
## 支持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格式,提高了兼容性和灵活性。
|
||||
Reference in New Issue
Block a user