class HTTP::Retriable::DelayCalculator
@api private
Constants
- RFC2822_DATE_REGEX
Public Class Methods
Source
# File lib/http/retriable/delay_calculator.rb, line 7 def initialize(opts) @max_delay = opts.fetch(:max_delay, Float::MAX).to_f if (delay = opts[:delay]).respond_to?(:call) @delay_proc = opts.fetch(:delay) else @delay = delay end end
Public Instance Methods
Source
# File lib/http/retriable/delay_calculator.rb, line 47 def calculate_delay_from_iteration(iteration) if @delay_proc @delay_proc.call(iteration) elsif @delay @delay else delay = (2**(iteration - 1)) - 1 delay_noise = rand delay + delay_noise end end
Source
# File lib/http/retriable/delay_calculator.rb, line 16 def call(iteration, response) delay = if response && (retry_header = response.headers["Retry-After"]) delay_from_retry_header(retry_header) else calculate_delay_from_iteration(iteration) end ensure_dealy_in_bounds(delay) end
Source
# File lib/http/retriable/delay_calculator.rb, line 37 def delay_from_retry_header(value) value = value.to_s.strip case value when RFC2822_DATE_REGEX then DateTime.rfc2822(value).to_time - Time.now.utc when /^\d+$/ then value.to_i else 0 end end
Spec for Retry-After header developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
Source
# File lib/http/retriable/delay_calculator.rb, line 59 def ensure_dealy_in_bounds(delay) delay.clamp(0, @max_delay) end