faraday 0.16.1 → 0.17.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +232 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +358 -18
  5. data/Rakefile +13 -0
  6. data/lib/faraday.rb +174 -93
  7. data/lib/faraday/adapter.rb +22 -36
  8. data/lib/faraday/adapter/em_http.rb +97 -140
  9. data/lib/faraday/adapter/em_http_ssl_patch.rb +17 -23
  10. data/lib/faraday/adapter/em_synchrony.rb +60 -104
  11. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +15 -18
  12. data/lib/faraday/adapter/excon.rb +55 -100
  13. data/lib/faraday/adapter/httpclient.rb +39 -61
  14. data/lib/faraday/adapter/net_http.rb +51 -103
  15. data/lib/faraday/adapter/net_http_persistent.rb +28 -49
  16. data/lib/faraday/adapter/patron.rb +35 -54
  17. data/lib/faraday/adapter/rack.rb +12 -28
  18. data/lib/faraday/adapter/test.rb +53 -86
  19. data/lib/faraday/adapter/typhoeus.rb +1 -4
  20. data/lib/faraday/autoload.rb +36 -47
  21. data/lib/faraday/connection.rb +179 -321
  22. data/lib/faraday/deprecate.rb +109 -0
  23. data/lib/faraday/error.rb +72 -28
  24. data/lib/faraday/middleware.rb +28 -4
  25. data/lib/faraday/options.rb +183 -32
  26. data/lib/faraday/parameters.rb +197 -4
  27. data/lib/faraday/rack_builder.rb +55 -66
  28. data/lib/faraday/request.rb +36 -68
  29. data/lib/faraday/request/authorization.rb +30 -42
  30. data/lib/faraday/request/basic_authentication.rb +7 -14
  31. data/lib/faraday/request/instrumentation.rb +27 -45
  32. data/lib/faraday/request/multipart.rb +48 -79
  33. data/lib/faraday/request/retry.rb +171 -197
  34. data/lib/faraday/request/token_authentication.rb +10 -15
  35. data/lib/faraday/request/url_encoded.rb +23 -41
  36. data/lib/faraday/response.rb +13 -20
  37. data/lib/faraday/response/logger.rb +69 -22
  38. data/lib/faraday/response/raise_error.rb +18 -36
  39. data/lib/faraday/upload_io.rb +67 -0
  40. data/lib/faraday/utils.rb +245 -28
  41. data/spec/faraday/deprecate_spec.rb +147 -0
  42. data/spec/faraday/error_spec.rb +102 -0
  43. data/spec/faraday/response/raise_error_spec.rb +106 -0
  44. data/spec/spec_helper.rb +105 -0
  45. data/test/adapters/default_test.rb +14 -0
  46. data/test/adapters/em_http_test.rb +30 -0
  47. data/test/adapters/em_synchrony_test.rb +32 -0
  48. data/test/adapters/excon_test.rb +30 -0
  49. data/test/adapters/httpclient_test.rb +34 -0
  50. data/test/adapters/integration.rb +263 -0
  51. data/test/adapters/logger_test.rb +136 -0
  52. data/test/adapters/net_http_persistent_test.rb +114 -0
  53. data/test/adapters/net_http_test.rb +79 -0
  54. data/test/adapters/patron_test.rb +40 -0
  55. data/test/adapters/rack_test.rb +38 -0
  56. data/test/adapters/test_middleware_test.rb +157 -0
  57. data/test/adapters/typhoeus_test.rb +38 -0
  58. data/test/authentication_middleware_test.rb +65 -0
  59. data/test/composite_read_io_test.rb +109 -0
  60. data/test/connection_test.rb +738 -0
  61. data/test/env_test.rb +268 -0
  62. data/test/helper.rb +75 -0
  63. data/test/live_server.rb +67 -0
  64. data/test/middleware/instrumentation_test.rb +88 -0
  65. data/test/middleware/retry_test.rb +282 -0
  66. data/test/middleware_stack_test.rb +260 -0
  67. data/test/multibyte.txt +1 -0
  68. data/test/options_test.rb +333 -0
  69. data/test/parameters_test.rb +157 -0
  70. data/test/request_middleware_test.rb +126 -0
  71. data/test/response_middleware_test.rb +72 -0
  72. data/test/strawberry.rb +2 -0
  73. data/test/utils_test.rb +98 -0
  74. metadata +50 -26
  75. data/lib/faraday/adapter_registry.rb +0 -28
  76. data/lib/faraday/dependency_loader.rb +0 -37
  77. data/lib/faraday/deprecated_constant.rb +0 -53
  78. data/lib/faraday/encoders/flat_params_encoder.rb +0 -94
  79. data/lib/faraday/encoders/nested_params_encoder.rb +0 -171
  80. data/lib/faraday/file_part.rb +0 -128
  81. data/lib/faraday/logging/formatter.rb +0 -92
  82. data/lib/faraday/middleware_registry.rb +0 -129
  83. data/lib/faraday/options/connection_options.rb +0 -22
  84. data/lib/faraday/options/env.rb +0 -181
  85. data/lib/faraday/options/proxy_options.rb +0 -28
  86. data/lib/faraday/options/request_options.rb +0 -21
  87. data/lib/faraday/options/ssl_options.rb +0 -59
  88. data/lib/faraday/param_part.rb +0 -53
  89. data/lib/faraday/utils/headers.rb +0 -139
  90. data/lib/faraday/utils/params_hash.rb +0 -61
  91. data/spec/external_adapters/faraday_specs_setup.rb +0 -14
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rake/testtask'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task :default => :test
9
+
10
+ desc "Run all tests"
11
+ task :test => :spec do
12
+ exec 'script/test'
13
+ end
data/lib/faraday.rb CHANGED
@@ -1,153 +1,128 @@
1
- # frozen_string_literal: true
2
-
1
+ require 'thread'
3
2
  require 'cgi'
