package client import ( "context" "errors" "net" ) type HTTPStatusError struct { StatusCode int Status string } func (e *HTTPStatusError) Error() string { return "remote status " + e.Status } func IsRetriable(err error) bool { if err == nil { return false } var statusErr *HTTPStatusError if errors.As(err, &statusErr) { switch statusErr.StatusCode { case 404, 408, 429, 500, 502, 503, 504: return true default: return false } } if errors.Is(err, context.DeadlineExceeded) { return true } var netErr net.Error return errors.As(err, &netErr) }