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 }