93 lines
2.6 KiB
Ruby
93 lines
2.6 KiB
Ruby
|
require 'uri'
|
||
|
|
||
|
module Faraday
|
||
|
class Adapter
|
||
|
class EMSynchrony < Faraday::Adapter
|
||
|
include EMHttp::Options
|
||
|
|
||
|
dependency do
|
||
|
require 'em-synchrony/em-http'
|
||
|
require 'em-synchrony/em-multi'
|
||
|
require 'fiber'
|
||
|
end
|
||
|
|
||
|
self.supports_parallel = true
|
||
|
|
||
|
def self.setup_parallel_manager(options = {})
|
||
|
ParallelManager.new
|
||
|
end
|
||
|
|
||
|
def call(env)
|
||
|
super
|
||
|
request = EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env))
|
||
|
|
||
|
http_method = env[:method].to_s.downcase.to_sym
|
||
|
|
||
|
# Queue requests for parallel execution.
|
||
|
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
|
||
|
|
||
|
# Finalize the response object with values from `env`.
|
||
|
env[:response].finish(env)
|
||
|
end
|
||
|
|
||
|
# Execute single request.
|
||
|
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
|
||
|
|
||
|
raise client.error if client.error
|
||
|
|
||
|
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, $!
|
||
|
rescue EventMachine::Connectify::CONNECTError => err
|
||
|
if err.message.include?("Proxy Authentication Required")
|
||
|
raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
||
|
else
|
||
|
raise Error::ConnectionFailed, err
|
||
|
end
|
||
|
rescue => err
|
||
|
if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
|
||
|
raise Faraday::SSLError, err
|
||
|
else
|
||
|
raise
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
require 'faraday/adapter/em_synchrony/parallel_manager'
|
||
|
|
||
|
begin
|
||
|
require 'openssl'
|
||
|
rescue LoadError
|
||
|
warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
|
||
|
else
|
||
|
require 'faraday/adapter/em_http_ssl_patch'
|
||
|
end if Faraday::Adapter::EMSynchrony.loaded?
|