--- /dev/null
+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?