Кроме ответа Питера, в пакете net/http
есть готовое решение: http.MaxBytesReader()
:
func MaxBytesReader(w ResponseWriter, r io.ReadCloser, n int64) io.ReadCloser
MaxBytesReader isпохож на io.LimitReader, но предназначен для ограничения размера тела входящих запросов.В отличие от io.LimitReader, результатом MaxBytesReader является ReadCloser, он возвращает ошибку, не связанную с EOF, для чтения вне предела и закрывает базовый считыватель при вызове его метода Close.
Первоначально это было«предназначен» для ограничения размера входящих запросов тел, но также может использоваться для ограничения входящих ответов тел.Для этого просто передайте nil
для параметра ResponseWriter
.
Пример, используя его:
{
body := ioutil.NopCloser(bytes.NewBuffer([]byte{0, 1, 2, 3, 4}))
r := http.MaxBytesReader(nil, body, 4)
buf, err := ioutil.ReadAll(r)
fmt.Println("When body is large:", buf, err)
}
{
body := ioutil.NopCloser(bytes.NewBuffer([]byte{0, 1, 2, 3, 4}))
r := http.MaxBytesReader(nil, body, 5)
buf, err := ioutil.ReadAll(r)
fmt.Println("When body is exact (OK):", buf, err)
}
{
body := ioutil.NopCloser(bytes.NewBuffer([]byte{0, 1, 2, 3, 4}))
r := http.MaxBytesReader(nil, body, 6)
buf, err := ioutil.ReadAll(r)
fmt.Println("When body is small (OK):", buf, err)
}
Вывод (попробуйте на Go Playground ):
When body is large: [0 1 2 3] http: request body too large
When body is exact (OK): [0 1 2 3 4] <nil>
When body is small (OK): [0 1 2 3 4] <nil>