Как определить, достиг ли я предела размера через Go's MaxBytesReader - PullRequest
0 голосов
/ 18 октября 2018

Я новичок в 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

  • Может ли мой код выполнить ветвление при этом условии?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете определить, был ли предел превышен, проверяя, превышает ли длина считываемых данных (или равна) лимит 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
}
0 голосов
/ 18 октября 2018

Вызов ParseForm в начале обработчика.Если этот метод возвращает ошибку, то предел размера был нарушен или тело запроса каким-то образом было недействительным.Запишите состояние ошибки и возвратите из обработчика.

Нет простого способа определить, является ли ошибка результатом нарушения ограничения размера или какой-либо другой ошибки.

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)
}

В зависимости отваши потребности, может быть лучше поместить чек в промежуточное программное обеспечение:

func maxBytes(f http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
            r.Body = http.MaxBytesReader(w, r.Body, 10)
            if err := r.ParseForm(); err != nil {
                http.Error(w, "Bad Request", http.StatusBadRequest)
                return
            }
            f(w, r)
    }
}
...