faraday 1.3.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9d5c03389960019760f7f65d5546b799c93d2fcc810ed26c3c6a859a0716586
4
- data.tar.gz: faf33941683ee46c907dad01243f5be4ca60fe46336bbfcf9e534afa7bfc74e3
3
+ metadata.gz: 84198a1e84bf10f350bad8dea5ebd4a866a9dff523d7b84ccad92ef9cb32b366
4
+ data.tar.gz: b4d0537c7d4b5a8fba689bd84167246560cf8e2fd9ba492ab6e00b7d1e6f4f40
5
5
  SHA512:
6
- metadata.gz: 67bea3c978d5e531a47513b81f56f144ccd696ee0adf67ea14b2198ed29ea809cf0dd1223c400feef67688af10db8b9a8abd239cb284c111300a420190aef9a4
7
- data.tar.gz: a520bc7078beb472b43f963921040230ab29d14b7df138a85bc3fce77f1cbfc5c74f2d41a380ad9821b7d0cffa9f3d3c03448a258ecaa7c6dfbb993df02ac3e9
6
+ metadata.gz: a6e2b78cfe4ed8c203d87426cf4e2c1a1f1811550f1deeef3fdad7b691ea29a7a23f62b3460b5e701585b1375c4321e573e7f2ac2fd6834eba0b63772a36c858
7
+ data.tar.gz: 75e1d9a707a37fd042d599959e62d2b4b679aa66e9194e2199295d6a190acd0a9dc366690c45a60cfb4aa6aa67b6bea7757fd40cb58d2560fe87f8de67271430
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/faraday.svg)](https://rubygems.org/gems/faraday)
4
4
  [![GitHub Actions CI](https://github.com/lostisland/faraday/workflows/CI/badge.svg)](https://github.com/lostisland/faraday/actions?query=workflow%3ACI)
5
- [![Maintainability](https://api.codeclimate.com/v1/badges/f869daab091ceef1da73/maintainability)](https://codeclimate.com/github/lostisland/faraday/maintainability)
6
5
  [![Gitter](https://badges.gitter.im/lostisland/faraday.svg)](https://gitter.im/lostisland/faraday?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
7
6
 
8
7
 
data/lib/faraday.rb CHANGED
@@ -27,7 +27,13 @@ require 'faraday/error'
27
27
  require 'faraday/file_part'
28
28
  require 'faraday/param_part'
29
29
 
30
+ require 'faraday/em_http'
31
+ require 'faraday/em_synchrony'
32
+ require 'faraday/excon'
33
+ require 'faraday/httpclient'
30
34
  require 'faraday/net_http'
35
+ require 'faraday/net_http_persistent'
36
+ require 'faraday/patron'
31
37
 
32
38
  # This is the main namespace for Faraday.
33
39
  #
@@ -11,17 +11,8 @@ module Faraday
11
11
 
12
12
  register_middleware File.expand_path('adapter', __dir__),
13
13
  test: [:Test, 'test'],
14
- net_http_persistent: [
15
- :NetHttpPersistent,
16
- 'net_http_persistent'
17
- ],
18
14
  typhoeus: [:Typhoeus, 'typhoeus'],
19
- patron: [:Patron, 'patron'],
20
- em_synchrony: [:EMSynchrony, 'em_synchrony'],
21
- em_http: [:EMHttp, 'em_http'],
22
- excon: [:Excon, 'excon'],
23
- rack: [:Rack, 'rack'],
24
- httpclient: [:HTTPClient, 'httpclient']
15
+ rack: [:Rack, 'rack']
25
16
 
26
17
  # This module marks an Adapter as supporting parallel requests.
27
18
  module Parallelism
@@ -58,15 +58,9 @@ module Faraday
58
58
  class Adapter
59
59
  extend AutoloadHelper
60
60
  autoload_all 'faraday/adapter',
61
- NetHttpPersistent: 'net_http_persistent',
62
- EMSynchrony: 'em_synchrony',
63
- EMHttp: 'em_http',
64
61
  Typhoeus: 'typhoeus',
65
- Patron: 'patron',
66
- Excon: 'excon',
67
62
  Test: 'test',
68
- Rack: 'rack',
69
- HTTPClient: 'httpclient'
63
+ Rack: 'rack'
70
64
  end
71
65
 
72
66
  # Request represents a single HTTP request for a Faraday adapter to make.
@@ -73,6 +73,7 @@ module Faraday
73
73
  @options = options.request
74
74
  @ssl = options.ssl
75
75
  @default_parallel_manager = options.parallel_manager
76
+ @manual_proxy = nil
76
77
 
77
78
  @builder = options.builder || begin
78
79
  # pass an empty block to Builder so it doesn't assume default middleware
@@ -419,6 +420,8 @@ module Faraday
419
420
  basic_auth user, password
420
421
  uri.user = uri.password = nil
421
422
  end
423
+
424
+ @proxy = proxy_from_env(url) unless @manual_proxy
422
425
  end
423
426
 
424
427
  # Sets the path prefix and ensures that it always has a leading
@@ -517,9 +520,8 @@ module Faraday
517
520
  # @return [URI]
518
521
  def build_exclusive_url(url = nil, params = nil, params_encoder = nil)
519
522
  url = nil if url.respond_to?(:empty?) && url.empty?
520
- base = url_prefix
523
+ base = url_prefix.dup
521
524
  if url && base.path && base.path !~ %r{/$}
522
- base = base.dup
523
525
  base.path = "#{base.path}/" # ensure trailing slash
524
526
  end
525
527
  url = url && URI.parse(url.to_s).opaque ? url.to_s.gsub(':', '%3A') : url
@@ -577,7 +579,11 @@ module Faraday
577
579
  case url
578
580
  when String
579
581
  uri = Utils.URI(url)
580
- uri = URI.parse("#{uri.scheme}://#{uri.host}").find_proxy
582
+ uri = if uri.host.nil?
583
+ find_default_proxy
584
+ else
585
+ URI.parse("#{uri.scheme}://#{uri.host}").find_proxy
586
+ end
581
587
  when URI
582
588
  uri = url.find_proxy
583
589
  when nil
@@ -11,6 +11,9 @@ module Faraday
11
11
  def self.from(value)
12
12
  case value
13
13
  when String
14
+ # URIs without a scheme should default to http (like 'example:123').
15
+ # This fixes #1282 and prevents a silent failure in some adapters.
16
+ value = "http://#{value}" unless value.include?('://')
14
17
  value = { uri: Utils.URI(value) }
15
18
  when URI
16
19
  value = { uri: value }
@@ -19,6 +22,7 @@ module Faraday
19
22
  value[:uri] = Utils.URI(uri)
20
23
  end
21
24
  end
25
+
22
26
  super(value)
23
27
  end
24
28
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Faraday
4
- VERSION = '1.3.1'
4
+ VERSION = '1.5.0'
5
5
  end
@@ -253,6 +253,13 @@ RSpec.describe Faraday::Connection do
253
253
  expect(uri.path).to eq('/sake.html')
254
254
  end
255
255
 
256
+ it 'always returns new URI instance' do
257
+ conn.url_prefix = 'http://sushi.com'
258
+ uri1 = conn.build_exclusive_url(nil)
259
+ uri2 = conn.build_exclusive_url(nil)
260
+ expect(uri1).not_to equal(uri2)
261
+ end
262
+
256
263
  context 'with url_prefixed connection' do
257
264
  let(:url) { 'http://sushi.com/sushi/' }
258
265
 
@@ -442,6 +449,14 @@ RSpec.describe Faraday::Connection do
442
449
  end
443
450
  end
444
451
 
452
+ it 'allows when url in no proxy list with url_prefix' do
453
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
454
+ conn = Faraday::Connection.new
455
+ conn.url_prefix = 'http://example.com'
456
+ expect(conn.proxy).to be_nil
457
+ end
458
+ end
459
+
445
460
  it 'allows when prefixed url is not in no proxy list' do
446
461
  with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
447
462
  conn = Faraday::Connection.new('http://prefixedexample.com')
@@ -14,6 +14,13 @@ RSpec.describe Faraday::ProxyOptions do
14
14
  expect(options.inspect).to match('#<Faraday::ProxyOptions uri=')
15
15
  end
16
16
 
17
+ it 'defaults to http' do
18
+ options = Faraday::ProxyOptions.from 'example.org'
19
+ expect(options.port).to eq(80)
20
+ expect(options.host).to eq('example.org')
21
+ expect(options.scheme).to eq('http')
22
+ end
23
+
17
24
  it 'works with nil' do
18
25
  options = Faraday::ProxyOptions.from nil
19
26
  expect(options).to be_a_kind_of(Faraday::ProxyOptions)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "@technoweenie"
@@ -10,8 +10,64 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-04-16 00:00:00.000000000 Z
13
+ date: 2021-07-04 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: faraday-em_http
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: faraday-em_synchrony
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: faraday-excon
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.1'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.1'
57
+ - !ruby/object:Gem::Dependency
58
+ name: faraday-httpclient
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: 1.0.1
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: 1.0.1
15
71
  - !ruby/object:Gem::Dependency
16
72
  name: faraday-net_http
17
73
  requirement: !ruby/object:Gem::Requirement
@@ -26,6 +82,34 @@ dependencies:
26
82
  - - "~>"
27
83
  - !ruby/object:Gem::Version
28
84
  version: '1.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: faraday-net_http_persistent
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '1.1'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '1.1'
99
+ - !ruby/object:Gem::Dependency
100
+ name: faraday-patron
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '1.0'
106
+ type: :runtime
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '1.0'
29
113
  - !ruby/object:Gem::Dependency
30
114
  name: multipart-post
31
115
  requirement: !ruby/object:Gem::Requirement
@@ -74,14 +158,6 @@ files:
74
158
  - examples/client_test.rb
75
159
  - lib/faraday.rb
76
160
  - lib/faraday/adapter.rb
77
- - lib/faraday/adapter/em_http.rb
78
- - lib/faraday/adapter/em_http_ssl_patch.rb
79
- - lib/faraday/adapter/em_synchrony.rb
80
- - lib/faraday/adapter/em_synchrony/parallel_manager.rb
81
- - lib/faraday/adapter/excon.rb
82
- - lib/faraday/adapter/httpclient.rb
83
- - lib/faraday/adapter/net_http_persistent.rb
84
- - lib/faraday/adapter/patron.rb
85
161
  - lib/faraday/adapter/rack.rb
86
162
  - lib/faraday/adapter/test.rb
87
163
  - lib/faraday/adapter/typhoeus.rb
@@ -126,7 +202,6 @@ files:
126
202
  - spec/faraday/adapter/em_synchrony_spec.rb
127
203
  - spec/faraday/adapter/excon_spec.rb
128
204
  - spec/faraday/adapter/httpclient_spec.rb
129
- - spec/faraday/adapter/net_http_persistent_spec.rb
130
205
  - spec/faraday/adapter/net_http_spec.rb
131
206
  - spec/faraday/adapter/patron_spec.rb
132
207
  - spec/faraday/adapter/rack_spec.rb
@@ -172,7 +247,7 @@ licenses:
172
247
  - MIT
173
248
  metadata:
174
249
  homepage_uri: https://lostisland.github.io/faraday
175
- changelog_uri: https://github.com/lostisland/faraday/releases/tag/v1.3.1
250
+ changelog_uri: https://github.com/lostisland/faraday/releases/tag/v1.5.0
176
251
  source_code_uri: https://github.com/lostisland/faraday
177
252
  bug_tracker_uri: https://github.com/lostisland/faraday/issues
178
253
  post_install_message:
@@ -1,289 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Faraday
4
- 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
7
- # synchronous code.
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.
11
- module Options
12
- # @return [Hash]
13
- def connection_config(env)
14
- options = {}
15
- configure_proxy(options, env)
16
- configure_timeout(options, env)
17
- configure_socket(options, env)
18
- configure_ssl(options, env)
19
- options
20
- end
21
-
22
- def request_config(env)
23
- options = {
24
- body: read_body(env),
25
- head: env[:request_headers]
26
- # keepalive: true,
27
- # file: 'path/to/file', # stream data off disk
28
- }
29
- configure_compression(options, env)
30
- options
31
- end
32
-
33
- def read_body(env)
34
- body = env[:body]
35
- body.respond_to?(:read) ? body.read : body
36
- end
37
-
38
- # Reads out proxy settings from env into options
39
- 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
- }
48
- end
49
-
50
- # Reads out host and port settings from env into options
51
- 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
- }
59
- end
60
-
61
- # Reads out SSL certificate settings from env into options
62
- 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
- }
69
- end
70
-
71
- # Reads out timeout settings from env into options
72
- def configure_timeout(options, env)
73
- req = request_options(env)
74
- options[:inactivity_timeout] = request_timeout(:read, req)
75
- options[:connect_timeout] = request_timeout(:open, req)
76
- end
77
-
78
- # Reads out compression header settings from env into options
79
- def configure_compression(options, env)
80
- return unless (env[:method] == :get) &&
81
- !options[:head].key?('accept-encoding')
82
-
83
- options[:head]['accept-encoding'] = 'gzip, compressed'
84
- end
85
-
86
- def request_options(env)
87
- env[:request]
88
- end
89
- end
90
-
91
- include Options
92
-
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
108
-
109
- self.supports_parallel = true
110
-
111
- # @return [Manager]
112
- def self.setup_parallel_manager(_options = nil)
113
- Manager.new
114
- end
115
-
116
- def call(env)
117
- super
118
- perform_request env
119
- @app.call env
120
- end
121
-
122
- def perform_request(env)
123
- if parallel?(env)
124
- manager = env[:parallel_manager]
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
137
- end
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
148
- end
149
- raise_error(error) if error
150
- end
151
- rescue EventMachine::Connectify::CONNECTError => e
152
- if e.message.include?('Proxy Authentication Required')
153
- raise Faraday::ConnectionFailed,
154
- %(407 "Proxy Authentication Required ")
155
- end
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
162
- end
163
-
164
- raise
165
- end
166
-
167
- # TODO: reuse the connection to support pipelining
168
- def perform_single_request(env)
169
- req = create_request(env)
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
180
- status = client.response_header.status
181
- reason = client.response_header.http_reason
182
- save_response(env, status, client.response, nil, reason) do |headers|
183
- client.response_header.each do |name, value|
184
- headers[name.to_sym] = value
185
- end
186
- end
187
- end
188
- end
189
-
190
- def create_request(env)
191
- EventMachine::HttpRequest.new(
192
- env[:url], connection_config(env).merge(@connection_options)
193
- )
194
- end
195
-
196
- def error_message(client)
197
- client.error || 'request failed'
198
- end
199
-
200
- def raise_error(msg)
201
- error_class = Faraday::ClientError
202
- if timeout_message?(msg)
203
- error_class = Faraday::TimeoutError
204
- msg = 'request timed out'
205
- elsif msg == Errno::ECONNREFUSED
206
- error_class = Faraday::ConnectionFailed
207
- msg = 'connection refused'
208
- elsif msg == 'connection closed by server'
209
- error_class = Faraday::ConnectionFailed
210
- end
211
- raise error_class, msg
212
- end
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]
220
- def parallel?(env)
221
- !!env[:parallel_manager]
222
- end
223
-
224
- # This parallel manager is designed to start an EventMachine loop
225
- # and block until all registered requests have been completed.
226
- class Manager
227
- # @see reset
228
- def initialize
229
- reset
230
- end
231
-
232
- # Re-initializes instance variables
233
- def reset
234
- @registered_procs = []
235
- @num_registered = 0
236
- @num_succeeded = 0
237
- @errors = []
238
- @running = false
239
- end
240
-
241
- # @return [Boolean]
242
- def running?
243
- @running
244
- end
245
-
246
- def add(&block)
247
- if running?
248
- perform_request(&block)
249
- else
250
- @registered_procs << block
251
- end
252
- @num_registered += 1
253
- end
254
-
255
- def run
256
- if @num_registered.positive?
257
- @running = true
258
- EventMachine.run do
259
- @registered_procs.each do |proc|
260
- perform_request(&proc)
261
- end
262
- end
263
- unless @errors.empty?
264
- raise Faraday::ClientError, @errors.first || 'connection failed'
265
- end
266
- end
267
- ensure
268
- reset
269
- end
270
-
271
- def perform_request
272
- client = yield
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
281
- end
282
-
283
- def check_finished
284
- EventMachine.stop if @num_succeeded + @errors.size == @num_registered
285
- end
286
- end
287
- end
288
- end
289
- end