faraday 0.17.3 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +156 -8
  3. data/LICENSE.md +1 -1
  4. data/README.md +16 -358
  5. data/Rakefile +1 -7
  6. data/examples/client_spec.rb +65 -0
  7. data/examples/client_test.rb +79 -0
  8. data/lib/faraday.rb +120 -189
  9. data/lib/faraday/adapter.rb +77 -22
  10. data/lib/faraday/adapter/em_http.rb +148 -102
  11. data/lib/faraday/adapter/em_http_ssl_patch.rb +24 -18
  12. data/lib/faraday/adapter/em_synchrony.rb +110 -63
  13. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +18 -15
  14. data/lib/faraday/adapter/httpclient.rb +83 -59
  15. data/lib/faraday/adapter/patron.rb +80 -43
  16. data/lib/faraday/adapter/rack.rb +30 -13
  17. data/lib/faraday/adapter/test.rb +86 -53
  18. data/lib/faraday/adapter/typhoeus.rb +4 -1
  19. data/lib/faraday/adapter_registry.rb +30 -0
  20. data/lib/faraday/autoload.rb +44 -36
  21. data/lib/faraday/connection.rb +313 -182
  22. data/lib/faraday/dependency_loader.rb +37 -0
  23. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  24. data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
  25. data/lib/faraday/error.rb +29 -35
  26. data/lib/faraday/file_part.rb +128 -0
  27. data/lib/faraday/logging/formatter.rb +105 -0
  28. data/lib/faraday/methods.rb +6 -0
  29. data/lib/faraday/middleware.rb +19 -25
  30. data/lib/faraday/middleware_registry.rb +129 -0
  31. data/lib/faraday/options.rb +36 -191
  32. data/lib/faraday/options/connection_options.rb +22 -0
  33. data/lib/faraday/options/env.rb +181 -0
  34. data/lib/faraday/options/proxy_options.rb +28 -0
  35. data/lib/faraday/options/request_options.rb +22 -0
  36. data/lib/faraday/options/ssl_options.rb +59 -0
  37. data/lib/faraday/param_part.rb +53 -0
  38. data/lib/faraday/parameters.rb +4 -197
  39. data/lib/faraday/rack_builder.rb +76 -64
  40. data/lib/faraday/request.rb +86 -44
  41. data/lib/faraday/request/authorization.rb +44 -30
  42. data/lib/faraday/request/basic_authentication.rb +14 -7
  43. data/lib/faraday/request/instrumentation.rb +45 -27
  44. data/lib/faraday/request/multipart.rb +86 -48
  45. data/lib/faraday/request/retry.rb +197 -171
  46. data/lib/faraday/request/token_authentication.rb +15 -10
  47. data/lib/faraday/request/url_encoded.rb +43 -23
  48. data/lib/faraday/response.rb +24 -20
  49. data/lib/faraday/response/logger.rb +22 -69
  50. data/lib/faraday/response/raise_error.rb +49 -18
  51. data/lib/faraday/utils.rb +38 -247
  52. data/lib/faraday/utils/headers.rb +139 -0
  53. data/lib/faraday/utils/params_hash.rb +61 -0
  54. data/lib/faraday/version.rb +5 -0
  55. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  56. data/spec/faraday/adapter/em_http_spec.rb +47 -0
  57. data/spec/faraday/adapter/em_synchrony_spec.rb +16 -0
  58. data/spec/faraday/adapter/excon_spec.rb +49 -0
  59. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  60. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  61. data/spec/faraday/adapter/patron_spec.rb +18 -0
  62. data/spec/faraday/adapter/rack_spec.rb +8 -0
  63. data/spec/faraday/adapter/test_spec.rb +260 -0
  64. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  65. data/spec/faraday/adapter_registry_spec.rb +28 -0
  66. data/spec/faraday/adapter_spec.rb +55 -0
  67. data/spec/faraday/composite_read_io_spec.rb +80 -0
  68. data/spec/faraday/connection_spec.rb +721 -0
  69. data/spec/faraday/error_spec.rb +12 -54
  70. data/spec/faraday/middleware_spec.rb +52 -0
  71. data/spec/faraday/options/env_spec.rb +70 -0
  72. data/spec/faraday/options/options_spec.rb +297 -0
  73. data/spec/faraday/options/proxy_options_spec.rb +37 -0
  74. data/spec/faraday/options/request_options_spec.rb +19 -0
  75. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  76. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  77. data/spec/faraday/rack_builder_spec.rb +345 -0
  78. data/spec/faraday/request/authorization_spec.rb +88 -0
  79. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  80. data/spec/faraday/request/multipart_spec.rb +302 -0
  81. data/spec/faraday/request/retry_spec.rb +242 -0
  82. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  83. data/spec/faraday/request_spec.rb +120 -0
  84. data/spec/faraday/response/logger_spec.rb +220 -0
  85. data/spec/faraday/response/middleware_spec.rb +68 -0
  86. data/spec/faraday/response/raise_error_spec.rb +78 -15
  87. data/spec/faraday/response_spec.rb +75 -0
  88. data/spec/faraday/utils/headers_spec.rb +82 -0
  89. data/spec/faraday/utils_spec.rb +56 -0
  90. data/spec/faraday_spec.rb +37 -0
  91. data/spec/spec_helper.rb +63 -36
  92. data/spec/support/disabling_stub.rb +14 -0
  93. data/spec/support/fake_safe_buffer.rb +15 -0
  94. data/spec/support/helper_methods.rb +133 -0
  95. data/spec/support/shared_examples/adapter.rb +105 -0
  96. data/spec/support/shared_examples/params_encoder.rb +18 -0
  97. data/spec/support/shared_examples/request_method.rb +262 -0
  98. data/spec/support/streaming_response_checker.rb +35 -0
  99. data/spec/support/webmock_rack_app.rb +68 -0
  100. metadata +124 -41
  101. data/lib/faraday/adapter/excon.rb +0 -82
  102. data/lib/faraday/adapter/net_http.rb +0 -152
  103. data/lib/faraday/adapter/net_http_persistent.rb +0 -68
  104. data/lib/faraday/deprecate.rb +0 -107
  105. data/lib/faraday/upload_io.rb +0 -67
  106. data/spec/faraday/deprecate_spec.rb +0 -69
  107. data/test/adapters/default_test.rb +0 -14
  108. data/test/adapters/em_http_test.rb +0 -30
  109. data/test/adapters/em_synchrony_test.rb +0 -32
  110. data/test/adapters/excon_test.rb +0 -30
  111. data/test/adapters/httpclient_test.rb +0 -34
  112. data/test/adapters/integration.rb +0 -263
  113. data/test/adapters/logger_test.rb +0 -136
  114. data/test/adapters/net_http_persistent_test.rb +0 -114
  115. data/test/adapters/net_http_test.rb +0 -79
  116. data/test/adapters/patron_test.rb +0 -40
  117. data/test/adapters/rack_test.rb +0 -38
  118. data/test/adapters/test_middleware_test.rb +0 -157
  119. data/test/adapters/typhoeus_test.rb +0 -38
  120. data/test/authentication_middleware_test.rb +0 -65
  121. data/test/composite_read_io_test.rb +0 -109
  122. data/test/connection_test.rb +0 -738
  123. data/test/env_test.rb +0 -268
  124. data/test/helper.rb +0 -75
  125. data/test/live_server.rb +0 -67
  126. data/test/middleware/instrumentation_test.rb +0 -88
  127. data/test/middleware/retry_test.rb +0 -282
  128. data/test/middleware_stack_test.rb +0 -260
  129. data/test/multibyte.txt +0 -1
  130. data/test/options_test.rb +0 -333
  131. data/test/parameters_test.rb +0 -157
  132. data/test/request_middleware_test.rb +0 -126
  133. data/test/response_middleware_test.rb +0 -72
  134. data/test/strawberry.rb +0 -2
  135. data/test/utils_test.rb +0 -98