4
3
  require 'set'
5
4
  require 'forwardable'
6
- require 'faraday/middleware_registry'
7
- require 'faraday/dependency_loader'
8
5
 
9
- # This is the main namespace for Faraday.
6
+ # Public: This is the main namespace for Faraday. You can either use it to
7
+ # create Faraday::Connection objects, or access it directly.
10
8
  #
11
- # It provides methods to create {Connection} objects, and HTTP-related
12
- # methods to use directly.
9
+ # Examples
13
10
  #
14
- # @example Helpful class methods for easy usage
15
11
  # Faraday.get "http://faraday.com"
16
12
  #
17
- # @example Helpful class method `.new` to create {Connection} objects.
18
13
  # conn = Faraday.new "http://faraday.com"
19
14
  # conn.get '/'
20
15
  #
21
16
  module Faraday
22
- VERSION = '0.16.1'
23
- METHODS_WITH_QUERY = %w[get head delete connect trace].freeze
24
- METHODS_WITH_BODY = %w[post put patch].freeze
17
+ VERSION = "0.17.4"
25
18
 
26
19
  class << self
27
- # The root path that Faraday is being loaded from.
28
- #
29
- # This is the root from where the libraries are auto-loaded.
30
- #
31
- # @return [String]
20
+ # Public: Gets or sets the root path that Faraday is being loaded from.
21
+ # This is the root from where the libraries are auto-loaded from.
32
22
  attr_accessor :root_path
33
23
 
34
- # Gets or sets the path that the Faraday libs are loaded from.
35
- # @return [String]
24
+ # Public: Gets or sets the path that the Faraday libs are loaded from.
36
25
  attr_accessor :lib_path
37
26
 
38
- # @overload default_adapter
39
- # Gets the Symbol key identifying a default Adapter to use
40
- # for the default {Faraday::Connection}. Defaults to `:net_http`.
41
- # @return [Symbol] the default adapter
42
- # @overload default_adapter=(adapter)
43
- # Updates default adapter while resetting {.default_connection}.
44
- # @return [Symbol] the new default_adapter.
27
+ # Public: Gets or sets the Symbol key identifying a default Adapter to use
28
+ # for the default Faraday::Connection.
45
29
  attr_reader :default_adapter
