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

3.1 KiB
Raw Permalink Blame History

支持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格式
  • 规则解析结果与原格式一致

代码修改示例

// 在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格式提高了兼容性和灵活性。