faraday 1.10.5 → 2.0.0.alpha.pre.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/CHANGELOG.md +111 -1
- data/README.md +16 -9
- data/examples/client_test.rb +1 -1
- data/lib/faraday/adapter/test.rb +2 -0
- data/lib/faraday/adapter.rb +0 -5
- data/lib/faraday/connection.rb +3 -86
- data/lib/faraday/encoders/nested_params_encoder.rb +2 -2
- data/lib/faraday/error.rb +7 -0
- data/lib/faraday/file_part.rb +122 -0
- data/lib/faraday/logging/formatter.rb +1 -0
- data/lib/faraday/middleware.rb +0 -1
- data/lib/faraday/middleware_registry.rb +15 -79
- data/lib/faraday/options.rb +3 -3
- data/lib/faraday/param_part.rb +53 -0
- data/lib/faraday/rack_builder.rb +1 -1
- data/lib/faraday/request/authorization.rb +26 -40
- data/lib/faraday/request/instrumentation.rb +2 -0
- data/lib/faraday/request/multipart.rb +108 -0
- data/lib/faraday/request/retry.rb +241 -0
- data/lib/faraday/request/url_encoded.rb +2 -0
- data/lib/faraday/request.rb +8 -24
- data/lib/faraday/response/json.rb +4 -4
- data/lib/faraday/response/logger.rb +2 -0
- data/lib/faraday/response/raise_error.rb +9 -1
- data/lib/faraday/response.rb +7 -20
- data/lib/faraday/utils/headers.rb +1 -1
- data/lib/faraday/utils.rb +9 -4
- data/lib/faraday/version.rb +1 -1
- data/lib/faraday.rb +6 -45
- data/spec/faraday/connection_spec.rb +78 -84
- data/spec/faraday/options/env_spec.rb +2 -2
- data/spec/faraday/rack_builder_spec.rb +5 -43
- data/spec/faraday/request/authorization_spec.rb +14 -36
- data/spec/faraday/request/instrumentation_spec.rb +5 -7
- data/spec/faraday/request/multipart_spec.rb +302 -0
- data/spec/faraday/request/retry_spec.rb +254 -0
- data/spec/faraday/request_spec.rb +0 -11
- data/spec/faraday/response/json_spec.rb +4 -6
- data/spec/faraday/response/raise_error_spec.rb +7 -4
- data/spec/faraday/utils_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -2
- data/spec/support/fake_safe_buffer.rb +1 -1
- data/spec/support/shared_examples/request_method.rb +5 -5
- metadata +25 -156
- data/lib/faraday/adapter/typhoeus.rb +0 -15
- data/lib/faraday/autoload.rb +0 -89
- data/lib/faraday/dependency_loader.rb +0 -39
- data/lib/faraday/deprecate.rb +0 -110
- data/lib/faraday/request/basic_authentication.rb +0 -20
- data/lib/faraday/request/token_authentication.rb +0 -20
- data/spec/faraday/adapter/em_http_spec.rb +0 -49
- data/spec/faraday/adapter/em_synchrony_spec.rb +0 -18
- data/spec/faraday/adapter/excon_spec.rb +0 -49
- data/spec/faraday/adapter/httpclient_spec.rb +0 -73
- data/spec/faraday/adapter/net_http_spec.rb +0 -64
- data/spec/faraday/adapter/patron_spec.rb +0 -18
- data/spec/faraday/adapter/rack_spec.rb +0 -8
- data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
- data/spec/faraday/deprecate_spec.rb +0 -147
- data/spec/faraday/response/middleware_spec.rb +0 -68
- data/spec/support/webmock_rack_app.rb +0 -68
|
@@ -111,7 +111,7 @@ module Faraday
|
|
|
111
111
|
def parse(header_string)
|
|
112
112
|
return unless header_string && !header_string.empty?
|
|
113
113
|
|
|
114
|
-
headers = header_string.split(
|
|
114
|
+
headers = header_string.split("\r\n")
|
|
115
115
|
|
|
116
116
|
# Find the last set of response headers.
|
|
117
117
|
start_index = headers.rindex { |x| x.start_with?('HTTP/') } || 0
|
data/lib/faraday/utils.rb
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'base64'
|
|
4
|
+
require 'uri'
|
|
3
5
|
require 'faraday/utils/headers'
|
|
4
6
|
require 'faraday/utils/params_hash'
|
|
5
7
|
|
|
@@ -51,6 +53,12 @@ module Faraday
|
|
|
51
53
|
@default_params_encoder ||= NestedParamsEncoder
|
|
52
54
|
end
|
|
53
55
|
|
|
56
|
+
def basic_header_from(login, pass)
|
|
57
|
+
value = Base64.encode64("#{login}:#{pass}")
|
|
58
|
+
value.delete!("\n")
|
|
59
|
+
"Basic #{value}"
|
|
60
|
+
end
|
|
61
|
+
|
|
54
62
|
class << self
|
|
55
63
|
attr_writer :default_params_encoder
|
|
56
64
|
end
|
|
@@ -71,10 +79,7 @@ module Faraday
|
|
|
71
79
|
end
|
|
72
80
|
|
|
73
81
|
def default_uri_parser
|
|
74
|
-
@default_uri_parser ||=
|
|
75
|
-
require 'uri'
|
|
76
|
-
Kernel.method(:URI)
|
|
77
|
-
end
|
|
82
|
+
@default_uri_parser ||= Kernel.method(:URI)
|
|
78
83
|
end
|
|
79
84
|
|
|
80
85
|
def default_uri_parser=(parser)
|
data/lib/faraday/version.rb
CHANGED
data/lib/faraday.rb
CHANGED
|
@@ -4,16 +4,10 @@ require 'cgi'
|
|
|
4
4
|
require 'date'
|
|
5
5
|
require 'set'
|
|
6
6
|
require 'forwardable'
|
|
7
|
-
require 'faraday/middleware_registry'
|
|
8
|
-
require 'faraday/dependency_loader'
|
|
9
|
-
|
|
10
|
-
unless defined?(::Faraday::Timer)
|
|
11
|
-
require 'timeout'
|
|
12
|
-
::Faraday::Timer = Timeout
|
|
13
|
-
end
|
|
14
|
-
|
|
15
7
|
require 'faraday/version'
|
|
16
8
|
require 'faraday/methods'
|
|
9
|
+
require 'faraday/error'
|
|
10
|
+
require 'faraday/middleware_registry'
|
|
17
11
|
require 'faraday/utils'
|
|
18
12
|
require 'faraday/options'
|
|
19
13
|
require 'faraday/connection'
|
|
@@ -23,26 +17,8 @@ require 'faraday/middleware'
|
|
|
23
17
|
require 'faraday/adapter'
|
|
24
18
|
require 'faraday/request'
|
|
25
19
|
require 'faraday/response'
|
|
26
|
-
require 'faraday/
|
|
27
|
-
require 'faraday/
|
|
28
|
-
|
|
29
|
-
# External Middleware gems and their aliases
|
|
30
|
-
require 'faraday/multipart'
|
|
31
|
-
require 'faraday/retry'
|
|
32
|
-
Faraday::Request::Multipart = Faraday::Multipart::Middleware
|
|
33
|
-
Faraday::Request::Retry = Faraday::Retry::Middleware
|
|
34
|
-
|
|
35
|
-
# External Adapters gems
|
|
36
|
-
unless defined?(JRUBY_VERSION)
|
|
37
|
-
require 'faraday/em_http'
|
|
38
|
-
require 'faraday/em_synchrony'
|
|
39
|
-
end
|
|
40
|
-
require 'faraday/excon'
|
|
41
|
-
require 'faraday/httpclient'
|
|
42
|
-
require 'faraday/net_http'
|
|
43
|
-
require 'faraday/net_http_persistent'
|
|
44
|
-
require 'faraday/patron'
|
|
45
|
-
require 'faraday/rack'
|
|
20
|
+
require 'faraday/file_part'
|
|
21
|
+
require 'faraday/param_part'
|
|
46
22
|
|
|
47
23
|
# This is the main namespace for Faraday.
|
|
48
24
|
#
|
|
@@ -73,7 +49,7 @@ module Faraday
|
|
|
73
49
|
|
|
74
50
|
# @overload default_adapter
|
|
75
51
|
# Gets the Symbol key identifying a default Adapter to use
|
|
76
|
-
# for the default {Faraday::Connection}. Defaults to `:
|
|
52
|
+
# for the default {Faraday::Connection}. Defaults to `:test`.
|
|
77
53
|
# @return [Symbol] the default adapter
|
|
78
54
|
# @overload default_adapter=(adapter)
|
|
79
55
|
# Updates default adapter while resetting {.default_connection}.
|
|
@@ -120,19 +96,6 @@ module Faraday
|
|
|
120
96
|
Faraday::Connection.new(url, options, &block)
|
|
121
97
|
end
|
|
122
98
|
|
|
123
|
-
# @private
|
|
124
|
-
# Internal: Requires internal Faraday libraries.
|
|
125
|
-
#
|
|
126
|
-
# @param libs [Array] one or more relative String names to Faraday classes.
|
|
127
|
-
# @return [void]
|
|
128
|
-
def require_libs(*libs)
|
|
129
|
-
libs.each do |lib|
|
|
130
|
-
require "#{lib_path}/#{lib}"
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
alias require_lib require_libs
|
|
135
|
-
|
|
136
99
|
# Documented elsewhere, see default_adapter reader
|
|
137
100
|
def default_adapter=(adapter)
|
|
138
101
|
@default_connection = nil
|
|
@@ -187,7 +150,5 @@ module Faraday
|
|
|
187
150
|
self.ignore_env_proxy = false
|
|
188
151
|
self.root_path = File.expand_path __dir__
|
|
189
152
|
self.lib_path = File.expand_path 'faraday', __dir__
|
|
190
|
-
self.default_adapter = :
|
|
191
|
-
|
|
192
|
-
require_lib 'autoload' unless ENV['FARADAY_NO_AUTOLOAD']
|
|
153
|
+
self.default_adapter = :test
|
|
193
154
|
end
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
class CustomEncoder
|
|
4
|
+
def encode(params)
|
|
5
|
+
params.map { |k, v| "#{k.upcase}-#{v.to_s.upcase}" }.join(',')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def decode(params)
|
|
9
|
+
params.split(',').map { |pair| pair.split('-') }.to_h
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
3
13
|
shared_examples 'initializer with url' do
|
|
4
14
|
context 'with simple url' do
|
|
5
15
|
let(:address) { 'http://sushi.com' }
|
|
@@ -103,6 +113,12 @@ RSpec.describe Faraday::Connection do
|
|
|
103
113
|
it { expect(subject.params).to eq('a' => 3, 'b' => '2') }
|
|
104
114
|
end
|
|
105
115
|
|
|
116
|
+
context 'with basic_auth in url' do
|
|
117
|
+
let(:url) { 'http://Aladdin:open%20sesame@sushi.com/fish' }
|
|
118
|
+
|
|
119
|
+
it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
|
|
120
|
+
end
|
|
121
|
+
|
|
106
122
|
context 'with custom headers' do
|
|
107
123
|
let(:options) { { headers: { user_agent: 'Faraday' } } }
|
|
108
124
|
|
|
@@ -124,7 +140,7 @@ RSpec.describe Faraday::Connection do
|
|
|
124
140
|
context 'with block' do
|
|
125
141
|
let(:conn) do
|
|
126
142
|
Faraday::Connection.new(params: { 'a' => '1' }) do |faraday|
|
|
127
|
-
faraday.adapter :
|
|
143
|
+
faraday.adapter :test
|
|
128
144
|
faraday.url_prefix = 'http://sushi.com/omnom'
|
|
129
145
|
end
|
|
130
146
|
end
|
|
@@ -141,28 +157,6 @@ RSpec.describe Faraday::Connection do
|
|
|
141
157
|
end
|
|
142
158
|
end
|
|
143
159
|
|
|
144
|
-
describe 'basic_auth' do
|
|
145
|
-
subject { conn }
|
|
146
|
-
|
|
147
|
-
context 'calling the #basic_auth method' do
|
|
148
|
-
before { subject.basic_auth 'Aladdin', 'open sesame' }
|
|
149
|
-
|
|
150
|
-
it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
context 'adding basic auth info to url' do
|
|
154
|
-
let(:url) { 'http://Aladdin:open%20sesame@sushi.com/fish' }
|
|
155
|
-
|
|
156
|
-
it { expect(subject.headers['Authorization']).to eq('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') }
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
describe '#token_auth' do
|
|
161
|
-
before { subject.token_auth('abcdef', nonce: 'abc') }
|
|
162
|
-
|
|
163
|
-
it { expect(subject.headers['Authorization']).to eq('Token nonce="abc", token="abcdef"') }
|
|
164
|
-
end
|
|
165
|
-
|
|
166
160
|
describe '#build_exclusive_url' do
|
|
167
161
|
context 'with relative path' do
|
|
168
162
|
subject { conn.build_exclusive_url('sake.html') }
|
|
@@ -307,39 +301,6 @@ RSpec.describe Faraday::Connection do
|
|
|
307
301
|
expect(uri.to_s).to eq('http://service.com/api/service%3Asearch?limit=400')
|
|
308
302
|
end
|
|
309
303
|
end
|
|
310
|
-
|
|
311
|
-
context 'with protocol-relative URL (CVE-2026-25765)' do
|
|
312
|
-
it 'does not allow host override with //evil.com/path' do
|
|
313
|
-
conn.url_prefix = 'http://httpbingo.org/api'
|
|
314
|
-
uri = conn.build_exclusive_url('//evil.com/path')
|
|
315
|
-
expect(uri.host).to eq('httpbingo.org')
|
|
316
|
-
end
|
|
317
|
-
|
|
318
|
-
it 'does not allow host override with //evil.com:8080/path' do
|
|
319
|
-
conn.url_prefix = 'http://httpbingo.org/api'
|
|
320
|
-
uri = conn.build_exclusive_url('//evil.com:8080/path')
|
|
321
|
-
expect(uri.host).to eq('httpbingo.org')
|
|
322
|
-
end
|
|
323
|
-
|
|
324
|
-
it 'does not allow host override with //user:pass@evil.com/path' do
|
|
325
|
-
conn.url_prefix = 'http://httpbingo.org/api'
|
|
326
|
-
uri = conn.build_exclusive_url('//user:pass@evil.com/path')
|
|
327
|
-
expect(uri.host).to eq('httpbingo.org')
|
|
328
|
-
end
|
|
329
|
-
|
|
330
|
-
it 'does not allow host override with ///evil.com' do
|
|
331
|
-
conn.url_prefix = 'http://httpbingo.org/api'
|
|
332
|
-
uri = conn.build_exclusive_url('///evil.com')
|
|
333
|
-
expect(uri.host).to eq('httpbingo.org')
|
|
334
|
-
end
|
|
335
|
-
|
|
336
|
-
it 'still allows single-slash absolute paths' do
|
|
337
|
-
conn.url_prefix = 'http://httpbingo.org/api'
|
|
338
|
-
uri = conn.build_exclusive_url('/safe/path')
|
|
339
|
-
expect(uri.host).to eq('httpbingo.org')
|
|
340
|
-
expect(uri.path).to eq('/safe/path')
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
304
|
end
|
|
344
305
|
|
|
345
306
|
describe '#build_url' do
|
|
@@ -589,26 +550,32 @@ RSpec.describe Faraday::Connection do
|
|
|
589
550
|
end
|
|
590
551
|
|
|
591
552
|
context 'performing a request' do
|
|
592
|
-
|
|
553
|
+
let(:url) { 'http://example.com' }
|
|
554
|
+
let(:conn) do
|
|
555
|
+
Faraday.new do |f|
|
|
556
|
+
f.adapter :test do |stubs|
|
|
557
|
+
stubs.get(url) do
|
|
558
|
+
[200, {}, 'ok']
|
|
559
|
+
end
|
|
560
|
+
end
|
|
561
|
+
end
|
|
562
|
+
end
|
|
593
563
|
|
|
594
564
|
it 'dynamically checks proxy' do
|
|
595
565
|
with_env 'http_proxy' => 'http://proxy.com:80' do
|
|
596
|
-
conn = Faraday.new
|
|
597
566
|
expect(conn.proxy.uri.host).to eq('proxy.com')
|
|
598
567
|
|
|
599
|
-
conn.get(
|
|
568
|
+
conn.get(url) do |req|
|
|
600
569
|
expect(req.options.proxy.uri.host).to eq('proxy.com')
|
|
601
570
|
end
|
|
602
571
|
end
|
|
603
572
|
|
|
604
|
-
conn.get(
|
|
573
|
+
conn.get(url)
|
|
605
574
|
expect(conn.instance_variable_get('@temp_proxy')).to be_nil
|
|
606
575
|
end
|
|
607
576
|
|
|
608
577
|
it 'dynamically check no proxy' do
|
|
609
578
|
with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
|
|
610
|
-
conn = Faraday.new
|
|
611
|
-
|
|
612
579
|
expect(conn.proxy.uri.host).to eq('proxy.com')
|
|
613
580
|
|
|
614
581
|
conn.get('http://example.com') do |req|
|
|
@@ -638,7 +605,6 @@ RSpec.describe Faraday::Connection do
|
|
|
638
605
|
|
|
639
606
|
context 'after manual changes' do
|
|
640
607
|
before do
|
|
641
|
-
subject.basic_auth('', '')
|
|
642
608
|
subject.headers['content-length'] = 12
|
|
643
609
|
subject.params['b'] = '2'
|
|
644
610
|
subject.options[:open_timeout] = 10
|
|
@@ -678,9 +644,16 @@ RSpec.describe Faraday::Connection do
|
|
|
678
644
|
describe 'request params' do
|
|
679
645
|
context 'with simple url' do
|
|
680
646
|
let(:url) { 'http://example.com' }
|
|
681
|
-
let
|
|
647
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
648
|
+
|
|
649
|
+
before do
|
|
650
|
+
conn.adapter(:test, stubs)
|
|
651
|
+
stubs.get('http://example.com?a=a&p=3') do
|
|
652
|
+
[200, {}, 'ok']
|
|
653
|
+
end
|
|
654
|
+
end
|
|
682
655
|
|
|
683
|
-
after {
|
|
656
|
+
after { stubs.verify_stubbed_calls }
|
|
684
657
|
|
|
685
658
|
it 'test_overrides_request_params' do
|
|
686
659
|
conn.get('?p=2&a=a', p: 3)
|
|
@@ -702,15 +675,22 @@ RSpec.describe Faraday::Connection do
|
|
|
702
675
|
context 'with url and extra params' do
|
|
703
676
|
let(:url) { 'http://example.com?a=1&b=2' }
|
|
704
677
|
let(:options) { { params: { c: 3 } } }
|
|
678
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
679
|
+
|
|
680
|
+
before do
|
|
681
|
+
conn.adapter(:test, stubs)
|
|
682
|
+
end
|
|
705
683
|
|
|
706
684
|
it 'merges connection and request params' do
|
|
707
|
-
|
|
685
|
+
expected = 'http://example.com?a=1&b=2&c=3&limit=5&page=1'
|
|
686
|
+
stubs.get(expected) { [200, {}, 'ok'] }
|
|
708
687
|
conn.get('?page=1', limit: 5)
|
|
709
|
-
|
|
688
|
+
stubs.verify_stubbed_calls
|
|
710
689
|
end
|
|
711
690
|
|
|
712
691
|
it 'allows to override all params' do
|
|
713
|
-
|
|
692
|
+
expected = 'http://example.com?b=b'
|
|
693
|
+
stubs.get(expected) { [200, {}, 'ok'] }
|
|
714
694
|
conn.get('?p=1&a=a', p: 2) do |req|
|
|
715
695
|
expect(req.params[:a]).to eq('a')
|
|
716
696
|
expect(req.params['c']).to eq(3)
|
|
@@ -718,47 +698,61 @@ RSpec.describe Faraday::Connection do
|
|
|
718
698
|
req.params = { b: 'b' }
|
|
719
699
|
expect(req.params['b']).to eq('b')
|
|
720
700
|
end
|
|
721
|
-
|
|
701
|
+
stubs.verify_stubbed_calls
|
|
722
702
|
end
|
|
723
703
|
|
|
724
704
|
it 'allows to set params_encoder for single request' do
|
|
725
|
-
encoder =
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
end
|
|
729
|
-
stubbed = stub_request(:get, 'http://example.com/?A-1,B-2,C-3,FEELING-BLUE')
|
|
705
|
+
encoder = CustomEncoder.new
|
|
706
|
+
expected = 'http://example.com/?A-1,B-2,C-3,FEELING-BLUE'
|
|
707
|
+
stubs.get(expected) { [200, {}, 'ok'] }
|
|
730
708
|
|
|
731
|
-
conn.get('/', feeling: 'blue') do |req|
|
|
709
|
+
conn.get('/', a: 1, b: 2, c: 3, feeling: 'blue') do |req|
|
|
732
710
|
req.options.params_encoder = encoder
|
|
733
711
|
end
|
|
734
|
-
|
|
712
|
+
stubs.verify_stubbed_calls
|
|
735
713
|
end
|
|
736
714
|
end
|
|
737
715
|
|
|
738
716
|
context 'with default params encoder' do
|
|
739
|
-
let
|
|
740
|
-
|
|
717
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
718
|
+
|
|
719
|
+
before do
|
|
720
|
+
conn.adapter(:test, stubs)
|
|
721
|
+
stubs.get('http://example.com?color%5B%5D=blue&color%5B%5D=red') do
|
|
722
|
+
[200, {}, 'ok']
|
|
723
|
+
end
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
after { stubs.verify_stubbed_calls }
|
|
741
727
|
|
|
742
728
|
it 'supports array params in url' do
|
|
743
|
-
conn.get('http://example.com?color[]=
|
|
729
|
+
conn.get('http://example.com?color[]=blue&color[]=red')
|
|
744
730
|
end
|
|
745
731
|
|
|
746
732
|
it 'supports array params in params' do
|
|
747
|
-
conn.get('http://example.com', color: %w[red
|
|
733
|
+
conn.get('http://example.com', color: %w[blue red])
|
|
748
734
|
end
|
|
749
735
|
end
|
|
750
736
|
|
|
751
737
|
context 'with flat params encoder' do
|
|
752
738
|
let(:options) { { request: { params_encoder: Faraday::FlatParamsEncoder } } }
|
|
753
|
-
let
|
|
754
|
-
|
|
739
|
+
let(:stubs) { Faraday::Adapter::Test::Stubs.new }
|
|
740
|
+
|
|
741
|
+
before do
|
|
742
|
+
conn.adapter(:test, stubs)
|
|
743
|
+
stubs.get('http://example.com?color=blue&color=red') do
|
|
744
|
+
[200, {}, 'ok']
|
|
745
|
+
end
|
|
746
|
+
end
|
|
747
|
+
|
|
748
|
+
after { stubs.verify_stubbed_calls }
|
|
755
749
|
|
|
756
750
|
it 'supports array params in params' do
|
|
757
|
-
conn.get('http://example.com', color: %w[red
|
|
751
|
+
conn.get('http://example.com', color: %w[blue red])
|
|
758
752
|
end
|
|
759
753
|
|
|
760
754
|
context 'with array param in url' do
|
|
761
|
-
let(:url) { 'http://example.com?color[]=
|
|
755
|
+
let(:url) { 'http://example.com?color[]=blue&color[]=red' }
|
|
762
756
|
|
|
763
757
|
it do
|
|
764
758
|
conn.get('/')
|
|
@@ -29,12 +29,12 @@ RSpec.describe Faraday::Env do
|
|
|
29
29
|
|
|
30
30
|
it 'retains custom members' do
|
|
31
31
|
env[:foo] = 'custom 1'
|
|
32
|
-
env[:bar] = :
|
|
32
|
+
env[:bar] = :custom2
|
|
33
33
|
env2 = Faraday::Env.from(env)
|
|
34
34
|
env2[:baz] = 'custom 3'
|
|
35
35
|
|
|
36
36
|
expect(env2[:foo]).to eq('custom 1')
|
|
37
|
-
expect(env2[:bar]).to eq(:
|
|
37
|
+
expect(env2[:bar]).to eq(:custom2)
|
|
38
38
|
expect(env[:baz]).to be_nil
|
|
39
39
|
end
|
|
40
40
|
|
|
@@ -12,13 +12,11 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
12
12
|
|
|
13
13
|
class Apple < Handler
|
|
14
14
|
end
|
|
15
|
+
|
|
15
16
|
class Orange < Handler
|
|
16
17
|
end
|
|
17
|
-
class Banana < Handler
|
|
18
|
-
end
|
|
19
18
|
|
|
20
|
-
class
|
|
21
|
-
dependency 'zomg/i_dont/exist'
|
|
19
|
+
class Banana < Handler
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
subject { conn.builder }
|
|
@@ -127,24 +125,6 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
127
125
|
subject.use(:apple)
|
|
128
126
|
expect(subject.handlers).to eq([Apple])
|
|
129
127
|
end
|
|
130
|
-
|
|
131
|
-
it 'allows to register with symbol' do
|
|
132
|
-
Faraday::Middleware.register_middleware(apple: :Apple)
|
|
133
|
-
subject.use(:apple)
|
|
134
|
-
expect(subject.handlers).to eq([Apple])
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it 'allows to register with string' do
|
|
138
|
-
Faraday::Middleware.register_middleware(apple: 'Apple')
|
|
139
|
-
subject.use(:apple)
|
|
140
|
-
expect(subject.handlers).to eq([Apple])
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
it 'allows to register with Proc' do
|
|
144
|
-
Faraday::Middleware.register_middleware(apple: -> { Apple })
|
|
145
|
-
subject.use(:apple)
|
|
146
|
-
expect(subject.handlers).to eq([Apple])
|
|
147
|
-
end
|
|
148
128
|
end
|
|
149
129
|
|
|
150
130
|
context 'when having two handlers' do
|
|
@@ -176,24 +156,6 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
176
156
|
end
|
|
177
157
|
end
|
|
178
158
|
|
|
179
|
-
context 'when having a handler with broken dependency' do
|
|
180
|
-
let(:conn) do
|
|
181
|
-
Faraday::Connection.new do |builder|
|
|
182
|
-
builder.adapter :test do |stub|
|
|
183
|
-
stub.get('/') { |_| [200, {}, ''] }
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
before { subject.use(Broken) }
|
|
189
|
-
|
|
190
|
-
it 'raises an error while making a request' do
|
|
191
|
-
expect { conn.get('/') }.to raise_error(RuntimeError) do |err|
|
|
192
|
-
expect(err.message).to match(%r{missing dependency for Broken: .+ -- zomg/i_dont/exist})
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
159
|
context 'when middleware is added with named arguments' do
|
|
198
160
|
let(:conn) { Faraday::Connection.new {} }
|
|
199
161
|
|
|
@@ -220,7 +182,7 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
220
182
|
end
|
|
221
183
|
end
|
|
222
184
|
|
|
223
|
-
context 'when a
|
|
185
|
+
context 'when a middleware is added with named arguments' do
|
|
224
186
|
let(:conn) { Faraday::Connection.new {} }
|
|
225
187
|
|
|
226
188
|
let(:cat_request) do
|
|
@@ -247,11 +209,11 @@ RSpec.describe Faraday::RackBuilder do
|
|
|
247
209
|
end
|
|
248
210
|
end
|
|
249
211
|
|
|
250
|
-
context 'when a
|
|
212
|
+
context 'when a middleware is added with named arguments' do
|
|
251
213
|
let(:conn) { Faraday::Connection.new {} }
|
|
252
214
|
|
|
253
215
|
let(:fish_response) do
|
|
254
|
-
Class.new(Faraday::
|
|
216
|
+
Class.new(Faraday::Middleware) do
|
|
255
217
|
attr_accessor :name
|
|
256
218
|
|
|
257
219
|
def initialize(app, name:)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
RSpec.describe Faraday::Request::Authorization do
|
|
4
4
|
let(:conn) do
|
|
5
5
|
Faraday.new do |b|
|
|
6
|
-
b.request auth_type, *auth_config
|
|
6
|
+
b.request :authorization, auth_type, *auth_config
|
|
7
7
|
b.adapter :test do |stub|
|
|
8
8
|
stub.get('/auth-echo') do |env|
|
|
9
9
|
[200, {}, env[:request_headers]['Authorization']]
|
|
@@ -14,10 +14,10 @@ RSpec.describe Faraday::Request::Authorization do
|
|
|
14
14
|
|
|
15
15
|
shared_examples 'does not interfere with existing authentication' do
|
|
16
16
|
context 'and request already has an authentication header' do
|
|
17
|
-
let(:response) { conn.get('/auth-echo', nil, authorization: '
|
|
17
|
+
let(:response) { conn.get('/auth-echo', nil, authorization: 'OAuth oauth_token') }
|
|
18
18
|
|
|
19
19
|
it 'does not interfere with existing authorization' do
|
|
20
|
-
expect(response.body).to eq('
|
|
20
|
+
expect(response.body).to eq('OAuth oauth_token')
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -25,7 +25,7 @@ RSpec.describe Faraday::Request::Authorization do
|
|
|
25
25
|
let(:response) { conn.get('/auth-echo') }
|
|
26
26
|
|
|
27
27
|
describe 'basic_auth' do
|
|
28
|
-
let(:auth_type) { :
|
|
28
|
+
let(:auth_type) { :basic }
|
|
29
29
|
|
|
30
30
|
context 'when passed correct params' do
|
|
31
31
|
let(:auth_config) { %w[aladdin opensesame] }
|
|
@@ -44,51 +44,29 @@ RSpec.describe Faraday::Request::Authorization do
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
describe 'token_auth' do
|
|
48
|
-
let(:auth_type) { :token_auth }
|
|
49
|
-
|
|
50
|
-
context 'when passed correct params' do
|
|
51
|
-
let(:auth_config) { 'quux' }
|
|
52
|
-
|
|
53
|
-
it { expect(response.body).to eq('Token token="quux"') }
|
|
54
|
-
|
|
55
|
-
include_examples 'does not interfere with existing authentication'
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
context 'when other values are provided' do
|
|
59
|
-
let(:auth_config) { ['baz', { foo: 42 }] }
|
|
60
|
-
|
|
61
|
-
it { expect(response.body).to match(/^Token /) }
|
|
62
|
-
it { expect(response.body).to match(/token="baz"/) }
|
|
63
|
-
it { expect(response.body).to match(/foo="42"/) }
|
|
64
|
-
|
|
65
|
-
include_examples 'does not interfere with existing authentication'
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
47
|
describe 'authorization' do
|
|
70
|
-
let(:auth_type) { :
|
|
48
|
+
let(:auth_type) { :Bearer }
|
|
71
49
|
|
|
72
|
-
context 'when passed
|
|
73
|
-
let(:auth_config) { ['custom'
|
|
50
|
+
context 'when passed a string' do
|
|
51
|
+
let(:auth_config) { ['custom'] }
|
|
74
52
|
|
|
75
|
-
it { expect(response.body).to eq('custom
|
|
53
|
+
it { expect(response.body).to eq('Bearer custom') }
|
|
76
54
|
|
|
77
55
|
include_examples 'does not interfere with existing authentication'
|
|
78
56
|
end
|
|
79
57
|
|
|
80
|
-
context 'when passed a
|
|
81
|
-
let(:auth_config) { [
|
|
58
|
+
context 'when passed a proc' do
|
|
59
|
+
let(:auth_config) { [-> { 'custom_from_proc' }] }
|
|
82
60
|
|
|
83
|
-
it { expect(response.body).to eq('
|
|
61
|
+
it { expect(response.body).to eq('Bearer custom_from_proc') }
|
|
84
62
|
|
|
85
63
|
include_examples 'does not interfere with existing authentication'
|
|
86
64
|
end
|
|
87
65
|
|
|
88
|
-
context 'when passed
|
|
89
|
-
let(:auth_config) { [
|
|
66
|
+
context 'when passed too many arguments' do
|
|
67
|
+
let(:auth_config) { %w[baz foo] }
|
|
90
68
|
|
|
91
|
-
it { expect
|
|
69
|
+
it { expect { response }.to raise_error(ArgumentError) }
|
|
92
70
|
|
|
93
71
|
include_examples 'does not interfere with existing authentication'
|
|
94
72
|
end
|
|
@@ -30,13 +30,11 @@ RSpec.describe Faraday::Request::Instrumentation do
|
|
|
30
30
|
|
|
31
31
|
it { expect(options.name).to eq('request.faraday') }
|
|
32
32
|
it 'defaults to ActiveSupport::Notifications' do
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
expect(res).to eq(ActiveSupport::Notifications)
|
|
39
|
-
end
|
|
33
|
+
res = options.instrumenter
|
|
34
|
+
rescue NameError => e
|
|
35
|
+
expect(e.to_s).to match('ActiveSupport')
|
|
36
|
+
else
|
|
37
|
+
expect(res).to eq(ActiveSupport::Notifications)
|
|
40
38
|
end
|
|
41
39
|
|
|
42
40
|
it 'instruments with default name' do
|