lib/asana/http_client/error_handling.rb in asana-0.10.3 vs lib/asana/http_client/error_handling.rb in asana-0.10.12

- old
+ new

@@ -9,11 +9,11 @@ module ErrorHandling include Errors module_function - MAX_TIMEOUTS = 5 + MAX_RETRIES = 5 # Public: Perform a request handling any API errors correspondingly. # # request - [Proc] a block that will execute the request. # @@ -26,11 +26,11 @@ # Raises [Asana::Errors::RateLimitEnforced] when the API is throttling. # Raises [Asana::Errors::ServerError] when there's a server problem. # Raises [Asana::Errors::APIError] when the API returns an unknown error. # # rubocop:disable all - def handle(num_timeouts=0, &request) + def handle(num_retries=0, &request) request.call rescue Faraday::ClientError => e raise e unless e.response case e.response[:status] when 400 then raise invalid_request(e.response) @@ -41,12 +41,19 @@ when 412 then recover_response(e.response) when 429 then raise rate_limit_enforced(e.response) when 500 then raise server_error(e.response) else raise api_error(e.response) end + # Retry for timeouts or 500s from Asana + rescue Faraday::ServerError => e + if num_retries < MAX_RETRIES + handle(num_retries + 1, &request) + else + raise server_error(e.response) + end rescue Net::ReadTimeout => e - if num_timeouts < MAX_TIMEOUTS - handle(num_timeouts + 1, &request) + if num_retries < MAX_RETRIES + handle(num_retries + 1, &request) else raise e end end # rubocop:enable all