Class: Faraday::Adapter::EMHttp
- Inherits:
-
Faraday::Adapter
- Object
- Faraday::Adapter
- Faraday::Adapter::EMHttp
- Includes:
- Options
- Defined in:
- lib/faraday/adapter/em_http.rb
Overview
EventMachine adapter. This adapter is useful for either asynchronous requests when in an EM reactor loop, or for making parallel requests in synchronous code.
Defined Under Namespace
Modules: Options Classes: Manager
Constant Summary
Constants inherited from Faraday::Adapter
Instance Attribute Summary
Attributes included from DependencyLoader
Attributes included from Parallelism
Class Method Summary collapse
Instance Method Summary collapse
- #call(env) ⇒ Object
- #create_request(env) ⇒ Object
- #error_message(client) ⇒ Object
- #parallel?(env) ⇒ Boolean
- #perform_request(env) ⇒ Object
-
#perform_single_request(env) ⇒ Object
TODO: reuse the connection to support pipelining.
- #raise_error(msg) ⇒ Object
- #timeout_message?(msg) ⇒ Boolean
Methods included from Options
#configure_compression, #configure_proxy, #configure_socket, #configure_ssl, #configure_timeout, #connection_config, #read_body, #request_config, #request_options
Methods inherited from Faraday::Adapter
Methods included from MiddlewareRegistry
#fetch_middleware, #load_middleware, #lookup_middleware, #middleware_mutex, #register_middleware, #unregister_middleware
Methods included from DependencyLoader
#dependency, #inherited, #loaded?, #new
Methods included from Parallelism
#inherited, #supports_parallel?
Methods included from Faraday::AutoloadHelper
#all_loaded_constants, #autoload_all, #load_autoloaded_constants
Constructor Details
This class inherits a constructor from Faraday::Adapter
Class Method Details
Instance Method Details
#call(env) ⇒ Object
103 104 105 106 107 |
# File 'lib/faraday/adapter/em_http.rb', line 103 def call(env) super perform_request env @app.call env end |
#create_request(env) ⇒ Object
176 177 178 179 180 |
# File 'lib/faraday/adapter/em_http.rb', line 176 def create_request(env) EventMachine::HttpRequest.new( env[:url], connection_config(env).merge(@connection_options) ) end |
#error_message(client) ⇒ Object
182 183 184 |
# File 'lib/faraday/adapter/em_http.rb', line 182 def (client) client.error || 'request failed' end |
#parallel?(env) ⇒ Boolean
206 207 208 |
# File 'lib/faraday/adapter/em_http.rb', line 206 def parallel?(env) !!env[:parallel_manager] end |
#perform_request(env) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/faraday/adapter/em_http.rb', line 109 def perform_request(env) if parallel?(env) manager = env[:parallel_manager] manager.add do perform_single_request(env) .callback { env[:response].finish(env) } end elsif EventMachine.reactor_running? # EM is running: instruct upstream that this is an async request env[:parallel_manager] = true perform_single_request(env) .callback { env[:response].finish(env) } .errback do # TODO: no way to communicate the error in async mode raise NotImplementedError end else error = nil # start EM, block until request is completed EventMachine.run do perform_single_request(env) .callback { EventMachine.stop } .errback do |client| error = (client) EventMachine.stop end end raise_error(error) if error end rescue EventMachine::Connectify::CONNECTError => e if e..include?('Proxy Authentication Required') raise Faraday::ConnectionFailed, %(407 "Proxy Authentication Required ") end raise Faraday::ConnectionFailed, e rescue StandardError => e if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError) raise Faraday::SSLError, e end raise end |
#perform_single_request(env) ⇒ Object
TODO: reuse the connection to support pipelining
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/faraday/adapter/em_http.rb', line 154 def perform_single_request(env) req = create_request(env) req = req.setup_request(env[:method], request_config(env)) req.callback do |client| if env[:request].stream_response? warn "Streaming downloads for #{self.class.name} " \ 'are not yet implemented.' env[:request].on_data.call( client.response, client.response.bytesize ) end status = client.response_header.status reason = client.response_header.http_reason save_response(env, status, client.response, nil, reason) do |headers| client.response_header.each do |name, value| headers[name.to_sym] = value end end end end |
#raise_error(msg) ⇒ Object
186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/faraday/adapter/em_http.rb', line 186 def raise_error(msg) error_class = Faraday::ClientError if (msg) error_class = Faraday::TimeoutError msg = 'request timed out' elsif msg == Errno::ECONNREFUSED error_class = Faraday::ConnectionFailed msg = 'connection refused' elsif msg == 'connection closed by server' error_class = Faraday::ConnectionFailed end raise error_class, msg end |
#timeout_message?(msg) ⇒ Boolean
200 201 202 203 |
# File 'lib/faraday/adapter/em_http.rb', line 200 def (msg) msg == Errno::ETIMEDOUT || (msg.is_a?(String) && msg.include?('timeout error')) end |