UDTunnel 更新日志 (2025-04-16)
需求序号: 01
功能描述
本次更新旨在解决 Navicat 客户端连接 UDTunnel 时遇到的稳定性问题,特别是连接崩溃和参数处理相关的错误。主要改进包括:
- HTTP 连接处理优化:修复了因 HTTP 连接处理不当(Keep-Alive 未正确应用、
responseWriter
实现不完整)导致 Navicat 客户端在获取表结构等后续操作时崩溃的问题。确保长连接能正确保持。 - 查询参数处理改进:增强了对不同查询参数格式(
q
和q[]
,包括Form
和PostForm
)的支持,解决了部分客户端请求无法正确处理的问题,并确保了空查询和连续查询协议标记的完整性。 - 日志系统重构:
- 将日志分离为应用日志 (
app.log
) 和 SQL 日志 (sql.log
),减少了日志冗余。 - 实现了按年/月/日 (
YYYY/MM_DD/
) 的目录结构组织日志文件。 - 引入了请求 ID 跟踪机制,便于关联日志事件。
- 将日志分离为应用日志 (
- 中间件参数解析修复:修复了中间件(
loggingMiddleware
,securityMiddleware
)在tunnelHandler
解析请求体之前尝试访问r.PostForm
导致参数丢失的问题。
代码更新
src/middleware.go
:- 重构
responseWriter
结构体,添加bytesWritten
和headerWritten
字段,并确保实现http.Flusher
,http.Hijacker
,io.ReaderFrom
等接口。 - 在
loggingMiddleware
和securityMiddleware
中,增加了r.ParseMultipartForm
和r.ParseForm
的调用,确保在访问r.Form
之前解析请求体。 - 修改中间件,使用
r.Form.Get()
代替r.PostForm.Get()
来获取参数。 - 在
loggingMiddleware
中添加了请求 ID 生成和上下文传递。 - 在
loggingMiddleware
中请求处理前后添加了Flush()
调用。
- 重构
src/handlers.go
:- 优化了 Action ‘Q’ 中对
q
和q[]
参数的获取逻辑,同时检查r.Form
和r.PostForm
。 - 为空查询和查询结束添加了正确的协议标记 (
0x00
)。 - 确保在连接成功后立即发送 HTTP 状态码和初始
EchoHeader(0)
。
- 优化了 Action ‘Q’ 中对
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/lumberjack
和go.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