113 lines
3.1 KiB
Markdown
113 lines
3.1 KiB
Markdown
## 支持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格式,提高了兼容性和灵活性。 |