lib/faraday/retry/middleware.rb in faraday-retry-2.1.0 vs lib/faraday/retry/middleware.rb in faraday-retry-2.2.0
- old
+ new
@@ -25,11 +25,11 @@
class Options < Faraday::Options.new(:max, :interval, :max_interval,
:interval_randomness,
:backoff_factor, :exceptions,
:methods, :retry_if, :retry_block,
:retry_statuses, :rate_limit_retry_header,
- :rate_limit_reset_header)
+ :rate_limit_reset_header, :header_parser_block)
DEFAULT_CHECK = ->(_env, _exception) { false }
def self.from(value)
if value.is_a?(Integer)
@@ -118,10 +118,14 @@
# seconds.
# @option options [Array] :retry_statuses Array of Integer HTTP status
# codes or a single Integer value that determines whether to raise
# a Faraday::RetriableResponse exception based on the HTTP status code
# of an HTTP response.
+ # @option options [Block] :header_parser_block block that will receive
+ # the the value of the retry header and should return the number of
+ # seconds to wait before retrying the request. This is useful if the
+ # value of the header is not a number of seconds or a RFC 2822 formatted date.
def initialize(app, options = nil)
super(app)
@options = Options.from(options)
@errmatch = build_exception_matcher(@options.exceptions)
end
@@ -242,15 +246,19 @@
response_headers = env[:response_headers]
return unless response_headers
retry_after_value = env[:response_headers][header]
- # Try to parse date from the header value
- begin
- datetime = DateTime.rfc2822(retry_after_value)
- datetime.to_time - Time.now.utc
- rescue ArgumentError
- retry_after_value.to_f
+ if @options.header_parser_block
+ @options.header_parser_block.call(retry_after_value)
+ else
+ # Try to parse date from the header value
+ begin
+ datetime = DateTime.rfc2822(retry_after_value)
+ datetime.to_time - Time.now.utc
+ rescue ArgumentError
+ retry_after_value.to_f
+ end
end
end
end
end
end