46
30
 
47
- # Documented below, see default_connection
31
+ # Public: Sets the default Faraday::Connection for simple scripts that
32
+ # access the Faraday constant directly.
33
+ #
34
+ # Faraday.get "https://faraday.com"
48
35
  attr_writer :default_connection
49
36
 
50
- # Tells Faraday to ignore the environment proxy (http_proxy).
51
- # Defaults to `false`.
52
- # @return [Boolean]
37
+ # Public: Tells faraday to ignore the environment proxy (http_proxy).
53
38
  attr_accessor :ignore_env_proxy
54
39
 
55
- # Initializes a new {Connection}.
56
- #
57
- # @param url [String,Hash] The optional String base URL to use as a prefix
58
- # for all requests. Can also be the options Hash. Any of these
59
- # values will be set on every request made, unless overridden
60
- # for a specific request.
61
- # @param options [Hash]
62
- # @option options [String] :url Base URL
63
- # @option options [Hash] :params Hash of unencoded URI query params.
64
- # @option options [Hash] :headers Hash of unencoded HTTP headers.
65
- # @option options [Hash] :request Hash of request options.
66
- # @option options [Hash] :ssl Hash of SSL options.
67
- # @option options [Hash] :proxy Hash of Proxy options.
68
- # @return [Faraday::Connection]
69
- #
70
- # @example With an URL argument
40
+ # Public: Initializes a new Faraday::Connection.
41
+ #
42
+ # url - The optional String base URL to use as a prefix for all
43
+ # requests. Can also be the options Hash.
44
+ # options - The optional Hash used to configure this Faraday::Connection.
45
+ # Any of these values will be set on every request made, unless
46
+ # overridden for a specific request.
47
+ # :url - String base URL.
48
+ # :params - Hash of URI query unencoded key/value pairs.
49
+ # :headers - Hash of unencoded HTTP header key/value pairs.
50
+ # :request - Hash of request options.
51
+ # :ssl - Hash of SSL options.
52
+ # :proxy - Hash of Proxy options.
53
+ #
54
+ # Examples
55
+ #
71
56
  # Faraday.new 'http://faraday.com'
72
- # # => Faraday::Connection to http://faraday.com
73
- #
74
- # @example With an URL argument and an options hash
75
- # Faraday.new 'http://faraday.com', params: { page: 1 }
76
- # # => Faraday::Connection to http://faraday.com?page=1
77
- #
78
- # @example With everything in an options hash
79
- # Faraday.new url: 'http://faraday.com',
80
- # params: { page: 1 }
81
- # # => Faraday::Connection to http://faraday.com?page=1
82
- def new(url = nil, options = {}, &block)
83
- options = default_connection_options.merge(options)
57
+ #
58
+ # # http://faraday.com?page=1
59
+ # Faraday.new 'http://faraday.com', :params => {:page => 1}
60
+ #
61
+ # # same
62
+ #
63
+ # Faraday.new :url => 'http://faraday.com',
64
+ # :params => {:page => 1}
65
+ #
66
+ # Returns a Faraday::Connection.
67
+ def new(url = nil, options = nil, &block)
68
+ options = options ? default_connection_options.merge(options) : default_connection_options
84
69
  Faraday::Connection.new(url, options, &block)
85
70
  end
86
71
 
87
- # @private
88
72
  # Internal: Requires internal Faraday libraries.
89
73
  #
90
- # @param libs [Array] one or more relative String names to Faraday classes.
91
- # @return [void]
74
+ # *libs - One or more relative String names to Faraday classes.
75
+ #
76
+ # Returns nothing.
92
77
  def require_libs(*libs)
93
78
  libs.each do |lib|
94
79
  require "#{lib_path}/#{lib}"
