class HTTP::Retriable::DelayCalculator

@api private
Calculates retry delays with support for Retry-After headers

def calculate_delay_from_iteration(iteration)

Returns:
  • (Numeric) -

Other tags:
    Api: - private

Parameters:
  • iteration (Integer) --
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)

Returns:
  • (Numeric) -

Other tags:
    Api: - private

Parameters:
  • response (HTTP::Response, nil) --
  • iteration (Integer) --
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_delay_in_bounds(delay)
end

def delay_from_retry_header(value)

Returns:
  • (Numeric) -

Other tags:
    Api: - private

Parameters:
  • value (String) --
def delay_from_retry_header(value)
  value = String(value).strip
  case value
  when RFC2822_DATE_REGEX then DateTime.rfc2822(value).to_time - Time.now.utc
  when /\A\d+$/           then value.to_i
  else 0
  end
end

def ensure_delay_in_bounds(delay)

Returns:
  • (Numeric) -

Other tags:
    Api: - private

Parameters:
  • delay (Numeric) --
def ensure_delay_in_bounds(delay)
  Float(delay.clamp(0, @max_delay))
end

def initialize(delay: nil, max_delay: Float::MAX)

Returns:
  • (HTTP::Retriable::DelayCalculator) -

Other tags:
    Api: - private

Parameters:
  • max_delay (#to_f) -- maximum delay cap
  • delay (#call, Numeric, nil) -- delay value or proc
def initialize(delay: nil, max_delay: Float::MAX)
  @max_delay = Float(max_delay)
  if delay.respond_to?(:call)
    @delay_proc = delay
  else
    @delay = delay
  end
end