package helpers import ( "context" "fmt" "io" "net/http" "time" ) var ( ErrCurlGetStatus = error(&CurlGetStatusError{}) ) type CurlGetStatusError struct { Expected int Received int } func (e *CurlGetStatusError) Is(err error) bool { if _, ok := err.(*CurlGetStatusError); !ok { return false } return true } func (e *CurlGetStatusError) Error() string { return fmt.Sprintf("CurlGet: expected %d, received %d", e.Expected, e.Received) } func CurlGet(ctx context.Context, url string, timeout time.Duration) ([]byte, error) { var b []byte ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { return b, err } rcl := &http.Client{} var resp *http.Response resp, err = rcl.Do(req) if err != nil { return b, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return b, error(&CurlGetStatusError{ Expected: http.StatusOK, Received: resp.StatusCode, }) } b, err = io.ReadAll(resp.Body) if err != nil { return b, err } return b, nil }