curl.go 903 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package helpers
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "time"
  8. )
  9. type CurlGetStatusError struct {
  10. expected int
  11. received int
  12. }
  13. func (c *CurlGetStatusError) Error() string {
  14. return fmt.Sprintf("CurlGet: expected %d, received %d", c.received, c.expected)
  15. }
  16. func CurlGet(ctx context.Context, url string, timeout time.Duration) ([]byte, error) {
  17. var b []byte
  18. ctx, cancel := context.WithTimeout(ctx, timeout)
  19. defer cancel()
  20. req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
  21. if err != nil {
  22. return b, err
  23. }
  24. rcl := &http.Client{}
  25. var resp *http.Response
  26. resp, err = rcl.Do(req)
  27. if err != nil {
  28. return b, err
  29. }
  30. defer resp.Body.Close()
  31. if resp.StatusCode != http.StatusOK {
  32. return b, &CurlGetStatusError{
  33. expected: http.StatusOK,
  34. received: resp.StatusCode,
  35. }
  36. }
  37. b, err = io.ReadAll(resp.Body)
  38. if err != nil {
  39. return b, err
  40. }
  41. return b, nil
  42. }