class Async::HTTP::RelativeLocation
A client wrapper which transparently handles both relative and absolute redirects to a given maximum number of hops.
def call(request)
def call(request) hops = 0 # We need to cache the body as it might be submitted multiple times. request.finish while hops < @maximum_hops response = super(request) hops += 1 if response.redirection? response.finish location = response.headers['location'] uri = URI.parse(location) if uri.absolute? return response else request.path = Reference[request.path] + location end unless response.preserve_method? request.method = DEFAULT_METHOD end else return response end end raise TooManyRedirects, "Redirected #{hops} times, exceeded maximum!" end
def initialize(app, maximum_hops = 4)
def initialize(app, maximum_hops = 4) super(app) @maximum_hops = maximum_hops end