// Package middleware — bodylimit.go:全局请求体大小限制。 // // 安全审计 M3:此前服务对请求体无任何上限,text/plain 形态的绑定会先 // io.ReadAll 全量进内存、multipart 大文件先完整落盘后才被策略拒绝, // 未认证攻击者可借大 body 消耗内存/磁盘/带宽。 // 本中间件用 http.MaxBytesReader 按「路径类别」给出上限: // - 管理端(/admin/*):1MiB; // - 文本/元信息/取件类(/share/text|metadata|select):1MiB; // - 其余(含上传):maxFileSize(0=回落 uploadSize,仍为 0 时 64MiB 兜底)+ 2MiB 表单开销。 // // 超限时后续读取返回错误,统一被 handler 的 bind 错误路径映射为 400。 package middleware import ( "net/http" "github.com/gin-gonic/gin" ) // BodyLimit 按请求路径动态限制请求体大小(limit<=0 表示不限制)。 func BodyLimit(limitFn func(c *gin.Context) int64) gin.HandlerFunc { return func(c *gin.Context) { if c.Request.Body != nil && limitFn != nil { if limit := limitFn(c); limit > 0 { c.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, limit) } } c.Next() } }