class HTTP::Redirector

def endless_loop?

Returns:
  • (Boolean) -
def endless_loop?
  2 <= @visited.count(@visited.last)
end

def initialize(opts = {})

Options Hash: (**opts)
  • :max_hops (#to_i) -- maximum allowed amount of hops
  • :strict (Boolean) -- redirector hops policy

Parameters:
  • opts (Hash) --
def initialize(opts = {})
  @strict   = opts.fetch(:strict, true)
  @max_hops = opts.fetch(:max_hops, 5).to_i
end

def perform(request, response)

Follows redirects until non-redirect response found
def perform(request, response)
  @request  = request
  @response = response
  @visited  = []
  while REDIRECT_CODES.include? @response.status.code
    @visited << "#{@request.verb} #{@request.uri}"
    fail TooManyRedirectsError if too_many_hops?
    fail EndlessRedirectError  if endless_loop?
    @request  = redirect_to @response.headers[Headers::LOCATION]
    @response = yield @request
  end
  @response
end

def redirect_to(uri)

Returns:
  • (Request) -
def redirect_to(uri)
  fail StateError, "no Location header in redirect" unless uri
  verb = @request.verb
  code = @response.status.code
  if UNSAFE_VERBS.include?(verb) && STRICT_SENSITIVE_CODES.include?(code)
    fail StateError, "can't follow #{@response.status} redirect" if @strict
    verb = :get
  end
  verb = :get if !SEE_OTHER_ALLOWED_VERBS.include?(verb) && 303 == code
  @request.redirect(uri, verb)
end

def too_many_hops?

Returns:
  • (Boolean) -
def too_many_hops?
  1 <= @max_hops && @max_hops < @visited.count
end