Don't call retry_block if retry won't happen due to max_interval and retry_after (#1350)

This commit is contained in:
Jonathan Rochkind 2021-12-23 05:30:50 -05:00 committed by GitHub
parent a555580f5f
commit b1165eac65
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 2 deletions

View File

@ -38,7 +38,7 @@ We did our best to make this transition as painless as possible for you, so here
* If you're relying on `Faraday.default_adapter` (e.g. if you use `Faraday.get` or other verb class methods, or not
specifying an adapter in your connection initializer), then you'll now need to set it yourself. It previously
defaulted to `:net_http`, but it now defaults to `:test`. You can do so simply by using the setter:
```ruby
# For example, to use net_http (previous default value, will now require `gem 'faraday-net_http'` in your gemfile)
Faraday.default_adapter = :net_http
@ -86,6 +86,7 @@ For more details, see https://github.com/lostisland/faraday/pull/1306
* Remove `Faraday::Response::Middleware`. You can now use the new `on_complete` callback provided by `Faraday::Middleware`.
* Drop `Faraday::UploadIO` in favour of `Faraday::FilePart`.
* `Faraday.default_connection_options` will now be deep-merged into new connections to avoid overriding them (e.g. headers).
* Retry middleware `retry_block` is not called if retry will not happen due to `max_interval`. (#1350)
## Faraday 1.0

View File

@ -154,8 +154,8 @@ module Faraday
if retries.positive? && retry_request?(env, e)
retries -= 1
rewind_files(request_body)
@options.retry_block.call(env, @options, retries, e)
if (sleep_amount = calculate_sleep_amount(retries + 1, env))
@options.retry_block.call(env, @options, retries, e)
sleep sleep_amount
retry
end

View File

@ -85,6 +85,16 @@ RSpec.describe Faraday::Request::Retry do
it { expect(Time.now - @started).to be_within(0.04).of(0.2) }
end
context 'and retry_block is set' do
let(:options) { [{ retry_block: ->(env, options, retries, exc) { retry_block_calls << [env, options, retries, exc] } }] }
let(:retry_block_calls) { [] }
let(:retry_block_times_called) { retry_block_calls.size }
it 'calls retry block for each retry' do
expect(retry_block_times_called).to eq(2)
end
end
end
context 'when no exception raised' do
@ -249,6 +259,24 @@ RSpec.describe Faraday::Request::Retry do
let(:options) { [{ max: 2, interval: 0.1, max_interval: 5, retry_statuses: 504 }] }
it { expect(times_called).to eq(1) }
context 'and retry_block is set' do
let(:options) do
[{
retry_block: ->(env, options, retries, exc) { retry_block_calls << [env, options, retries, exc] },
max: 2,
max_interval: 5,
retry_statuses: 504
}]
end
let(:retry_block_calls) { [] }
let(:retry_block_times_called) { retry_block_calls.size }
it 'retry_block is not called' do
expect(retry_block_times_called).to eq(0)
end
end
end
end
end