@@ -1,43 +1,70 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Faraday
2
- # Public: This is a base class for all Faraday adapters. Adapters are
4
+ # Base class for all Faraday adapters. Adapters are
3
5
  # responsible for fulfilling a Faraday request.
4
- class Adapter < Middleware
5
- CONTENT_LENGTH = 'Content-Length'.freeze
6
-
7
- register_middleware File.expand_path('../adapter', __FILE__),
8
- :test => [:Test, 'test'],
9
- :net_http => [:NetHttp, 'net_http'],
10
- :net_http_persistent => [:NetHttpPersistent, 'net_http_persistent'],
11
- :typhoeus => [:Typhoeus, 'typhoeus'],
12
- :patron => [:Patron, 'patron'],
13
- :em_synchrony => [:EMSynchrony, 'em_synchrony'],
14
- :em_http => [:EMHttp, 'em_http'],
15
- :excon => [:Excon, 'excon'],
16
- :rack => [:Rack, 'rack'],
17
- :httpclient => [:HTTPClient, 'httpclient']
18
-
19
- # Public: This module marks an Adapter as supporting parallel requests.
6
+ class Adapter
7
+ extend MiddlewareRegistry
8
+ extend DependencyLoader
9
+
10
+ CONTENT_LENGTH = 'Content-Length'
11
+
12
+ register_middleware File.expand_path('adapter', __dir__),
13
+ test: [:Test, 'test'],
14
+ typhoeus: [:Typhoeus, 'typhoeus'],
15
+ patron: [:Patron, 'patron'],
16
+ em_synchrony: [:EMSynchrony, 'em_synchrony'],
17
+ em_http: [:EMHttp, 'em_http'],
18
+ rack: [:Rack, 'rack'],
19
+ httpclient: [:HTTPClient, 'httpclient']
20
+
21
+ # This module marks an Adapter as supporting parallel requests.
20
22
  module Parallelism
