blob: 7ffca5744d958df422cc2bcdff54979a0735833d [file] [edit]
package request
import (
"encoding/json"
"errors"
"fmt"
"io"
"mime"
"net/http"
)
// ReadBody read the specified ReadCloser content and returns it.
func ReadBody(b io.ReadCloser) ([]byte, error) {
defer func() { _ = b.Close() }()
return io.ReadAll(b)
}
// ReadJSONResponse reads a JSON response body into the given variable. it
// returns an error for non-jSON responses, or when failing to unmarshal.
func ReadJSONResponse[T any](resp *http.Response, v *T) error {
if resp == nil {
return errors.New("nil *http.Response")
}
defer func() { _ = resp.Body.Close() }()
mt, _, _ := mime.ParseMediaType(resp.Header.Get("Content-Type"))
if mt != "application/json" {
raw, _ := io.ReadAll(io.LimitReader(resp.Body, 8<<10))
return fmt.Errorf("unexpected Content-Type: '%s' (body: %s)", mt, string(raw))
}
return json.NewDecoder(resp.Body).Decode(v)
}