twitter-status-bot/.gems/gems/faraday-0.9.0/lib/faraday/adapter/em_synchrony.rb

93 lines
2.6 KiB
Ruby
Raw Normal View History

2014-09-03 08:49:59 +00:00
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?