我是Go的新手,使用Mux来接受HTTP POST数据。我想使用MaxBytesReader来确保客户端不会压倒我的服务器。根据代码,有一个requestBodyLimit
布尔值表示是否达到了限制。
我的问题是:当使用MaxBytesReader时,我如何确定在处理请求时是否真的达到了最大值?
下面是我的代码:
package main
import (
"fmt"
"log"
"html/template"
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
r.HandleFunc("/handle", maxBytes(PostHandler)).Methods("POST")
http.ListenAndServe(":8080", r)
}
// Middleware to enforce the maximum post body size
func maxBytes(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// As an example, limit post body to 10 bytes
r.Body = http.MaxBytesReader(w, r.Body, 10)
f(w, r)
}
}
func PostHandler(w http.ResponseWriter, r *http.Request) {
// How do I know if the form data has been truncated?
book := r.FormValue("email")
fmt.Fprintf(w, "You've requested the book: %s\n", book)
}
字符串
我如何能:
- 确定我已达到最大POST限制(或可以访问
requestBodyLimit
- 在这种情况下,我的代码是否能够进行分支?
3条答案
按热度按时间ljsrvy3e1#
在处理程序的开头调用ParseForm。如果此方法返回错误,则违反了大小限制或请求主体以某种方式无效。写入错误状态并从处理程序返回。
没有一种简单的方法来检测错误是由于违反大小限制还是其他错误造成的。
字符串
根据您的需要,最好将检查放在中间件中:
型
i2byvkas2#
可以这样检查返回的错误是否是
http.MaxBytesError
:字符串
errors.Is()
和errors.As()
在这种情况下不起作用。8yparm6h3#
您可以通过检查读取数据的长度是否大于(或等于)MaxBytesSize来确定是否超过了限制:
字符串