5 class EMSynchrony < Faraday::Adapter
6 include EMHttp::Options
9 require 'em-synchrony/em-http'
10 require 'em-synchrony/em-multi'
14 self.supports_parallel = true
16 def self.setup_parallel_manager(options = {})
22 request = EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env))
24 http_method = env[:method].to_s.downcase.to_sym
26 # Queue requests for parallel execution.
27 if env[:parallel_manager]
28 env[:parallel_manager].add(request, http_method, request_config(env)) do |resp|
29 save_response(env, resp.response_header.status, resp.response) do |resp_headers|
30 resp.response_header.each do |name, value|
31 resp_headers[name.to_sym] = value
35 # Finalize the response object with values from `env`.
36 env[:response].finish(env)
39 # Execute single request.
42 block = lambda { request.send(http_method, request_config(env)) }
44 if !EM.reactor_running?
55 raise client.error if client.error
57 save_response(env, client.response_header.status, client.response) do |resp_headers|
58 client.response_header.each do |name, value|
59 resp_headers[name.to_sym] = value
65 rescue Errno::ECONNREFUSED
66 raise Error::ConnectionFailed, $!
67 rescue EventMachine::Connectify::CONNECTError => err
68 if err.message.include?("Proxy Authentication Required")
69 raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
71 raise Error::ConnectionFailed, err
74 if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
75 raise Faraday::SSLError, err
84 require 'faraday/adapter/em_synchrony/parallel_manager'
89 warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
91 require 'faraday/adapter/em_http_ssl_patch'
92 end if Faraday::Adapter::EMSynchrony.loaded?