- result = request.send(connection, true)
-
- case result.status
- when 200...300
- result
- when 301, 302, 303, 307
- request = generate_request(request.to_hash.merge({
- :uri => result.headers['location'],
- :api_method => nil
- }))
- raise RedirectError.new(result.headers['location'], result)
- when 400...500
- if result.status == 401 && request.authorization.respond_to?(:refresh_token) && auto_refresh_token
- begin
- logger.debug("Attempting refresh of access token & retry of request")
- request.authorization.fetch_access_token!
- rescue Signet::AuthorizationError
- # Ignore since we want the original error
- end
- end
- raise ClientError.new(result.error_message || "A client error has occurred", result)
- when 500...600
- raise ServerError.new(result.error_message || "A server error has occurred", result)
- else
- raise TransmissionError.new(result.error_message || "A transmission error has occurred", result)
+ attempt += 1
+
+ # This 2nd level retriable only catches auth errors, and supports 1 retry, which allows
+ # auth to be re-attempted without having to retry all sorts of other failures like
+ # NotFound, etc
+ Retriable.retriable :tries => ((expired_auth_retry || tries > 1) && attempt == 1) ? 2 : 1,
+ :on => [AuthorizationError],
+ :on_retry => authorization_error_handler(request.authorization) do
+ result = request.send(connection, true)
+
+ case result.status
+ when 200...300
+ result
+ when 301, 302, 303, 307
+ request = generate_request(request.to_hash.merge({
+ :uri => result.headers['location'],
+ :api_method => nil
+ }))
+ raise RedirectError.new(result.headers['location'], result)
+ when 401
+ raise AuthorizationError.new(result.error_message || 'Invalid/Expired Authentication', result)
+ when 400, 402...500
+ raise ClientError.new(result.error_message || "A client error has occurred", result)
+ when 500...600
+ raise ServerError.new(result.error_message || "A server error has occurred", result)
+ else
+ raise TransmissionError.new(result.error_message || "A transmission error has occurred", result)
+ end