如何通过Go的MaxBytesReader确定我是否已达到大小限制

时间:2018-10-18 17:07:18

标签: go go-http

我不熟悉Go,并且使用Mux接受HTTP POST数据。我想使用MaxBytesReader来确保客户端不会淹没我的服务器。根据{{​​3}},有一个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

  • 我的代码可以在这种情况下分支吗?

2 个答案:

答案 0 :(得分:4)

在处理程序的开头调用ParseForm。如果此方法返回错误,则说明超出了大小限制或请求主体在某种程度上无效。写入错误状态并从处理程序中返回。

没有简单的方法来检测错误是否是由于大小限制违规或其他错误导致的。

'background-position-x'

根据您的需求,最好将支票放在中间件中:

func PostHandler(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        http.Error(w, "Bad Request", http.StatusBadRequest)
        return
    }

    book := r.FormValue("email")
    fmt.Fprintf(w, "You've requested the book: %s\n", book)
}

答案 1 :(得分:1)

您可以通过检查读取数据的长度是否大于(或等于)MaxBytesSize来确定是否超出了限制:

maxBytesSize := 10
r.Body = http.MaxBytesReader(w, r.Body, maxBytesSize)

// check if request body is not too large
data, err := ioutil.ReadAll(r.Body)
if err != nil {
    if len(data) >= maxBytesSize {
         //exceeded
    }
    // some other error
}