class HTTP::Redirector
def endless_loop?
def endless_loop? 2 < @visited.count(@visited.last) end
def follow
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)
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)
def perform(request, response, &block) reset(request, response) follow(&block) end
def reset(request, response)
def reset(request, response) @request, @response = request, response @visited = [] end
def too_many_hops?
def too_many_hops? @max_hops < @visited.count if @max_hops end