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