class Signet::OAuth2::Client

def retry_with_error max_retry_count = 5

def retry_with_error max_retry_count = 5
  retry_count = 0
  begin
    yield.tap { |resp| log_response resp }
  rescue StandardError => e
    if e.is_a?(Signet::AuthorizationError) || e.is_a?(Signet::ParseError)
      log_auth_error e
      raise e
    end
    if retry_count < max_retry_count
      log_transient_error e
      retry_count += 1
      sleep retry_count * 0.3
      retry
    else
      log_retries_exhausted e
      msg = "Unexpected error: #{e.inspect}"
      raise Signet::AuthorizationError, msg
    end
  end
end