21
23
  attr_writer :supports_parallel
22
- def supports_parallel?() @supports_parallel end
24
+
25
+ def supports_parallel?
26
+ @supports_parallel
27
+ end
23
28
 
24
29
  def inherited(subclass)
25
30
  super
26
- subclass.supports_parallel = self.supports_parallel?
31
+ subclass.supports_parallel = supports_parallel?
27
32
  end
28
33
  end
29
34
 
30
35
  extend Parallelism
31
36
  self.supports_parallel = false
32
37
 
33
- def initialize(app = nil, opts = {}, &block)
34
- super(app)
38
+ def initialize(_app = nil, opts = {}, &block)
39
+ @app = ->(env) { env.response }
35
40
  @connection_options = opts
36
41
  @config_block = block
37
42
  end
38
43
 
44
+ # Yields or returns an adapter's configured connection. Depends on
45
+ # #build_connection being defined on this adapter.
46
+ #
47
+ # @param env [Faraday::Env, Hash] The env object for a faraday request.
48
+ #
49
+ # @return The return value of the given block, or the HTTP connection object
50
+ # if no block is given.
51
+ def connection(env)
52
+ conn = build_connection(env)
53
+ return conn unless block_given?
54
+
55
+ yield conn
56
+ end
57
+
58
+ # Close any persistent connections. The adapter should still be usable
59
+ # after calling close.
60
+ def close
61
+ # Possible implementation:
62
+ # @app.close if @app.respond_to?(:close)
63
+ end
64
+
39
65
  def call(env)
40
66
  env.clear_body if env.needs_body?
67
+ env.response = Response.new
41
68
  end
42
69
 
43
70
  private
@@ -45,11 +72,39 @@ module Faraday
45
72
  def save_response(env, status, body, headers = nil, reason_phrase = nil)
46
73
  env.status = status
47
74
  env.body = body
48
- env.reason_phrase = reason_phrase && reason_phrase.to_s.strip
75
+ env.reason_phrase = reason_phrase&.to_s&.strip
49
76
  env.response_headers = Utils::Headers.new.tap do |response_headers|
50
77
  response_headers.update headers unless headers.nil?
51
78
  yield(response_headers) if block_given?
52
79
  end
80
+
81
+ env.response.finish(env) unless env.parallel?
82
+ env.response
83
+ end
84
+
85
+ # Fetches either a read, write, or open timeout setting. Defaults to the
86
+ # :timeout value if a more specific one is not given.
87
+ #
88
+ # @param type [Symbol] Describes which timeout setting to get: :read,
89
+ # :write, or :open.
90
+ # @param options [Hash] Hash containing Symbol keys like :timeout,
91
+ # :read_timeout, :write_timeout, :open_timeout, or
92
+ # :timeout
93
+ #
94
+ # @return [Integer, nil] Timeout duration in seconds, or nil if no timeout
95
+ # has been set.
96
+ def request_timeout(type, options)
97
+ key = TIMEOUT_KEYS.fetch(type) do
98
+ msg = "Expected :read, :write, :open. Got #{type.inspect} :("
99
+ raise ArgumentError, msg
100
+ end
101
+ options[key] || options[:timeout]
53
102
  end
103
+
104
+ TIMEOUT_KEYS = {
105
+ read: :read_timeout,
106
+ open: :open_timeout,
107
+ write: :write_timeout
108
+ }.freeze
54
109
  end