95
80
  end
96
81
  end
97
82
 
98
- alias require_lib require_libs
99
-
100
- # Documented elsewhere, see default_adapter reader
83
+ # Public: Updates default adapter while resetting
84
+ # #default_connection.
85
+ #
86
+ # Returns the new default_adapter.
101
87
  def default_adapter=(adapter)
102
88
  @default_connection = nil
103
89
  @default_adapter = adapter
104
90
  end
105
91
 
106
- def respond_to_missing?(symbol, include_private = false)
92
+ alias require_lib require_libs
93
+
94
+ def respond_to?(symbol, include_private = false)
107
95
  default_connection.respond_to?(symbol, include_private) || super
108
96
  end
109
97
 
110
- private
111
-
98
+ private
112
99
  # Internal: Proxies method calls on the Faraday constant to
113
- # .default_connection.
100
+ # #default_connection.
114
101
  def method_missing(name, *args, &block)
115
- if default_connection.respond_to?(name)
116
- default_connection.send(name, *args, &block)
117
- else
118
- super
119
- end
102
+ default_connection.send(name, *args, &block)
120
103
  end
121
104
  end
122
105
 
123
106
  self.ignore_env_proxy = false
124
- self.root_path = File.expand_path __dir__
125
- self.lib_path = File.expand_path 'faraday', __dir__
107
+ self.root_path = File.expand_path "..", __FILE__
108
+ self.lib_path = File.expand_path "../faraday", __FILE__
126
109
  self.default_adapter = :net_http
127
110
 
128
- # @overload default_connection
129
- # Gets the default connection used for simple scripts.
130
- # @return [Faraday::Connection] a connection configured with
131
- # the default_adapter.
132
- # @overload default_connection=(connection)
133
- # @param connection [Faraday::Connection]
134
- # Sets the default {Faraday::Connection} for simple scripts that
135
- # access the Faraday constant directly, such as
136
- # <code>Faraday.get "https://faraday.com"</code>.
111
+ # Gets the default connection used for simple scripts.
112
+ #
113
+ # Returns a Faraday::Connection, configured with the #default_adapter.
137
114
  def self.default_connection
138
115
  @default_connection ||= Connection.new(default_connection_options)
139
116
  end
140
117
 
141
- # Gets the default connection options used when calling {Faraday#new}.
118
+ # Gets the default connection options used when calling Faraday#new.
142
119
  #
143
- # @return [Faraday::ConnectionOptions]
120
+ # Returns a Faraday::ConnectionOptions.
144
121
  def self.default_connection_options
145
122
  @default_connection_options ||= ConnectionOptions.new
146
123
  end
147
124
 
148
- # Sets the default options used when calling {Faraday#new}.
149
- #
150
- # @param options [Hash, Faraday::ConnectionOptions]
125
+ # Public: Sets the default options used when calling Faraday#new.
151
126
  def self.default_connection_options=(options)
152
127
  @default_connection = nil
153
128
  @default_connection_options = ConnectionOptions.from(options)
@@ -158,9 +133,115 @@ module Faraday
158
133
  Timer = Timeout
159
134
  end
160
135
 
161
- require_libs 'utils', 'options', 'connection', 'rack_builder', 'parameters',
162
- 'middleware', 'adapter', 'request', 'response', 'error',
163
- 'file_part', 'param_part'
136
+ # Public: Adds the ability for other modules to register and lookup
137
+ # middleware classes.
138
+ module MiddlewareRegistry
139
+ # Public: Register middleware class(es) on the current module.
140
+ #
141
+ # mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
142
+ # as fully qualified constant, or a Proc that will be lazily
143
+ # called to return the former.
144
+ #
145
+ # Examples
146
+ #
147
+ # module Faraday
148
+ # class Whatever
149
+ # # Middleware looked up by :foo returns Faraday::Whatever::Foo.
150
+ # register_middleware :foo => Foo
151
+ #
152
+ # # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar)
153
+ # register_middleware :bar => :Bar
154
+ #
155
+ # # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz)
156
+ # register_middleware :baz => [:Baz, 'baz']
157
+ # end
158
+ # end
159
+ #
160
+ # Returns nothing.
161
+ def register_middleware(autoload_path = nil, mapping = nil)
162
+ if mapping.nil?
163
+ mapping = autoload_path
164
+ autoload_path = nil
165
+ end
166
+ middleware_mutex do
167
+ @middleware_autoload_path = autoload_path if autoload_path
168
+ (@registered_middleware ||= {}).update(mapping)
169
+ end
170
+ end
164
171
 
