UDTunnel 更新日志 (2025-04-16)

需求序号: 01

功能描述

本次更新旨在解决 Navicat 客户端连接 UDTunnel 时遇到的稳定性问题,特别是连接崩溃和参数处理相关的错误。主要改进包括:

  1. HTTP 连接处理优化:修复了因 HTTP 连接处理不当(Keep-Alive 未正确应用、responseWriter 实现不完整)导致 Navicat 客户端在获取表结构等后续操作时崩溃的问题。确保长连接能正确保持。
  2. 查询参数处理改进:增强了对不同查询参数格式(qq[],包括 FormPostForm)的支持,解决了部分客户端请求无法正确处理的问题,并确保了空查询和连续查询协议标记的完整性。
  3. 日志系统重构
    • 将日志分离为应用日志 (app.log) 和 SQL 日志 (sql.log),减少了日志冗余。
    • 实现了按年/月/日 (YYYY/MM_DD/) 的目录结构组织日志文件。
    • 引入了请求 ID 跟踪机制,便于关联日志事件。
  4. 中间件参数解析修复:修复了中间件(loggingMiddleware, securityMiddleware)在 tunnelHandler 解析请求体之前尝试访问 r.PostForm 导致参数丢失的问题。

代码更新

  • src/middleware.go:
    • 重构 responseWriter 结构体,添加 bytesWrittenheaderWritten 字段,并确保实现 http.Flusher, http.Hijacker, io.ReaderFrom 等接口。
    • loggingMiddlewaresecurityMiddleware 中,增加了 r.ParseMultipartFormr.ParseForm 的调用,确保在访问 r.Form 之前解析请求体。
    • 修改中间件,使用 r.Form.Get() 代替 r.PostForm.Get() 来获取参数。
    • loggingMiddleware 中添加了请求 ID 生成和上下文传递。
    • loggingMiddleware 中请求处理前后添加了 Flush() 调用。
  • src/handlers.go:
    • 优化了 Action ‘Q’ 中对 qq[] 参数的获取逻辑,同时检查 r.Formr.PostForm
    • 为空查询和查询结束添加了正确的协议标记 (0x00)。
    • 确保在连接成功后立即发送 HTTP 状态码和初始 EchoHeader(0)
  • src/main.go:
    • 显式调用 server.SetKeepAlivesEnabled(true)
    • 更新了中间件的注册顺序和 tunnelHandler 的调用方式(通过 loggedHandler)。
  • src/logger.go:
    • 引入 LogType (App, SQL, Debug)。
    • 修改 getLogFilePath 以支持按 年/月/日 的目录结构。
    • 添加了 ConnectionLogger 用于跟踪单个连接的日志。
    • 分离 zap, sqlZap, debugZap 日志实例。
    • 更新了日志记录函数以支持目标 (target) 和元数据 (meta)。
  • src/protocol.go:
    • 更新了 mapColumnToNavicat 函数,以更准确地模拟 PHP 脚本的行为,特别是 SHOW TABLES 列的处理。
  • go.mod:
    • 添加了 github.com/natefinch/lumberjackgo.uber.org/zap 依赖。
    • 执行 go mod tidy 更新依赖。

注意事项

  • 配置文件: 本次更新不需要更改 config.yaml 的基本结构。
  • 超时设置: 建议更新 config.yaml 中的 timeouts 设置,特别是 idle 超时,建议至少设置为 "120s" 以适应 Navicat 的行为。
    timeouts:
      read: "30s"
      write: "90s"
      idle: "120s"
  • 依赖: 确保 Go 环境已正确安装,并通过 go mod tidy 下载了所有必需的依赖。
  • 日志目录: 新的日志目录结构 (logs/app/YYYY/MM_DD/, logs/sql/YYYY/MM_DD/) 会在程序首次运行时自动创建。
  • 认证: 认证中间件 (authMiddleware) 当前仍处于绕过状态,用于测试。生产环境部署前需要实现完整的认证逻辑。

更新日期

2025-04-16