From ff4203bfb08528a669b9c6595f82bde01d8d2aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Pollak?= Date: Fri, 25 May 2018 21:10:12 -0400 Subject: [PATCH] Retry requests on connection failure, and allow setting open/read timeout via options. --- lib/bootic_client/client.rb | 9 ++++++++- lib/bootic_client/strategies/oauth2_strategy.rb | 4 ++-- lib/bootic_client/strategies/strategy.rb | 14 +++++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/bootic_client/client.rb b/lib/bootic_client/client.rb index 948647d..8857d56 100644 --- a/lib/bootic_client/client.rb +++ b/lib/bootic_client/client.rb @@ -61,8 +61,15 @@ def delete(href, _ = {}, headers = {}) protected + DEFAULT_TIMEOUT = 10 # seconds + def conn(&block) - @conn ||= Faraday.new do |f| + request_opts = { + timeout: options[:timeout] || DEFAULT_TIMEOUT, # both read/open timeout + open_timeout: options[:open_timeout] || DEFAULT_TIMEOUT, # only open timeout + } + + @conn ||= Faraday.new(request: request_opts) do |f| cache_options = {shared_cache: false, store: options[:cache_store]} cache_options[:logger] = options[:logger] if options[:logging] diff --git a/lib/bootic_client/strategies/oauth2_strategy.rb b/lib/bootic_client/strategies/oauth2_strategy.rb index cf31cac..029971a 100644 --- a/lib/bootic_client/strategies/oauth2_strategy.rb +++ b/lib/bootic_client/strategies/oauth2_strategy.rb @@ -30,10 +30,10 @@ def request_headers def retryable(&block) begin - yield + super rescue AuthorizationError => e update_token! - yield + super end end diff --git a/lib/bootic_client/strategies/strategy.rb b/lib/bootic_client/strategies/strategy.rb index 45b6c98..5a678c6 100644 --- a/lib/bootic_client/strategies/strategy.rb +++ b/lib/bootic_client/strategies/strategy.rb @@ -36,6 +36,8 @@ def inspect attr_reader :config, :on_new_token + MAX_RETRIES = 3 + def validate! # Overwrite in sub classes # to raise ArgumentErrors on @@ -62,7 +64,17 @@ def pre_flight # end # def retryable(&block) - yield + begin + retries ||= 0 + yield + rescue Faraday::ConnectionFailed => e + if (retries += 1) < MAX_RETRIES + # puts "Retrying request, attempt #{retries}" + retry + else + raise + end + end end # Noop. Merge these headers into every request.