2024-01-18 05:53:42 +05:30
|
|
|
package utils
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"io"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
MaxBodyRead = int64(1 << 22) // 4MB using shift operator
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var _ io.ReadCloser = &LimitResponseBody{}
|
|
|
|
|
|
|
|
|
|
type LimitResponseBody struct {
|
|
|
|
|
io.Reader
|
|
|
|
|
io.Closer
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewLimitResponseBody wraps response body with a limit reader.
|
|
|
|
|
// thus only allowing MaxBodyRead bytes to be read. i.e 4MB
|
|
|
|
|
func NewLimitResponseBody(body io.ReadCloser) io.ReadCloser {
|
2024-01-31 01:59:49 +05:30
|
|
|
return NewLimitResponseBodyWithSize(body, MaxBodyRead)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NewLimitResponseBody wraps response body with a limit reader.
|
|
|
|
|
// thus only allowing MaxBodyRead bytes to be read. i.e 4MB
|
|
|
|
|
func NewLimitResponseBodyWithSize(body io.ReadCloser, size int64) io.ReadCloser {
|
2024-01-18 05:53:42 +05:30
|
|
|
if body == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2024-01-31 01:59:49 +05:30
|
|
|
if size == -1 {
|
|
|
|
|
// stick to default 4MB
|
|
|
|
|
size = MaxBodyRead
|
|
|
|
|
}
|
2024-01-18 05:53:42 +05:30
|
|
|
return &LimitResponseBody{
|
2024-01-31 01:59:49 +05:30
|
|
|
Reader: io.LimitReader(body, size),
|
2024-01-18 05:53:42 +05:30
|
|
|
Closer: body,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// LimitBodyRead limits the body read to MaxBodyRead bytes.
|
|
|
|
|
func LimitBodyRead(r io.Reader) ([]byte, error) {
|
|
|
|
|
return io.ReadAll(io.LimitReader(r, MaxBodyRead))
|
|
|
|
|
}
|