class HTTP::Retriable::DelayCalculator
@api private
def calculate_delay_from_iteration(iteration)
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
def call(iteration, response)
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
def delay_from_retry_header(value)
Spec for Retry-After header
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
def ensure_dealy_in_bounds(delay)
def ensure_dealy_in_bounds(delay) delay.clamp(0, @max_delay) end
def initialize(opts)
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