165
- require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
172
+ # Public: Lookup middleware class with a registered Symbol shortcut.
173
+ #
174
+ # key - The Symbol key for the registered middleware.
175
+ #
176
+ # Examples
177
+ #
178
+ # module Faraday
179
+ # class Whatever
180
+ # register_middleware :foo => Foo
181
+ # end
182
+ # end
183
+ #
184
+ # Faraday::Whatever.lookup_middleware(:foo)
185
+ # # => Faraday::Whatever::Foo
186
+ #
187
+ # Returns a middleware Class.
188
+ def lookup_middleware(key)
189
+ load_middleware(key) ||
190
+ raise(Faraday::Error.new("#{key.inspect} is not registered on #{self}"))
191
+ end
192
+
193
+ def middleware_mutex(&block)
194
+ @middleware_mutex ||= begin
195
+ require 'monitor'
196
+ Monitor.new
197
+ end
198
+ @middleware_mutex.synchronize(&block)
199
+ end
200
+
201
+ def fetch_middleware(key)
202
+ defined?(@registered_middleware) && @registered_middleware[key]
203
+ end
204
+
205
+ def load_middleware(key)
206
+ value = fetch_middleware(key)
207
+ case value
208
+ when Module
209
+ value
210
+ when Symbol, String
211
+ middleware_mutex do
212
+ @registered_middleware[key] = const_get(value)
213
+ end
214
+ when Proc
215
+ middleware_mutex do
216
+ @registered_middleware[key] = value.call
217
+ end
218
+ when Array
219
+ middleware_mutex do
220
+ const, path = value
221
+ if root = @middleware_autoload_path
222
+ path = "#{root}/#{path}"
223
+ end
224
+ require(path)
225
+ @registered_middleware[key] = const
226
+ end
227
+ load_middleware(key)
228
+ end
229
+ end
230
+ end
231
+
232
+ def self.const_missing(name)
233
+ if name.to_sym == :Builder
234
+ warn "Faraday::Builder is now Faraday::RackBuilder."
235
+ const_set name, RackBuilder
236
+ else
237
+ super
238
+ end
239
+ end
240
+
241
+ require_libs "utils", "options", "connection", "rack_builder", "parameters",
242
+ "middleware", "adapter", "request", "response", "upload_io", "error"
243
+
244
+ if !ENV["FARADAY_NO_AUTOLOAD"]
245
+ require_lib 'autoload'
246
+ end
166
247
  end
@@ -1,54 +1,43 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Faraday
4
- # Base class for all Faraday adapters. Adapters are
2
+ # Public: This is a base class for all Faraday adapters. Adapters are
5
3
  # responsible for fulfilling a Faraday request.
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
- net_http: [:NetHttp, 'net_http'],
15
- net_http_persistent: [
16
- :NetHttpPersistent,
17
- 'net_http_persistent'
18
- ],
19
- typhoeus: [:Typhoeus, 'typhoeus'],
20
- patron: [:Patron, 'patron'],
21
- em_synchrony: [:EMSynchrony, 'em_synchrony'],
22
- em_http: [:EMHttp, 'em_http'],
23
- excon: [:Excon, 'excon'],
24
- rack: [:Rack, 'rack'],
25
- httpclient: [:HTTPClient, 'httpclient']
26
-
27
- # This module marks an Adapter as supporting parallel requests.
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.
28
20
  module Parallelism
