3.1 KiB
3.1 KiB
支持Base64编码GFWList格式的实现计划
问题分析
当前的GFWList加载代码直接按行解析文件内容,无法处理Base64编码的GFWList格式。Base64编码的GFWList文件包含:
- 头部注释行(以!开头)
- Base64编码的规则内容(整个文件或主要部分)
- 可能的尾部注释
解决方案
修改gfw/manager.go中的LoadRules函数,添加Base64解码支持:
-
检测Base64编码:
- 读取文件内容
- 跳过注释行
- 检查剩余内容是否为Base64编码
-
解码Base64内容:
- 如果是Base64编码,使用
encoding/base64包解码 - 解码后得到原始规则文本
- 如果是Base64编码,使用
-
解析规则:
- 按行分割解码后的内容
- 调用现有的
parseRule函数处理每一行
具体修改点
-
添加Base64依赖:
- 在
gfw/manager.go中添加encoding/base64导入
- 在
-
修改LoadRules函数:
- 读取文件内容
- 过滤注释行,收集可能的Base64内容
- 尝试Base64解码
- 解析解码后的规则
-
测试:
- 使用现有的Base64编码GFWList文件测试
- 确保解码和规则解析正常工作
预期效果
- 服务器能够正确加载Base64编码的GFWList文件
- 兼容现有的纯文本GFWList格式
- 规则解析结果与原格式一致
代码修改示例
// 在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)
}
// 现有代码...
}
实施步骤
- 修改
gfw/manager.go,添加Base64支持 - 编译并测试
- 验证规则加载是否正常
这个修改将使服务器能够同时支持纯文本和Base64编码的GFWList格式,提高了兼容性和灵活性。