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)

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After
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