error.go 1000 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package imagedata
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. "github.com/imgproxy/imgproxy/v3/ierrors"
  8. "github.com/imgproxy/imgproxy/v3/security"
  9. )
  10. type httpError interface {
  11. Timeout() bool
  12. }
  13. func wrapError(err error) error {
  14. isTimeout := false
  15. switch {
  16. case errors.Is(err, context.DeadlineExceeded):
  17. isTimeout = true
  18. case errors.Is(err, context.Canceled):
  19. return ierrors.New(
  20. 499,
  21. fmt.Sprintf("The image request is cancelled: %s", err),
  22. msgSourceImageIsUnreachable,
  23. )
  24. case errors.Is(err, security.ErrSourceAddressNotAllowed), errors.Is(err, security.ErrInvalidSourceAddress):
  25. return ierrors.New(
  26. 404,
  27. err.Error(),
  28. msgSourceImageIsUnreachable,
  29. )
  30. default:
  31. if httpErr, ok := err.(httpError); ok {
  32. isTimeout = httpErr.Timeout()
  33. }
  34. }
  35. if !isTimeout {
  36. return err
  37. }
  38. ierr := ierrors.New(
  39. http.StatusGatewayTimeout,
  40. fmt.Sprintf("The image request timed out: %s", err),
  41. msgSourceImageIsUnreachable,
  42. )
  43. ierr.Unexpected = true
  44. return ierr
  45. }