package api import ( "fmt" "io" "net/http" "github.com/klauspost/compress/gzip" "openreplay/backend/pkg/logger" ) func ReadBody(log logger.Logger, w http.ResponseWriter, r *http.Request, limit int64) ([]byte, error) { body := http.MaxBytesReader(w, r.Body, limit) bodyBytes, err := io.ReadAll(body) // Close body if closeErr := body.Close(); closeErr != nil { log.Warn(r.Context(), "error while closing request body: %s", closeErr) } if err != nil { return nil, err } return bodyBytes, nil } func ReadCompressedBody(log logger.Logger, w http.ResponseWriter, r *http.Request, limit int64) ([]byte, error) { body := http.MaxBytesReader(w, r.Body, limit) var ( bodyBytes []byte err error ) // Check if body is gzipped and decompress it if r.Header.Get("Content-Encoding") == "gzip" { reader, err := gzip.NewReader(body) if err != nil { return nil, fmt.Errorf("can't create gzip reader: %s", err) } bodyBytes, err = io.ReadAll(reader) if err != nil { return nil, fmt.Errorf("can't read gzip body: %s", err) } if err := reader.Close(); err != nil { log.Warn(r.Context(), "can't close gzip reader: %s", err) } } else { bodyBytes, err = io.ReadAll(body) } // Close body if closeErr := body.Close(); closeErr != nil { log.Warn(r.Context(), "error while closing request body: %s", closeErr) } if err != nil { return nil, err } return bodyBytes, nil }