class HTTP::Redirector

def endless_loop?

Check if we got into an endless loop
def endless_loop?
  2 < @visited.count(@visited.last)
end

def follow

Follow redirects
def follow
  while REDIRECT_CODES.include?(@response.code)
    @visited << @request.uri.to_s
    fail TooManyRedirectsError if too_many_hops?
    fail EndlessRedirectError  if endless_loop?
    uri = @response.headers["Location"]
    fail StateError, "no Location header in redirect" unless uri
    if 303 == @response.code
      @request = @request.redirect uri, :get
    else
      @request = @request.redirect uri
    end
    @response = yield @request
  end
  @response
end

def initialize(options = nil)

:nodoc:
def initialize(options = nil)
  options   = {:max_hops => 5} unless options.respond_to?(:fetch)
  @max_hops = options.fetch(:max_hops, 5)
  @max_hops = false if @max_hops && 1 > @max_hops.to_i
end

def perform(request, response, &block)

Follows redirects until non-redirect response found
def perform(request, response, &block)
  reset(request, response)
  follow(&block)
end

def reset(request, response)

Reset redirector state
def reset(request, response)
  @request, @response = request, response
  @visited = []
end

def too_many_hops?

Check if we reached max amount of redirect hops
def too_many_hops?
  @max_hops < @visited.count if @max_hops
end