def call(env)
super
request = EventMachine::HttpRequest.new(URI::parse(env[:url].to_s), connection_config(env))
http_method = env[:method].to_s.downcase.to_sym
if env[:parallel_manager]
env[:parallel_manager].add(request, http_method, request_config(env)) do |resp|
save_response(env, resp.response_header.status, resp.response) do |resp_headers|
resp.response_header.each do |name, value|
resp_headers[name.to_sym] = value
end
end
env[:response].finish(env)
end
else
client = nil
block = lambda { request.send(http_method, request_config(env)) }
if !EM.reactor_running?
EM.run do
Fiber.new {
client = block.call
EM.stop
}.resume
end
else
client = block.call
end
save_response(env, client.response_header.status, client.response) do |resp_headers|
client.response_header.each do |name, value|
resp_headers[name.to_sym] = value
end
end
end
@app.call env
rescue Errno::ECONNREFUSED
raise Error::ConnectionFailed, $!
end