2 回答
TA贡献1797条经验 获得超6个赞
限制请求正文大小的正确方法是按照您的建议进行操作:
r.Body = http.MaxBytesReader(w, r.Body, MaxFileSize)
err := r.ParseForm()
if err != nil {
// redirect or set error status code.
return
}
当达到限制时,MaxBytesReader在响应上设置一个标志。设置此标志后,服务器不会读取请求正文的其余部分,服务器会在处理程序返回时关闭连接。
如果您担心恶意客户端,那么您还应该设置Server.ReadTimeout、Server.WriteTimeout和可能的Server.MaxHeaderBytes。
如果要为所有处理程序设置请求正文限制,请使用在委派给根处理程序之前设置限制的处理程序包装根处理程序:
type maxBytesHandler struct {
h http.Handler
n int64
}
func (h *maxBytesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
r.Body = http.MaxBytesReader(w, r.Body, h.n)
h.h.ServeHTTP(w, r)
}
调用 ListenAndServe 时包装根处理程序:
log.Fatal(http.ListenAndServe(":8080", &maxBytesHandler{h:mux, n:4096))
或者在配置服务器时:
s := http.Server{
Addr: ":8080",
Handler: &maxBytesReader{h:mux, n:4096},
}
log.Fatal(s.ListenAndServe())
不需要另一个答案中建议的补丁。MaxBytesReader 是限制请求正文大小的官方方法。
TA贡献2039条经验 获得超7个赞
编辑:正如其他人所引用的 MaxByteReader 是支持的方式。有趣的是,默认读取器是在为最大字节读取器进行类型断言后的 limitreader。
- 2 回答
- 0 关注
- 170 浏览
添加回答
举报