29
21
  attr_writer :supports_parallel
30
- def supports_parallel?
31
- @supports_parallel
32
- end
22
+ def supports_parallel?() @supports_parallel end
33
23
 
34
24
  def inherited(subclass)
35
25
  super
36
- subclass.supports_parallel = supports_parallel?
26
+ subclass.supports_parallel = self.supports_parallel?
37
27
  end
38
28
  end
39
29
 
40
30
  extend Parallelism
41
31
  self.supports_parallel = false
42
32
 
43
- def initialize(_app = nil, opts = {}, &block)
44
- @app = ->(env) { env.response }
33
+ def initialize(app = nil, opts = {}, &block)
34
+ super(app)
45
35
  @connection_options = opts
46
36
  @config_block = block
47
37
  end
48
38
 
49
39
  def call(env)
50
40
  env.clear_body if env.needs_body?
51
- env.response = Response.new
52
41
  end
53
42
 
54
43
  private
@@ -56,14 +45,11 @@ module Faraday
56
45
  def save_response(env, status, body, headers = nil, reason_phrase = nil)
57
46
  env.status = status
58
47
  env.body = body
59
- env.reason_phrase = reason_phrase&.to_s&.strip
48
+ env.reason_phrase = reason_phrase && reason_phrase.to_s.strip
60
49
  env.response_headers = Utils::Headers.new.tap do |response_headers|
61
50
  response_headers.update headers unless headers.nil?
62
51
  yield(response_headers) if block_given?
63
52
  end
64
-
65
- env.response.finish(env) unless env.parallel?
66
- env.response
67
53
  end
68
54
  end
69
55
  end
@@ -1,15 +1,10 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Faraday
4
2
  class Adapter
5
- # EventMachine adapter. This adapter is useful for either asynchronous
6
- # requests when in an EM reactor loop, or for making parallel requests in
3
+ # EventMachine adapter is useful for either asynchronous requests
4
+ # when in EM reactor loop or for making parallel requests in
7
5
  # synchronous code.
8
6
  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.
11
7
  module Options
12
- # @return [Hash]
13
8
  def connection_config(env)
14
9
  options = {}
15
10
  configure_proxy(options, env)
@@ -21,10 +16,10 @@ module Faraday
21
16
 
22
17
  def request_config(env)
23
18
  options = {
24
- body: read_body(env),
25
- head: env[:request_headers]
26
- # keepalive: true,
27
- # file: 'path/to/file', # stream data off disk
19
+ :body => read_body(env),
20
+ :head => env[:request_headers],
21
+ # :keepalive => true,
22
+ # :file => 'path/to/file', # stream data off disk
28
23
  }
29
24
  configure_compression(options, env)
30
25
  options
@@ -35,53 +30,44 @@ module Faraday
35
30
  body.respond_to?(:read) ? body.read : body
36
31
  end
37
32
 
38
- # Reads out proxy settings from env into options
39
33
  def configure_proxy(options, env)
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
- }
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
48
41
  end
49
42
 
50
- # Reads out host and port settings from env into options
51
43
  def configure_socket(options, env)
52
- bind = request_options(env)[:bind]
53
- return unless bind
54
-
55
- options[:bind] = {
56
- host: bind[:host],
57
- port: bind[:port]
58
- }
44
+ if bind = request_options(env)[:bind]
45
+ options[:bind] = {
46
+ :host => bind[:host],
47
+ :port => bind[:port]
48
+ }
49
+ end
59
50
  end
60
51
 
61
- # Reads out SSL certificate settings from env into options
62
52
  def configure_ssl(options, env)
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
- }
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
69
59
  end
70
60
 
71
- # Reads out timeout settings from env into options
72
61
  def configure_timeout(options, env)
73
- timeout, open_timeout = request_options(env)
74
- .values_at(:timeout, :open_timeout)
62
+ timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout)
75
63
  options[:connect_timeout] = options[:inactivity_timeout] = timeout
