I've made an http middleware that uses http.MaxBytesReader to limit the accepted size of requests.
The middleware is as follows:
func bodyLimitMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
r.Body = http.MaxBytesReader(w, r.Body, 1<<2) // example limited size
next.ServeHTTP(w, r)
})
}
It seems sensible to send a 413 status code to any clients transgressing limits. However I can't find a way of raising an http.StatusRequestEntityTooLarge either from the middleware or from any http endpoint handler.
For example the test below fails with a 200 status, as shown at
https://go.dev/play/p/bcU20WP9Op0.
Advice gratefully received.
func TestBodyLimit(t *testing.T) {
r := httptest.NewRequest(http.MethodPost, "
http://www.example.com/", strings.NewReader(bodyMaker(1<<3)))
w := httptest.NewRecorder()
testHandler := http.HandlerFunc(func(w http.ResponseWriter, ri *http.Request) {
_, err := io.Copy(w, ri.Body)
if err != nil {
e := new(http.MaxBytesError)
if errors.As(err, &e) {
w.WriteHeader(http.StatusRequestEntityTooLarge)
} else {
t.Fatal(err)
}
}
})
bodyLimitMiddleware(testHandler).ServeHTTP(w, r)
if got, want := w.Result().StatusCode, http.StatusRequestEntityTooLarge; got != want {
t.Fatalf("bad status: got %v want %v", got, want)
}
}