def execute(request)
tries = 3
begin
connection, error = connect(request.headers["Host"], request.port,
request.protocol == "https")
if !error.nil?
p :error => error
raise error
end
response = request.execute(connection)
rescue EOFError => e
tries -= 1
@logger.warn("Error while sending request, will retry.",
:tries_left => tries,
:exception => e)
retry if tries > 0
end
redirects = 0
while response.redirect? and response.headers.include?("Location")
if request.method == "HEAD"
connection.release
elsif response.content?
response.body = connection
response.read_http_body { |chunk| }
end
redirects += 1
if redirects > configuration[REDIRECTION_LIMIT]
raise TooManyRedirects.new("Redirect more than " \
"#{configuration[REDIRECTION_LIMIT]} times, aborting.", response)
end
@logger.debug("Redirecting", :location => response.headers["Location"])
request.use_uri(response.headers["Location"])
connection, error = connect(request.headers["Host"], request.port, request.protocol == "https")
if !error.nil?
p :error => error
raise error
end
response = request.execute(connection)
end
if request.method != "HEAD"
response.body = connection
else
connection.release
end
return response
end