38 lines
838 B
Go
38 lines
838 B
Go
package httputil
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"net/http"
|
|
)
|
|
|
|
const (
|
|
requestBodyReadInitCap = 512
|
|
requestBodyReadMaxInitCap = 1 << 20
|
|
)
|
|
|
|
// ReadRequestBodyWithPrealloc reads request body with preallocated buffer based on content length.
|
|
func ReadRequestBodyWithPrealloc(req *http.Request) ([]byte, error) {
|
|
if req == nil || req.Body == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
capHint := requestBodyReadInitCap
|
|
if req.ContentLength > 0 {
|
|
switch {
|
|
case req.ContentLength < int64(requestBodyReadInitCap):
|
|
capHint = requestBodyReadInitCap
|
|
case req.ContentLength > int64(requestBodyReadMaxInitCap):
|
|
capHint = requestBodyReadMaxInitCap
|
|
default:
|
|
capHint = int(req.ContentLength)
|
|
}
|
|
}
|
|
|
|
buf := bytes.NewBuffer(make([]byte, 0, capHint))
|
|
if _, err := io.Copy(buf, req.Body); err != nil {
|
|
return nil, err
|
|
}
|
|
return buf.Bytes(), nil
|
|
}
|