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