55
110
  end
@@ -1,10 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Faraday
2
4
  class Adapter
3
- # EventMachine adapter is useful for either asynchronous requests
4
- # when in EM reactor loop or for making parallel requests in
5
+ # EventMachine adapter. This adapter is useful for either asynchronous
6
+ # requests when in an EM reactor loop, or for making parallel requests in
5
7
  # synchronous code.
6
8
  class EMHttp < Faraday::Adapter
9
+ # Options is a module containing helpers to convert the Faraday env object
10
+ # into options hashes for EMHTTP method calls.
7
11
  module Options
12
+ # @return [Hash]
8
13
  def connection_config(env)
9
14
  options = {}
10
15
  configure_proxy(options, env)
@@ -16,10 +21,10 @@ module Faraday
16
21
 
17
22
  def request_config(env)
18
23
  options = {
19
- :body => read_body(env),
20
- :head => env[:request_headers],
21
- # :keepalive => true,
22
- # :file => 'path/to/file', # stream data off disk
24
+ body: read_body(env),
25
+ head: env[:request_headers]
26
+ # keepalive: true,
27
+ # file: 'path/to/file', # stream data off disk
23
28
  }
24
29
  configure_compression(options, env)
25
30
  options
@@ -30,44 +35,52 @@ module Faraday
30
35
  body.respond_to?(:read) ? body.read : body
31
36
  end
32
37
 
38
+ # Reads out proxy settings from env into options
33
39
  def configure_proxy(options, env)
34
- if proxy = request_options(env)[:proxy]
35
- options[:proxy] = {
36
- :host => proxy[:uri].host,
37
- :port => proxy[:uri].port,
38
- :authorization => [proxy[:user], proxy[:password]]
39
- }
40
- end
40
+ proxy = request_options(env)[:proxy]
41
+ return unless proxy
42
+
43
+ options[:proxy] = {
44
+ host: proxy[:uri].host,
45
+ port: proxy[:uri].port,
46
+ authorization: [proxy[:user], proxy[:password]]
47
+ }
41
48
  end
42
49
 
50
+ # Reads out host and port settings from env into options
43
51
  def configure_socket(options, env)
44
- if bind = request_options(env)[:bind]
45
- options[:bind] = {
46
- :host => bind[:host],
47
- :port => bind[:port]
48
- }
49
- end
52
+ bind = request_options(env)[:bind]
53
+ return unless bind
54
+
55
+ options[:bind] = {
56
+ host: bind[:host],
57
+ port: bind[:port]
58
+ }
50
59
  end
51
60
 
61
+ # Reads out SSL certificate settings from env into options
52
62
  def configure_ssl(options, env)
53
- if env[:url].scheme == 'https' && env[:ssl]
54
- options[:ssl] = {
55
- :cert_chain_file => env[:ssl][:ca_file],
56
- :verify_peer => env[:ssl].fetch(:verify, true)
57
- }
58
- end
63
+ return unless env[:url].scheme == 'https' && env[:ssl]
64
+
65
+ options[:ssl] = {
66
+ cert_chain_file: env[:ssl][:ca_file],
67
+ verify_peer: env[:ssl].fetch(:verify, true)
68
+ }
59
69
  end
60
70
 
71
+ # Reads out timeout settings from env into options
61
72
  def configure_timeout(options, env)
62
- timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout)
63
- options[:connect_timeout] = options[:inactivity_timeout] = timeout
64
- options[:connect_timeout] = open_timeout if open_timeout
73
+ req = request_options(env)
74
+ options[:inactivity_timeout] = request_timeout(:read, req)
75
+ options[:connect_timeout] = request_timeout(:open, req)
65
76
  end
66
77
 
78
+ # Reads out compression header settings from env into options
67
79
  def configure_compression(options, env)
68
- if env[:method] == :get and not options[:head].key? 'accept-encoding'
69
- options[:head]['accept-encoding'] = 'gzip, compressed'
70
- end
80
+ return unless (env[:method] == :get) &&
81
+ !options[:head].key?('accept-encoding')
82
+
83
+ options[:head]['accept-encoding'] = 'gzip, compressed'
71
84
  end
72
85
 
73
86
  def request_options(env)
@@ -77,11 +90,26 @@ module Faraday
77
90
 
78
91
  include Options
79
92
 
