RRuna

Body Limit 中间件

限制 HTTP 请求体大小,避免超大请求消耗内存和连接

middleware/bodylimit 用来限制请求体大小。它会先检查 Content-Length,再用 http.MaxBytesReader 包裹请求体,防止客户端不带准确长度时继续读取超大内容。

安装

go get github.com/duxweb/runa/middleware

基本用法

import "github.com/duxweb/runa/middleware/bodylimit"

route.Default().Use(bodylimit.New())

默认限制是 4MB

自定义大小

route.Default().Use(bodylimit.New(bodylimit.Config{
    Limit: 8 << 20, // 8MB
}))

Limit 单位是字节。

给上传接口单独放宽

route.Default().Use(bodylimit.New(bodylimit.Config{
    Limit: 4 << 20,
    Next: func(ctx *route.Context) bool {
        return ctx.Request().URL.Path == "/upload"
    },
}))

route.Default().Post("/upload", upload).Use(bodylimit.New(bodylimit.Config{
    Limit: 100 << 20,
}))

全局限制保护普通接口,上传接口单独挂更大的限制。

配置项

字段 类型 默认值 说明
Next func(*route.Context) bool nil 返回 true 时跳过
Limit int64 4 << 20 最大请求体字节数

和 security 的关系

security.New(...) 默认包含 bodylimit,默认大小是 32MB,可以这样调整:

route.Default().Use(security.New(
    security.Production(),
    security.BodyLimit("16MB"),
))

常见问题

  • bodylimit 只限制请求体,不限制 URL query、Header 或响应大小
  • 如果业务需要大文件上传,建议只对上传路由放宽,不要全局放大
  • 超过限制时当前实现返回普通错误,最终状态码由 route 错误渲染决定
编辑此页