faraday 2.3.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.md +1 -1
- data/README.md +1 -1
- data/examples/client_spec.rb +22 -0
- data/examples/client_test.rb +26 -0
- data/lib/faraday/adapter/test.rb +27 -1
- data/lib/faraday/adapter.rb +2 -2
- data/lib/faraday/options/env.rb +18 -0
- data/lib/faraday/options/ssl_options.rb +11 -1
- data/lib/faraday/version.rb +1 -1
- data/spec/faraday/adapter/test_spec.rb +36 -0
- data/spec/faraday/connection_spec.rb +6 -0
- data/spec/faraday/options/env_spec.rb +6 -0
- data/spec/faraday/request_spec.rb +1 -0
- data/spec/faraday/utils_spec.rb +2 -1
- data/spec/support/shared_examples/adapter.rb +1 -0
- data/spec/support/shared_examples/request_method.rb +17 -3
- metadata +11 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 503ea26e785d93ce2e71fa46a1be6deea7c562d96659401b99e4ada7527e7f9b
|
|
4
|
+
data.tar.gz: 37f707014c1dafb00caf9856c0f5a4386f0f7826e1809e2a6fe03221fca9f936
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 37b3abd53741e0bfb8f92636983c152460dee4790d8ac943ddc8fc81b076da115c2d20622ee190b3489101fce497bf628261ba7684e4163d23fe7e0894d5c407
|
|
7
|
+
data.tar.gz: 40d69fe13ea02495810d3a968681a668f22b5e6790d3d7a98a59e44decff2ad370f3230c59fc5c30e6aa3f150260d7409c995b5ba1ca2413c36a3ce661f82636
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
|
@@ -42,7 +42,7 @@ Open the issues page and check for the `help wanted` label!
|
|
|
42
42
|
But before you start coding, please read our [Contributing Guide][contributing]
|
|
43
43
|
|
|
44
44
|
## Copyright
|
|
45
|
-
© 2009 -
|
|
45
|
+
© 2009 - 2022, the [Faraday Team][faraday_team]. Website and branding design by [Elena Lo Piccolo](https://elelopic.design).
|
|
46
46
|
|
|
47
47
|
[awesome]: https://github.com/lostisland/awesome-faraday/#adapters
|
|
48
48
|
[website]: https://lostisland.github.io/faraday
|
data/examples/client_spec.rb
CHANGED
|
@@ -17,6 +17,11 @@ class Client
|
|
|
17
17
|
data = JSON.parse(res.body)
|
|
18
18
|
data['origin']
|
|
19
19
|
end
|
|
20
|
+
|
|
21
|
+
def foo(params)
|
|
22
|
+
res = @conn.post('/foo', JSON.dump(params))
|
|
23
|
+
res.status
|
|
24
|
+
end
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
RSpec.describe Client do
|
|
@@ -94,4 +99,21 @@ RSpec.describe Client do
|
|
|
94
99
|
stubs.verify_stubbed_calls
|
|
95
100
|
end
|
|
96
101
|
end
|
|
102
|
+
|
|
103
|
+
context 'When you want to test the body, you can use a proc as well as string' do
|
|
104
|
+
it 'tests with a string' do
|
|
105
|
+
stubs.post('/foo', '{"name":"YK"}') { [200, {}, ''] }
|
|
106
|
+
|
|
107
|
+
expect(client.foo(name: 'YK')).to eq 200
|
|
108
|
+
stubs.verify_stubbed_calls
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'tests with a proc' do
|
|
112
|
+
check = ->(request_body) { JSON.parse(request_body).slice('name') == { 'name' => 'YK' } }
|
|
113
|
+
stubs.post('/foo', check) { [200, {}, ''] }
|
|
114
|
+
|
|
115
|
+
expect(client.foo(name: 'YK', created_at: Time.now)).to eq 200
|
|
116
|
+
stubs.verify_stubbed_calls
|
|
117
|
+
end
|
|
118
|
+
end
|
|
97
119
|
end
|
data/examples/client_test.rb
CHANGED
|
@@ -18,6 +18,11 @@ class Client
|
|
|
18
18
|
data = JSON.parse(res.body)
|
|
19
19
|
data['origin']
|
|
20
20
|
end
|
|
21
|
+
|
|
22
|
+
def foo(params)
|
|
23
|
+
res = @conn.post('/foo', JSON.dump(params))
|
|
24
|
+
res.status
|
|
25
|
+
end
|
|
21
26
|
end
|
|
22
27
|
|
|
23
28
|
# Example API client test
|
|
@@ -109,6 +114,27 @@ class ClientTest < Test::Unit::TestCase
|
|
|
109
114
|
stubs.verify_stubbed_calls
|
|
110
115
|
end
|
|
111
116
|
|
|
117
|
+
def test_with_string_body
|
|
118
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
|
119
|
+
stub.post('/foo', '{"name":"YK"}') { [200, {}, ''] }
|
|
120
|
+
end
|
|
121
|
+
cli = client(stubs)
|
|
122
|
+
assert_equal 200, cli.foo(name: 'YK')
|
|
123
|
+
|
|
124
|
+
stubs.verify_stubbed_calls
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def test_with_proc_body
|
|
128
|
+
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
|
129
|
+
check = ->(request_body) { JSON.parse(request_body).slice('name') == { 'name' => 'YK' } }
|
|
130
|
+
stub.post('/foo', check) { [200, {}, ''] }
|
|
131
|
+
end
|
|
132
|
+
cli = client(stubs)
|
|
133
|
+
assert_equal 200, cli.foo(name: 'YK', created_at: Time.now)
|
|
134
|
+
|
|
135
|
+
stubs.verify_stubbed_calls
|
|
136
|
+
end
|
|
137
|
+
|
|
112
138
|
def client(stubs)
|
|
113
139
|
conn = Faraday.new do |builder|
|
|
114
140
|
builder.adapter :test, stubs
|
data/lib/faraday/adapter/test.rb
CHANGED
|
@@ -26,6 +26,15 @@ module Faraday
|
|
|
26
26
|
# ]
|
|
27
27
|
# end
|
|
28
28
|
#
|
|
29
|
+
# # Test the request body is the same as the stubbed body
|
|
30
|
+
# stub.post('/bar', 'name=YK&word=call') { [200, {}, ''] }
|
|
31
|
+
#
|
|
32
|
+
# # You can pass a proc as a stubbed body and check the request body in your way.
|
|
33
|
+
# # In this case, the proc should return true or false.
|
|
34
|
+
# stub.post('/foo', ->(request_body) do
|
|
35
|
+
# JSON.parse(request_body).slice('name') == { 'name' => 'YK' } }) { [200, {}, '']
|
|
36
|
+
# end
|
|
37
|
+
#
|
|
29
38
|
# # You can set strict_mode to exactly match the stubbed requests.
|
|
30
39
|
# stub.strict_mode = true
|
|
31
40
|
# end
|
|
@@ -42,6 +51,12 @@ module Faraday
|
|
|
42
51
|
#
|
|
43
52
|
# resp = test.get '/items/2'
|
|
44
53
|
# resp.body # => 'showing item: 2'
|
|
54
|
+
#
|
|
55
|
+
# resp = test.post '/bar', 'name=YK&word=call'
|
|
56
|
+
# resp.status # => 200
|
|
57
|
+
#
|
|
58
|
+
# resp = test.post '/foo', JSON.dump(name: 'YK', created_at: Time.now)
|
|
59
|
+
# resp.status # => 200
|
|
45
60
|
class Test < Faraday::Adapter
|
|
46
61
|
attr_accessor :stubs
|
|
47
62
|
|
|
@@ -181,7 +196,7 @@ module Faraday
|
|
|
181
196
|
[(host.nil? || host == request_host) &&
|
|
182
197
|
path_match?(request_path, meta) &&
|
|
183
198
|
params_match?(env) &&
|
|
184
|
-
(
|
|
199
|
+
body_match?(request_body) &&
|
|
185
200
|
headers_match?(request_headers), meta]
|
|
186
201
|
end
|
|
187
202
|
|
|
@@ -222,6 +237,17 @@ module Faraday
|
|
|
222
237
|
end
|
|
223
238
|
end
|
|
224
239
|
|
|
240
|
+
def body_match?(request_body)
|
|
241
|
+
return true if body.to_s.size.zero?
|
|
242
|
+
|
|
243
|
+
case body
|
|
244
|
+
when Proc
|
|
245
|
+
body.call(request_body)
|
|
246
|
+
else
|
|
247
|
+
request_body == body
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
225
251
|
def to_s
|
|
226
252
|
"#{path} #{body}"
|
|
227
253
|
end
|
data/lib/faraday/adapter.rb
CHANGED
|
@@ -59,7 +59,7 @@ module Faraday
|
|
|
59
59
|
|
|
60
60
|
private
|
|
61
61
|
|
|
62
|
-
def save_response(env, status, body, headers = nil, reason_phrase = nil)
|
|
62
|
+
def save_response(env, status, body, headers = nil, reason_phrase = nil, finished: true)
|
|
63
63
|
env.status = status
|
|
64
64
|
env.body = body
|
|
65
65
|
env.reason_phrase = reason_phrase&.to_s&.strip
|
|
@@ -68,7 +68,7 @@ module Faraday
|
|
|
68
68
|
yield(response_headers) if block_given?
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
env.response.finish(env) unless env.parallel?
|
|
71
|
+
env.response.finish(env) unless env.parallel? || !finished
|
|
72
72
|
env.response
|
|
73
73
|
end
|
|
74
74
|
|
data/lib/faraday/options/env.rb
CHANGED
|
@@ -157,6 +157,24 @@ module Faraday
|
|
|
157
157
|
%(#<#{self.class}#{attrs.join(' ')}>)
|
|
158
158
|
end
|
|
159
159
|
|
|
160
|
+
def stream_response?
|
|
161
|
+
request.stream_response?
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def stream_response(&block)
|
|
165
|
+
size = 0
|
|
166
|
+
yielded = false
|
|
167
|
+
block_result = block.call do |chunk| # rubocop:disable Performance/RedundantBlockCall
|
|
168
|
+
if chunk.bytesize.positive? || size.positive?
|
|
169
|
+
yielded = true
|
|
170
|
+
size += chunk.bytesize
|
|
171
|
+
request.on_data.call(chunk, size, self)
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
request.on_data.call(+'', 0, self) unless yielded
|
|
175
|
+
block_result
|
|
176
|
+
end
|
|
177
|
+
|
|
160
178
|
# @private
|
|
161
179
|
def custom_members
|
|
162
180
|
@custom_members ||= {}
|
|
@@ -6,6 +6,10 @@ module Faraday
|
|
|
6
6
|
# @!attribute verify
|
|
7
7
|
# @return [Boolean] whether to verify SSL certificates or not
|
|
8
8
|
#
|
|
9
|
+
# @!attribute verify_hostname
|
|
10
|
+
# @return [Boolean] whether to enable hostname verification on server certificates
|
|
11
|
+
# during the handshake or not (see https://github.com/ruby/openssl/pull/60)
|
|
12
|
+
#
|
|
9
13
|
# @!attribute ca_file
|
|
10
14
|
# @return [String] CA file
|
|
11
15
|
#
|
|
@@ -41,7 +45,8 @@ module Faraday
|
|
|
41
45
|
#
|
|
42
46
|
# @!attribute max_version
|
|
43
47
|
# @return [String, Symbol] maximum SSL version (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL/SSLContext.html#method-i-max_version-3D)
|
|
44
|
-
class SSLOptions < Options.new(:verify, :
|
|
48
|
+
class SSLOptions < Options.new(:verify, :verify_hostname,
|
|
49
|
+
:ca_file, :ca_path, :verify_mode,
|
|
45
50
|
:cert_store, :client_cert, :client_key,
|
|
46
51
|
:certificate, :private_key, :verify_depth,
|
|
47
52
|
:version, :min_version, :max_version)
|
|
@@ -55,5 +60,10 @@ module Faraday
|
|
|
55
60
|
def disable?
|
|
56
61
|
!verify?
|
|
57
62
|
end
|
|
63
|
+
|
|
64
|
+
# @return [Boolean] true if should verify_hostname
|
|
65
|
+
def verify_hostname?
|
|
66
|
+
verify_hostname != false
|
|
67
|
+
end
|
|
58
68
|
end
|
|
59
69
|
end
|
data/lib/faraday/version.rb
CHANGED
|
@@ -373,5 +373,41 @@ RSpec.describe Faraday::Adapter::Test do
|
|
|
373
373
|
it_behaves_like 'does not raise NotFound even when headers do not satisfy the strict check', '/with_user_agent', { authorization: 'Bearer m_ck', user_agent: 'My Agent' }
|
|
374
374
|
it_behaves_like 'does not raise NotFound even when headers do not satisfy the strict check', '/with_user_agent', { authorization: 'Bearer m_ck', user_agent: 'My Agent', x_special: 'special' }
|
|
375
375
|
end
|
|
376
|
+
|
|
377
|
+
describe 'body_match?' do
|
|
378
|
+
let(:stubs) do
|
|
379
|
+
described_class::Stubs.new do |stubs|
|
|
380
|
+
stubs.post('/no_check') { [200, {}, 'ok'] }
|
|
381
|
+
stubs.post('/with_string', 'abc') { [200, {}, 'ok'] }
|
|
382
|
+
stubs.post(
|
|
383
|
+
'/with_proc',
|
|
384
|
+
->(request_body) { JSON.parse(request_body, symbolize_names: true) == { x: '!', a: [{ m: [{ a: true }], n: 123 }] } },
|
|
385
|
+
{ content_type: 'application/json' }
|
|
386
|
+
) do
|
|
387
|
+
[200, {}, 'ok']
|
|
388
|
+
end
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
context 'when trying without any args for body' do
|
|
393
|
+
subject(:without_body) { connection.post('/no_check') }
|
|
394
|
+
|
|
395
|
+
it { expect(without_body.status).to eq 200 }
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
context 'when trying with string body stubs' do
|
|
399
|
+
subject(:with_string) { connection.post('/with_string', 'abc') }
|
|
400
|
+
|
|
401
|
+
it { expect(with_string.status).to eq 200 }
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
context 'when trying with proc body stubs' do
|
|
405
|
+
subject(:with_proc) do
|
|
406
|
+
connection.post('/with_proc', JSON.dump(a: [{ n: 123, m: [{ a: true }] }], x: '!'), { 'Content-Type' => 'application/json' })
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
it { expect(with_proc.status).to eq 200 }
|
|
410
|
+
end
|
|
411
|
+
end
|
|
376
412
|
end
|
|
377
413
|
end
|
|
@@ -131,6 +131,12 @@ RSpec.describe Faraday::Connection do
|
|
|
131
131
|
it { expect(subject.ssl.verify?).to be_falsey }
|
|
132
132
|
end
|
|
133
133
|
|
|
134
|
+
context 'with verify_hostname false' do
|
|
135
|
+
let(:options) { { ssl: { verify_hostname: false } } }
|
|
136
|
+
|
|
137
|
+
it { expect(subject.ssl.verify_hostname?).to be_falsey }
|
|
138
|
+
end
|
|
139
|
+
|
|
134
140
|
context 'with empty block' do
|
|
135
141
|
let(:conn) { Faraday::Connection.new {} }
|
|
136
142
|
|
|
@@ -27,6 +27,12 @@ RSpec.describe Faraday::Env do
|
|
|
27
27
|
expect(ssl.fetch(:verify, true)).to be_falsey
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
it 'handle verify_hostname when fetching' do
|
|
31
|
+
ssl = Faraday::SSLOptions.new
|
|
32
|
+
ssl.verify_hostname = true
|
|
33
|
+
expect(ssl.fetch(:verify_hostname, false)).to be_truthy
|
|
34
|
+
end
|
|
35
|
+
|
|
30
36
|
it 'retains custom members' do
|
|
31
37
|
env[:foo] = 'custom 1'
|
|
32
38
|
env[:bar] = :custom2
|
|
@@ -14,6 +14,7 @@ RSpec.describe Faraday::Request do
|
|
|
14
14
|
context 'when nothing particular is configured' do
|
|
15
15
|
it { expect(subject.http_method).to eq(:get) }
|
|
16
16
|
it { expect(subject.to_env(conn).ssl.verify).to be_falsey }
|
|
17
|
+
it { expect(subject.to_env(conn).ssl.verify_hostname).to be_falsey }
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
context 'when HTTP method is post' do
|
data/spec/faraday/utils_spec.rb
CHANGED
|
@@ -38,6 +38,7 @@ shared_examples 'adapter examples' do |**options|
|
|
|
38
38
|
let(:conn) do
|
|
39
39
|
conn_options[:ssl] ||= {}
|
|
40
40
|
conn_options[:ssl][:ca_file] ||= ENV['SSL_FILE']
|
|
41
|
+
conn_options[:ssl][:verify_hostname] ||= ENV['SSL_VERIFY_HOSTNAME'] == 'yes'
|
|
41
42
|
|
|
42
43
|
Faraday.new(remote, conn_options) do |conn|
|
|
43
44
|
conn.request :url_encoded
|
|
@@ -153,12 +153,19 @@ shared_examples 'a request method' do |http_method|
|
|
|
153
153
|
let(:streamed) { [] }
|
|
154
154
|
|
|
155
155
|
context 'when response is empty' do
|
|
156
|
-
it do
|
|
156
|
+
it 'handles streaming' do
|
|
157
|
+
env = nil
|
|
157
158
|
conn.public_send(http_method, '/') do |req|
|
|
158
|
-
req.options.on_data = proc
|
|
159
|
+
req.options.on_data = proc do |chunk, size, block_env|
|
|
160
|
+
streamed << [chunk, size]
|
|
161
|
+
env ||= block_env
|
|
162
|
+
end
|
|
159
163
|
end
|
|
160
164
|
|
|
161
165
|
expect(streamed).to eq([['', 0]])
|
|
166
|
+
# TODO: enable this after updating all existing adapters to the new streaming API
|
|
167
|
+
# expect(env).to be_a(Faraday::Env)
|
|
168
|
+
# expect(env.status).to eq(200)
|
|
162
169
|
end
|
|
163
170
|
end
|
|
164
171
|
|
|
@@ -166,12 +173,19 @@ shared_examples 'a request method' do |http_method|
|
|
|
166
173
|
before { request_stub.to_return(body: big_string) }
|
|
167
174
|
|
|
168
175
|
it 'handles streaming' do
|
|
176
|
+
env = nil
|
|
169
177
|
response = conn.public_send(http_method, '/') do |req|
|
|
170
|
-
req.options.on_data = proc
|
|
178
|
+
req.options.on_data = proc do |chunk, size, block_env|
|
|
179
|
+
streamed << [chunk, size]
|
|
180
|
+
env ||= block_env
|
|
181
|
+
end
|
|
171
182
|
end
|
|
172
183
|
|
|
173
184
|
expect(response.body).to eq('')
|
|
174
185
|
check_streaming_response(streamed, chunk_size: 16 * 1024)
|
|
186
|
+
# TODO: enable this after updating all existing adapters to the new streaming API
|
|
187
|
+
# expect(env).to be_a(Faraday::Env)
|
|
188
|
+
# expect(env.status).to eq(200)
|
|
175
189
|
end
|
|
176
190
|
end
|
|
177
191
|
end
|
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: 2.
|
|
4
|
+
version: 2.5.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- "@technoweenie"
|
|
@@ -10,22 +10,28 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2022-
|
|
13
|
+
date: 2022-08-08 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: faraday-net_http
|
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
|
18
18
|
requirements:
|
|
19
|
-
- - "
|
|
19
|
+
- - ">="
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
21
|
version: '2.0'
|
|
22
|
+
- - "<"
|
|
23
|
+
- !ruby/object:Gem::Version
|
|
24
|
+
version: '3.1'
|
|
22
25
|
type: :runtime
|
|
23
26
|
prerelease: false
|
|
24
27
|
version_requirements: !ruby/object:Gem::Requirement
|
|
25
28
|
requirements:
|
|
26
|
-
- - "
|
|
29
|
+
- - ">="
|
|
27
30
|
- !ruby/object:Gem::Version
|
|
28
31
|
version: '2.0'
|
|
32
|
+
- - "<"
|
|
33
|
+
- !ruby/object:Gem::Version
|
|
34
|
+
version: '3.1'
|
|
29
35
|
- !ruby/object:Gem::Dependency
|
|
30
36
|
name: ruby2_keywords
|
|
31
37
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -125,7 +131,7 @@ licenses:
|
|
|
125
131
|
- MIT
|
|
126
132
|
metadata:
|
|
127
133
|
homepage_uri: https://lostisland.github.io/faraday
|
|
128
|
-
changelog_uri: https://github.com/lostisland/faraday/releases/tag/v2.
|
|
134
|
+
changelog_uri: https://github.com/lostisland/faraday/releases/tag/v2.5.1
|
|
129
135
|
source_code_uri: https://github.com/lostisland/faraday
|
|
130
136
|
bug_tracker_uri: https://github.com/lostisland/faraday/issues
|
|
131
137
|
post_install_message:
|