80
- dependency 'em-http'
93
+ dependency do
94
+ require 'em-http'
95
+
96
+ begin
97
+ require 'openssl'
98
+ rescue LoadError
99
+ warn 'Warning: no such file to load -- openssl. ' \
100
+ 'Make sure it is installed if you want HTTPS support'
101
+ else
102
+ require 'em-http/version'
103
+ if EventMachine::HttpRequest::VERSION < '1.1.6'
104
+ require 'faraday/adapter/em_http_ssl_patch'
105
+ end
106
+ end
107
+ end
81
108
 
82
109
  self.supports_parallel = true
83
110
 
84
- def self.setup_parallel_manager(options = nil)
111
+ # @return [Manager]
112
+ def self.setup_parallel_manager(_options = nil)
85
113
  Manager.new
86
114
  end
87
115
 
@@ -94,95 +122,114 @@ module Faraday
94
122
  def perform_request(env)
95
123
  if parallel?(env)
96
124
  manager = env[:parallel_manager]
97
- manager.add {
98
- perform_single_request(env).
99
- callback { env[:response].finish(env) }
100
- }
101
- else
102
- unless EventMachine.reactor_running?
103
- error = nil
104
- # start EM, block until request is completed
105
- EventMachine.run do
106
- perform_single_request(env).
107
- callback { EventMachine.stop }.
108
- errback { |client|
109
- error = error_message(client)
110
- EventMachine.stop
111
- }
125
+ manager.add do
126
+ perform_single_request(env)
127
+ .callback { env[:response].finish(env) }
128
+ end
129
+ elsif EventMachine.reactor_running?
130
+ # EM is running: instruct upstream that this is an async request
131
+ env[:parallel_manager] = true
132
+ perform_single_request(env)
133
+ .callback { env[:response].finish(env) }
134
+ .errback do
135
+ # TODO: no way to communicate the error in async mode
136
+ raise NotImplementedError
112
137
  end
113
- raise_error(error) if error
114
- else
115
- # EM is running: instruct upstream that this is an async request
116
- env[:parallel_manager] = true
117
- perform_single_request(env).
118
- callback { env[:response].finish(env) }.
119
- errback {
120
- # TODO: no way to communicate the error in async mode
121
- raise NotImplementedError
122
- }
138
+ else
139
+ error = nil
140
+ # start EM, block until request is completed
141
+ EventMachine.run do
142
+ perform_single_request(env)
143
+ .callback { EventMachine.stop }
144
+ .errback do |client|
145
+ error = error_message(client)
146
+ EventMachine.stop
147
+ end
123
148
  end
149
+ raise_error(error) if error
124
150
  end
125
- rescue EventMachine::Connectify::CONNECTError => err
126
- if err.message.include?("Proxy Authentication Required")
127
- raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
128
- else
129
- raise Faraday::ConnectionFailed, err
151
+ rescue EventMachine::Connectify::CONNECTError => e
152
+ if e.message.include?('Proxy Authentication Required')
153
+ raise Faraday::ConnectionFailed,
154
+ %(407 "Proxy Authentication Required ")
130
155
  end
131
- rescue => err
132
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
133
- raise Faraday::SSLError, err
134
- else
135
- raise
156
+
157
+ raise Faraday::ConnectionFailed, e
158
+ rescue StandardError => e
159
+ if defined?(::OpenSSL::SSL::SSLError) && \
160
+ e.is_a?(::OpenSSL::SSL::SSLError)
161
+ raise Faraday::SSLError, e
136
162
  end
163
+
164
+ raise
137
165
  end
138
166
 
139
167
  # TODO: reuse the connection to support pipelining
140
168
  def perform_single_request(env)
141
169
  req = create_request(env)
142
- req.setup_request(env[:method], request_config(env)).callback { |client|
170
+ req = req.setup_request(env[:method], request_config(env))
171
+ req.callback do |client|
172
+ if env[:request].stream_response?
173
+ warn "Streaming downloads for #{self.class.name} " \
174
+ 'are not yet implemented.'
175
+ env[:request].on_data.call(
176
+ client.response,
177
+ client.response.bytesize
178
+ )
179
+ end
143
180
  status = client.response_header.status
144
181
  reason = client.response_header.http_reason
145
- save_response(env, status, client.response, nil, reason) do |resp_headers|
182
+ save_response(env, status, client.response, nil, reason) do |headers|
146
183
  client.response_header.each do |name, value|
147
- resp_headers[name.to_sym] = value
184
+ headers[name.to_sym] = value
148
185
  end
149
186
  end
150
- }
187
+ end
151
188
  end
