curl.go 1.0 KB

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