76
64
  options[:connect_timeout] = open_timeout if open_timeout
77
65
  end
78
66
 
79
- # Reads out compression header settings from env into options
80
67
  def configure_compression(options, env)
81
- return unless (env[:method] == :get) &&
82
- !options[:head].key?('accept-encoding')
83
-
84
- options[:head]['accept-encoding'] = 'gzip, compressed'
68
+ if env[:method] == :get and not options[:head].key? 'accept-encoding'
69
+ options[:head]['accept-encoding'] = 'gzip, compressed'
70
+ end
85
71
  end
86
72
 
87
73
  def request_options(env)
@@ -95,8 +81,7 @@ module Faraday
95
81
 
96
82
  self.supports_parallel = true
97
83
 
98
- # @return [Manager]
99
- def self.setup_parallel_manager(_options = nil)
84
+ def self.setup_parallel_manager(options = nil)
100
85
  Manager.new
101
86
  end
102
87
 
@@ -109,113 +94,95 @@ module Faraday
109
94
  def perform_request(env)
110
95
  if parallel?(env)
111
96
  manager = env[:parallel_manager]
112
- manager.add do
113
- perform_single_request(env)
114
- .callback { env[:response].finish(env) }
115
- end
116
- elsif EventMachine.reactor_running?
117
- # EM is running: instruct upstream that this is an async request
118
- env[:parallel_manager] = true
119
- perform_single_request(env)
120
- .callback { env[:response].finish(env) }
121
- .errback do
122
- # TODO: no way to communicate the error in async mode
123
- raise NotImplementedError
124
- end
97
+ manager.add {
98
+ perform_single_request(env).
99
+ callback { env[:response].finish(env) }
100
+ }
125
101
  else
126
- error = nil
127
- # start EM, block until request is completed
128
- EventMachine.run do
129
- perform_single_request(env)
130
- .callback { EventMachine.stop }
131
- .errback do |client|
132
- error = error_message(client)
133
- EventMachine.stop
134
- end
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
+ }
112
+ 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
+ }
135
123
  end
136
- raise_error(error) if error
137
124
  end
138
- rescue EventMachine::Connectify::CONNECTError => e
139
- if e.message.include?('Proxy Authentication Required')
140
- raise Faraday::ConnectionFailed,
141
- %(407 "Proxy Authentication Required ")
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
142
130
  end
143
-
144
- raise Faraday::ConnectionFailed, e
145
- rescue StandardError => e
146
- if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError)
147
- raise Faraday::SSLError, e
131
+ rescue => err
132
+ if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
133
+ raise Faraday::SSLError, err
134
+ else
135
+ raise
148
136
  end
149
-
150
- raise
151
137
  end
152
138
 
153
139
  # TODO: reuse the connection to support pipelining
154
140
  def perform_single_request(env)
155
141
  req = create_request(env)
156
- req = req.setup_request(env[:method], request_config(env))
157
- req.callback do |client|
158
- if env[:request].stream_response?
159
- warn "Streaming downloads for #{self.class.name} " \
160
- 'are not yet implemented.'
161
- env[:request].on_data.call(
162
- client.response,
163
- client.response.bytesize
164
- )
165
- end
142
+ req.setup_request(env[:method], request_config(env)).callback { |client|
166
143
  status = client.response_header.status
167
144
  reason = client.response_header.http_reason
168
- save_response(env, status, client.response, nil, reason) do |headers|
145
+ save_response(env, status, client.response, nil, reason) do |resp_headers|
169
146
  client.response_header.each do |name, value|
170
- headers[name.to_sym] = value
147
+ resp_headers[name.to_sym] = value
171
148
  end
172
149
  end
173
- end
150
+ }
174
151
  end
175
152
 
176
153
  def create_request(env)
177
- EventMachine::HttpRequest.new(
178
- env[:url], connection_config(env).merge(@connection_options)
179
- )
154
+ EventMachine::HttpRequest.new(env[:url], connection_config(env).merge(@connection_options))
180
155
  end