152
189
 
153
190
  def create_request(env)
154
- EventMachine::HttpRequest.new(env[:url], connection_config(env).merge(@connection_options))
191
+ EventMachine::HttpRequest.new(
192
+ env[:url], connection_config(env).merge(@connection_options)
193
+ )
155
194
  end
156
195
 
157
196
  def error_message(client)
158
- client.error or "request failed"
197
+ client.error || 'request failed'
159
198
  end
160
199
 
161
200
  def raise_error(msg)
162
- errklass = Faraday::ClientError
163
- if msg == Errno::ETIMEDOUT
164
- errklass = Faraday::TimeoutError
165
- msg = "request timed out"
201
+ error_class = Faraday::ClientError
202
+ if timeout_message?(msg)
203
+ error_class = Faraday::TimeoutError
204
+ msg = 'request timed out'
166
205
  elsif msg == Errno::ECONNREFUSED
167
- errklass = Faraday::ConnectionFailed
168
- msg = "connection refused"
169
- elsif msg == "connection closed by server"
170
- errklass = Faraday::ConnectionFailed
206
+ error_class = Faraday::ConnectionFailed
207
+ msg = 'connection refused'
208
+ elsif msg == 'connection closed by server'
209
+ error_class = Faraday::ConnectionFailed
171
210
  end
172
- raise errklass, msg
211
+ raise error_class, msg
173
212
  end
174
213
 
214
+ def timeout_message?(msg)
215
+ msg == Errno::ETIMEDOUT ||
216
+ (msg.is_a?(String) && msg.include?('timeout error'))
217
+ end
218
+
219
+ # @return [Boolean]
175
220
  def parallel?(env)
176
221
  !!env[:parallel_manager]
177
222
  end
178
223
 
179
- # The parallel manager is designed to start an EventMachine loop
224
+ # This parallel manager is designed to start an EventMachine loop
180
225
  # and block until all registered requests have been completed.
181
226
  class Manager
227
+ # @see reset
182
228
  def initialize
183
229
  reset
184
230
  end
185
231
 
232
+ # Re-initializes instance variables
186
233
  def reset
187
234
  @registered_procs = []
188
235
  @num_registered = 0
@@ -191,11 +238,14 @@ module Faraday
191
238
  @running = false
192
239
  end
193
240
 
194
- def running?() @running end
241
+ # @return [Boolean]
242
+ def running?
243
+ @running
244
+ end
195
245
 
196
246
  def add(&block)
197
247
  if running?
198
- perform_request { yield }
248
+ perform_request(&block)
199
249
  else
200
250
  @registered_procs << block
201
251
  end
@@ -203,15 +253,15 @@ module Faraday
203
253
  end
204
254
 
205
255
  def run
206
- if @num_registered > 0
256
+ if @num_registered.positive?
207
257
  @running = true
208
258
  EventMachine.run do
209
259
  @registered_procs.each do |proc|
210
260
  perform_request(&proc)
211
261
  end
212
262
  end
213
- if @errors.size > 0
214
- raise Faraday::ClientError, @errors.first || "connection failed"
263
+ unless @errors.empty?
264
+ raise Faraday::ClientError, @errors.first || 'connection failed'
215
265
  end
216
266
  end
217
267
  ensure
@@ -220,24 +270,20 @@ module Faraday
220
270
 
221
271
  def perform_request
222
272
  client = yield
223
- client.callback { @num_succeeded += 1; check_finished }
224
- client.errback { @errors << client.error; check_finished }
273
+ client.callback do
274
+ @num_succeeded += 1
275
+ check_finished
276
+ end
277
+ client.errback do
278
+ @errors << client.error
279
+ check_finished
280
+ end
225
281
  end
226
282
 
227
283
  def check_finished
228
- if @num_succeeded + @errors.size == @num_registered
229
- EventMachine.stop
230
- end
284
+ EventMachine.stop if @num_succeeded + @errors.size == @num_registered
231
285
  end
232
286
  end
233
287
  end
234
288
  end
235
289
  end
236
-
237
- begin
238
- require 'openssl'
239
- rescue LoadError
240
- warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
241
- else
242
- require 'faraday/adapter/em_http_ssl_patch'
243
- end if Faraday::Adapter::EMHttp.loaded?