Skip to content

Commit bbc2a47

Browse files
committed
Add optional max_retry and retry_statuses parameters to HttpClient
1 parent 7149a12 commit bbc2a47

5 files changed

Lines changed: 33 additions & 0 deletions

File tree

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ The following options are available while instantiating a client:
4949
* __timeout__: Request timeout
5050
* __verbose__: Verbose/debug mode
5151
* __logger__: Logger used in verbose mode
52+
* __max_retry__: Number of retries on failed requests. Passed to Faraday
53+
* __retry_statuses__: By default only timeout error will be retries. This allows to retry on specific HTTP statuses. Passed to Faraday
5254

5355
### Architecture
5456

lib/basecrm/configuration.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ class Configuration
77
attr_reader :user_agent
88
attr_reader :timeout
99
attr_reader :verify_ssl
10+
attr_reader :max_retry
11+
attr_reader :retry_statuses
1012

1113
attr_reader :logger, :verbose
1214
alias_method :debug?, :verbose
@@ -19,6 +21,8 @@ def initialize(options={})
1921
@verbose = !!options[:verbose]
2022
@timeout = options[:timeout] || 30
2123
@verify_ssl = options.fetch(:verify_ssl, true)
24+
@max_retry = options[:max_retry]
25+
@retry_statuses = options[:retry_statuses]
2226
end
2327

2428
def validate!

lib/basecrm/http_client.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def initialize(config)
2222
options[:ssl] = { verify: false } unless config.verify_ssl
2323

2424
@client = Faraday.new(config.base_url, options) do |faraday|
25+
faraday.request :retry, retry_options
2526
faraday.use BaseCRM::Middlewares::OAuthBearerToken, config.access_token
2627
faraday.use BaseCRM::Middlewares::RaiseError
2728
faraday.response :logger, config.logger if config.debug?
@@ -89,5 +90,12 @@ def extract_body(res)
8990
content_type = res.headers['Content-Type']
9091
content_type && content_type.include?('json') ? JSON.parse(res.body, symbolize_names: true) : res.body
9192
end
93+
94+
def retry_options
95+
retry_options = {}
96+
retry_options[:max] = @config.max_retry if @config.max_retry
97+
retry_options[:retry_statuses] = @config.retry_statuses if @config.retry_statuses
98+
retry_options
99+
end
92100
end
93101
end

spec/http_client_spec.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
require 'spec_helper'
2+
3+
describe BaseCRM::HttpClient do
4+
describe 'Retries' do
5+
let(:statuses_to_retry) { [503] }
6+
let(:max_retry) { 3 }
7+
subject(:client_with_retry) { client_with_basic_retry(max_retry: max_retry, on_statuses: statuses_to_retry) }
8+
9+
it "should pass retry statues to Faraday and do a valid request" do
10+
expect(client_with_retry.http_client.client.app.options.retry_statuses).to match_array(statuses_to_retry)
11+
expect(client_with_retry.http_client.client.app.options.max).to eq(max_retry)
12+
expect(client_with_retry.accounts.self).to be_instance_of BaseCRM::Account
13+
end
14+
end
15+
end

spec/support/client_helpers.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ def client
33
@client ||= BaseCRM::Client.new(access_token: access_token, base_url: base_url)
44
end
55

6+
def client_with_basic_retry(max_retry: 1, on_statuses: [])
7+
@client_with_basic_retry ||= BaseCRM::Client.new(access_token: access_token, base_url: base_url, max_retry: max_retry, retry_statuses: on_statuses)
8+
end
9+
610
def access_token
711
@access_token ||= ENV.fetch("BASECRM_ACCESS_TOKEN") { raise '"BASECRM_ACCESS_TOKEN" has not been found.' }
812
end

0 commit comments

Comments
 (0)