181
156
 
182
157
  def error_message(client)
183
- client.error || 'request failed'
158
+ client.error or "request failed"
184
159
  end
185
160
 
186
161
  def raise_error(msg)
187
- error_class = Faraday::ClientError
188
- if timeout_message?(msg)
189
- error_class = Faraday::TimeoutError
190
- msg = 'request timed out'
162
+ errklass = Faraday::ClientError
163
+ if msg == Errno::ETIMEDOUT
164
+ errklass = Faraday::TimeoutError
165
+ msg = "request timed out"
191
166
  elsif msg == Errno::ECONNREFUSED
192
- error_class = Faraday::ConnectionFailed
193
- msg = 'connection refused'
194
- elsif msg == 'connection closed by server'
195
- error_class = Faraday::ConnectionFailed
167
+ errklass = Faraday::ConnectionFailed
168
+ msg = "connection refused"
169
+ elsif msg == "connection closed by server"
170
+ errklass = Faraday::ConnectionFailed
196
171
  end
197
- raise error_class, msg
172
+ raise errklass, msg
198
173
  end
199
174
 
200
- def timeout_message?(msg)
201
- msg == Errno::ETIMEDOUT ||
202
- (msg.is_a?(String) && msg.include?('timeout error'))
203
- end
204
-
205
- # @return [Boolean]
206
175
  def parallel?(env)
207
176
  !!env[:parallel_manager]
208
177
  end
209
178
 
210
- # This parallel manager is designed to start an EventMachine loop
179
+ # The parallel manager is designed to start an EventMachine loop
211
180
  # and block until all registered requests have been completed.
212
181
  class Manager
213
- # @see reset
214
182
  def initialize
215
183
  reset
216
184
  end
217
185
 
218
- # Re-initializes instance variables
219
186
  def reset
220
187
  @registered_procs = []
221
188
  @num_registered = 0
@@ -224,10 +191,7 @@ module Faraday
224
191
  @running = false
225
192
  end
226
193
 
227
- # @return [Boolean]
228
- def running?
229
- @running
230
- end
194
+ def running?() @running end
231
195
 
232
196
  def add(&block)
233
197
  if running?
@@ -239,15 +203,15 @@ module Faraday
239
203
  end
240
204
 
241
205
  def run
242
- if @num_registered.positive?
206
+ if @num_registered > 0
243
207
  @running = true
244
208
  EventMachine.run do
245
209
  @registered_procs.each do |proc|
246
210
  perform_request(&proc)
247
211
  end
248
212
  end
249
- unless @errors.empty?
250
- raise Faraday::ClientError, @errors.first || 'connection failed'
213
+ if @errors.size > 0
214
+ raise Faraday::ClientError, @errors.first || "connection failed"
251
215
  end
252
216
  end
253
217
  ensure
@@ -256,31 +220,24 @@ module Faraday
256
220
 
257
221
  def perform_request
258
222
  client = yield
259
- client.callback do
260
- @num_succeeded += 1
261
- check_finished
262
- end
263
- client.errback do
264
- @errors << client.error
265
- check_finished
266
- end
223
+ client.callback { @num_succeeded += 1; check_finished }
224
+ client.errback { @errors << client.error; check_finished }
267
225
  end
268
226
 
269
227
  def check_finished
270
- EventMachine.stop if @num_succeeded + @errors.size == @num_registered
228
+ if @num_succeeded + @errors.size == @num_registered
229
+ EventMachine.stop
230
+ end
271
231
  end
272
232
  end
273
233
  end
274
234
  end
275
235
  end
276
236
 
277
- if Faraday::Adapter::EMHttp.loaded?
278
- begin
279
- require 'openssl'
280
- rescue LoadError
281
- warn 'Warning: no such file to load -- openssl. ' \
282
- 'Make sure it is installed if you want HTTPS support'
283
- else
284
- require 'faraday/adapter/em_http_ssl_patch'
285
- end
286
- end
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?