faraday 0.9.0.rc5 → 0.9.0.rc6
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.
- data/Gemfile +6 -5
- data/README.md +0 -22
- data/faraday.gemspec +2 -2
- data/lib/faraday.rb +6 -2
- data/lib/faraday/adapter/em_http.rb +34 -14
- data/lib/faraday/adapter/em_http_ssl_patch.rb +56 -0
- data/lib/faraday/adapter/em_synchrony.rb +21 -20
- data/lib/faraday/adapter/excon.rb +16 -0
- data/lib/faraday/adapter/httpclient.rb +14 -0
- data/lib/faraday/adapter/net_http.rb +6 -2
- data/lib/faraday/adapter/net_http_persistent.rb +15 -3
- data/lib/faraday/adapter/patron.rb +13 -11
- data/lib/faraday/adapter/typhoeus.rb +11 -0
- data/lib/faraday/autoload.rb +2 -4
- data/lib/faraday/connection.rb +30 -3
- data/lib/faraday/error.rb +4 -1
- data/lib/faraday/options.rb +117 -23
- data/lib/faraday/request/instrumentation.rb +1 -3
- data/lib/faraday/request/multipart.rb +1 -1
- data/lib/faraday/request/retry.rb +38 -9
- data/lib/faraday/response.rb +1 -2
- data/lib/faraday/response/raise_error.rb +3 -0
- data/lib/faraday/utils.rb +10 -4
- data/script/proxy-server +42 -0
- data/script/server +1 -3
- data/script/test +35 -7
- data/test/adapters/excon_test.rb +4 -0
- data/test/adapters/httpclient_test.rb +5 -0
- data/test/adapters/integration.rb +48 -2
- data/test/adapters/net_http_persistent_test.rb +10 -1
- data/test/adapters/patron_test.rb +3 -0
- data/test/adapters/rack_test.rb +5 -0
- data/test/adapters/typhoeus_test.rb +3 -13
- data/test/authentication_middleware_test.rb +6 -6
- data/test/connection_test.rb +123 -49
- data/test/env_test.rb +19 -1
- data/test/helper.rb +2 -4
- data/test/live_server.rb +4 -2
- data/test/middleware/instrumentation_test.rb +13 -0
- data/test/middleware/retry_test.rb +47 -0
- data/test/multibyte.txt +1 -0
- data/test/options_test.rb +93 -17
- data/test/request_middleware_test.rb +6 -6
- data/test/utils_test.rb +34 -13
- metadata +69 -44
@@ -6,6 +6,9 @@ module Faraday
|
|
6
6
|
case env[:status]
|
7
7
|
when 404
|
8
8
|
raise Faraday::Error::ResourceNotFound, response_values(env)
|
9
|
+
when 407
|
10
|
+
# mimic the behavior that we get with proxy requests with HTTPS
|
11
|
+
raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
9
12
|
when ClientErrorStatuses
|
10
13
|
raise Faraday::Error::ClientError, response_values(env)
|
11
14
|
end
|
data/lib/faraday/utils.rb
CHANGED
@@ -11,10 +11,10 @@ module Faraday
|
|
11
11
|
new(value)
|
12
12
|
end
|
13
13
|
|
14
|
-
def initialize(hash=
|
14
|
+
def initialize(hash = nil)
|
15
15
|
super()
|
16
16
|
@names = {}
|
17
|
-
self.update
|
17
|
+
self.update(hash || {})
|
18
18
|
end
|
19
19
|
|
20
20
|
# need to synchronize concurrent writes to the shared KeyMap
|
@@ -45,6 +45,12 @@ module Faraday
|
|
45
45
|
super k, v
|
46
46
|
end
|
47
47
|
|
48
|
+
def fetch(k, *args, &block)
|
49
|
+
k = KeyMap[k]
|
50
|
+
key = @names.fetch(k.downcase, k)
|
51
|
+
super(key, *args, &block)
|
52
|
+
end
|
53
|
+
|
48
54
|
def delete(k)
|
49
55
|
k = KeyMap[k]
|
50
56
|
if k = @names[k.downcase]
|
@@ -162,8 +168,8 @@ module Faraday
|
|
162
168
|
ESCAPE_RE = /[^a-zA-Z0-9 .~_-]/
|
163
169
|
|
164
170
|
def escape(s)
|
165
|
-
s.to_s.gsub(ESCAPE_RE) {
|
166
|
-
'%' +
|
171
|
+
s.to_s.gsub(ESCAPE_RE) {|match|
|
172
|
+
'%' + match.unpack('H2' * match.bytesize).join('%').upcase
|
167
173
|
}.tr(' ', '+')
|
168
174
|
end
|
169
175
|
|
data/script/proxy-server
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Usage: script/proxy-server [-p PORT] [-u USER:PASSWORD]
|
3
|
+
require 'webrick'
|
4
|
+
require 'webrick/httpproxy'
|
5
|
+
|
6
|
+
port = 4001
|
7
|
+
|
8
|
+
if found = ARGV.index('-p')
|
9
|
+
port = ARGV[found + 1].to_i
|
10
|
+
end
|
11
|
+
if found = ARGV.index('-u')
|
12
|
+
username, password = ARGV[found + 1].split(':', 2)
|
13
|
+
end
|
14
|
+
|
15
|
+
match_credentials = lambda { |credentials|
|
16
|
+
got_username, got_password = credentials.to_s.unpack("m*")[0].split(":", 2)
|
17
|
+
got_username == username && got_password == password
|
18
|
+
}
|
19
|
+
|
20
|
+
log_io = $stdout
|
21
|
+
log_io.sync = true
|
22
|
+
|
23
|
+
webrick_opts = {
|
24
|
+
:Port => port, :Logger => WEBrick::Log::new(log_io),
|
25
|
+
:AccessLog => [[log_io, "[%{X-Faraday-Adapter}i] %m %U -> %s %b"]],
|
26
|
+
:ProxyAuthProc => lambda { |req, res|
|
27
|
+
if username
|
28
|
+
type, credentials = req.header['proxy-authorization'].first.to_s.split(/\s+/, 2)
|
29
|
+
unless "Basic" == type && match_credentials.call(credentials)
|
30
|
+
res['proxy-authenticate'] = %{Basic realm="testing"}
|
31
|
+
raise WEBrick::HTTPStatus::ProxyAuthenticationRequired
|
32
|
+
end
|
33
|
+
end
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
proxy = WEBrick::HTTPProxyServer.new(webrick_opts)
|
38
|
+
|
39
|
+
trap(:TERM) { proxy.shutdown }
|
40
|
+
trap(:INT) { proxy.shutdown }
|
41
|
+
|
42
|
+
proxy.start
|
data/script/server
CHANGED
@@ -6,15 +6,13 @@ ensure
|
|
6
6
|
$VERBOSE = old_verbose
|
7
7
|
end
|
8
8
|
require 'webrick'
|
9
|
-
require 'fileutils'
|
10
9
|
|
11
10
|
port = 4000
|
12
11
|
if found = ARGV.index('-p')
|
13
12
|
port = ARGV[found + 1].to_i
|
14
13
|
end
|
15
14
|
|
16
|
-
|
17
|
-
log_io = File.open('log/test.log', 'w')
|
15
|
+
log_io = $stdout
|
18
16
|
log_io.sync = true
|
19
17
|
|
20
18
|
webrick_opts = {
|
data/script/test
CHANGED
@@ -24,6 +24,7 @@ if [[ "$RUBYOPT" != *"bundler/setup"* ]]; then
|
|
24
24
|
fi
|
25
25
|
|
26
26
|
port=3999
|
27
|
+
proxy_port=3998
|
27
28
|
scheme=http
|
28
29
|
|
29
30
|
if [ "$SSL" = "yes" ]; then
|
@@ -47,12 +48,18 @@ filter_matching() {
|
|
47
48
|
|
48
49
|
start_server() {
|
49
50
|
mkdir -p log
|
50
|
-
script/server -p $port >log/
|
51
|
+
script/server -p $port >log/test.log 2>&1 &
|
52
|
+
echo $!
|
53
|
+
}
|
54
|
+
|
55
|
+
start_proxy() {
|
56
|
+
mkdir -p log
|
57
|
+
script/proxy-server -p $proxy_port -u "faraday@test.local:there is cake" >log/proxy.log 2>&1 &
|
51
58
|
echo $!
|
52
59
|
}
|
53
60
|
|
54
61
|
server_started() {
|
55
|
-
lsof -i :$
|
62
|
+
lsof -i :${1?} >/dev/null
|
56
63
|
}
|
57
64
|
|
58
65
|
timestamp() {
|
@@ -62,7 +69,7 @@ timestamp() {
|
|
62
69
|
wait_for_server() {
|
63
70
|
timeout=$(( `timestamp` + $1 ))
|
64
71
|
while true; do
|
65
|
-
if server_started; then
|
72
|
+
if server_started "$2"; then
|
66
73
|
break
|
67
74
|
elif [ `timestamp` -gt "$timeout" ]; then
|
68
75
|
echo "timed out after $1 seconds" >&2
|
@@ -109,27 +116,47 @@ fi
|
|
109
116
|
|
110
117
|
# If there are any adapter tests, spin up the HTTP server
|
111
118
|
if [ -n "$(filter_matching "adapters" "${test_files[@]}")" ]; then
|
112
|
-
if server_started; then
|
119
|
+
if server_started $port; then
|
113
120
|
echo "aborted: another instance of server running on $port" >&2
|
114
121
|
exit 1
|
115
122
|
fi
|
116
123
|
server_pid=$(start_server)
|
117
|
-
|
118
|
-
|
124
|
+
proxy_pid=$(start_proxy)
|
125
|
+
wait_for_server 30 $port || {
|
126
|
+
cat log/test.log
|
127
|
+
kill "$server_pid"
|
128
|
+
kill "$proxy_pid"
|
119
129
|
exit 1
|
120
130
|
}
|
131
|
+
wait_for_server 5 $proxy_port
|
121
132
|
cleanup() {
|
122
133
|
if [ $? -ne 0 ] && [ -n "$TRAVIS" ]; then
|
123
134
|
cat log/test.log
|
124
135
|
fi
|
125
136
|
kill "$server_pid"
|
137
|
+
kill "$proxy_pid"
|
126
138
|
}
|
127
139
|
trap cleanup INT EXIT
|
128
140
|
export LIVE="${scheme}://localhost:${port}"
|
141
|
+
export LIVE_PROXY="http://faraday%40test.local:there%20is%20cake@localhost:${proxy_port}"
|
129
142
|
fi
|
130
143
|
|
144
|
+
warnings="${TMPDIR:-/tmp}/faraday-warnings.$$"
|
145
|
+
|
131
146
|
run_test_files() {
|
132
|
-
|
147
|
+
# Save warnings on stderr to a separate file
|
148
|
+
RUBYOPT="$RUBYOPT -w" ruby -e 'while f=ARGV.shift and f!="--"; load f; end' "${test_files[@]}" -- "$@" \
|
149
|
+
2> >(tee >(grep 'warning:' >"$warnings") | grep -v 'warning:')
|
150
|
+
}
|
151
|
+
|
152
|
+
check_warnings() {
|
153
|
+
# Display Ruby warnings from this project's source files. Abort if any were found.
|
154
|
+
num="$(grep -F "$PWD" "$warnings" | grep -v "${PWD}/bundle" | sort | uniq -c | sort -rn | tee /dev/stderr | wc -l)"
|
155
|
+
rm -f "$warnings"
|
156
|
+
if [ "$num" -gt 0 ]; then
|
157
|
+
echo "FAILED: this test suite doesn't tolerate Ruby syntax warnings!" >&2
|
158
|
+
exit 1
|
159
|
+
fi
|
133
160
|
}
|
134
161
|
|
135
162
|
if [ -n "$RBENV_VERSIONS" ]; then
|
@@ -142,3 +169,4 @@ else
|
|
142
169
|
run_test_files "$@"
|
143
170
|
fi
|
144
171
|
|
172
|
+
check_warnings
|
data/test/adapters/excon_test.rb
CHANGED
@@ -8,6 +8,10 @@ module Adapters
|
|
8
8
|
Integration.apply(self, :NonParallel) do
|
9
9
|
# https://github.com/geemus/excon/issues/126 ?
|
10
10
|
undef :test_timeout if ssl_mode?
|
11
|
+
|
12
|
+
# Excon lets OpenSSL::SSL::SSLError be raised without any way to
|
13
|
+
# distinguish whether it happened because of a 407 proxy response
|
14
|
+
undef :test_proxy_auth_fail if ssl_mode?
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
@@ -6,6 +6,11 @@ module Adapters
|
|
6
6
|
def adapter() :httpclient end
|
7
7
|
|
8
8
|
Integration.apply(self, :NonParallel) do
|
9
|
+
def setup
|
10
|
+
require 'httpclient' unless defined?(HTTPClient)
|
11
|
+
HTTPClient::NO_PROXY_HOSTS.delete('localhost')
|
12
|
+
end
|
13
|
+
|
9
14
|
def test_binds_local_socket
|
10
15
|
host = '1.2.3.4'
|
11
16
|
conn = create_connection :request => { :bind => { :host => host } }
|
@@ -12,6 +12,7 @@ module Adapters
|
|
12
12
|
if base.live_server?
|
13
13
|
features = [:Common]
|
14
14
|
features.concat extra_features
|
15
|
+
features << :SSL if base.ssl_mode?
|
15
16
|
features.each {|name| base.send(:include, self.const_get(name)) }
|
16
17
|
yield if block_given?
|
17
18
|
elsif !defined? @warned
|
@@ -58,7 +59,18 @@ module Adapters
|
|
58
59
|
module Compression
|
59
60
|
def test_GET_handles_compression
|
60
61
|
res = get('echo_header', :name => 'accept-encoding')
|
61
|
-
assert_match
|
62
|
+
assert_match(/gzip;.+\bdeflate\b/, res.body)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
module SSL
|
67
|
+
def test_GET_ssl_fails_with_bad_cert
|
68
|
+
ca_file = 'tmp/faraday-different-ca-cert.crt'
|
69
|
+
conn = create_connection(:ssl => {:ca_file => ca_file})
|
70
|
+
err = assert_raises Faraday::SSLError do
|
71
|
+
conn.get('/ssl')
|
72
|
+
end
|
73
|
+
assert_includes err.message, "certificate"
|
62
74
|
end
|
63
75
|
end
|
64
76
|
|
@@ -118,7 +130,7 @@ module Adapters
|
|
118
130
|
resp = post('file') do |req|
|
119
131
|
req.body = {'uploaded_file' => Faraday::UploadIO.new(__FILE__, 'text/x-ruby')}
|
120
132
|
end
|
121
|
-
assert_equal "file integration.rb text/x-ruby", resp.body
|
133
|
+
assert_equal "file integration.rb text/x-ruby #{File.size(__FILE__)}", resp.body
|
122
134
|
end
|
123
135
|
|
124
136
|
def test_PUT_send_url_encoded_params
|
@@ -166,6 +178,40 @@ module Adapters
|
|
166
178
|
end
|
167
179
|
end
|
168
180
|
|
181
|
+
def test_connection_error
|
182
|
+
assert_raises Faraday::Error::ConnectionFailed do
|
183
|
+
get 'http://localhost:4'
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_proxy
|
188
|
+
proxy_uri = URI(ENV['LIVE_PROXY'])
|
189
|
+
conn = create_connection(:proxy => proxy_uri)
|
190
|
+
|
191
|
+
res = conn.get '/echo'
|
192
|
+
assert_equal 'get', res.body
|
193
|
+
|
194
|
+
unless self.class.ssl_mode?
|
195
|
+
# proxy can't append "Via" header for HTTPS responses
|
196
|
+
assert_match(/:#{proxy_uri.port}$/, res['via'])
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_proxy_auth_fail
|
201
|
+
proxy_uri = URI(ENV['LIVE_PROXY'])
|
202
|
+
proxy_uri.password = 'WRONG'
|
203
|
+
conn = create_connection(:proxy => proxy_uri)
|
204
|
+
|
205
|
+
err = assert_raises Faraday::Error::ConnectionFailed do
|
206
|
+
conn.get '/echo'
|
207
|
+
end
|
208
|
+
|
209
|
+
unless self.class.ssl_mode? && self.class.jruby?
|
210
|
+
# JRuby raises "End of file reached" which cannot be distinguished from a 407
|
211
|
+
assert_equal %{407 "Proxy Authentication Required "}, err.message
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
169
215
|
def test_empty_body_response_represented_as_blank_string
|
170
216
|
response = get('204')
|
171
217
|
assert_equal '', response.body
|
@@ -5,7 +5,16 @@ module Adapters
|
|
5
5
|
|
6
6
|
def adapter() :net_http_persistent end
|
7
7
|
|
8
|
-
Integration.apply(self, :NonParallel)
|
8
|
+
Integration.apply(self, :NonParallel) do
|
9
|
+
def setup
|
10
|
+
if defined?(Net::HTTP::Persistent)
|
11
|
+
# work around problems with mixed SSL certificates
|
12
|
+
# https://github.com/drbrain/net-http-persistent/issues/45
|
13
|
+
http = Net::HTTP::Persistent.new('Faraday')
|
14
|
+
http.ssl_cleanup(4)
|
15
|
+
end
|
16
|
+
end if ssl_mode?
|
17
|
+
end
|
9
18
|
|
10
19
|
end
|
11
20
|
end
|
data/test/adapters/rack_test.rb
CHANGED
@@ -13,25 +13,15 @@ module Adapters
|
|
13
13
|
# which libcurl seems to generate for this particular request:
|
14
14
|
undef :test_POST_sends_files
|
15
15
|
|
16
|
+
# inconsistent outcomes ranging from successful response to connection error
|
17
|
+
undef :test_proxy_auth_fail if ssl_mode?
|
18
|
+
|
16
19
|
def test_binds_local_socket
|
17
20
|
host = '1.2.3.4'
|
18
21
|
conn = create_connection :request => { :bind => { :host => host } }
|
19
22
|
assert_equal host, conn.options[:bind][:host]
|
20
23
|
end
|
21
24
|
|
22
|
-
def test_GET_ssl_rejects_bad_hosts
|
23
|
-
original_ssl_file = ENV['SSL_FILE']
|
24
|
-
begin
|
25
|
-
ENV['SSL_FILE'] = 'tmp/faraday-different-ca-cert.crt'
|
26
|
-
conn = create_connection
|
27
|
-
expected = ''
|
28
|
-
response = conn.get('/ssl')
|
29
|
-
assert_equal expected, response.body
|
30
|
-
ensure
|
31
|
-
ENV['SSL_FILE'] = original_ssl_file
|
32
|
-
end
|
33
|
-
end if ssl_mode?
|
34
|
-
|
35
25
|
end unless jruby?
|
36
26
|
end
|
37
27
|
end
|
@@ -37,9 +37,9 @@ class AuthenticationMiddlewareTest < Faraday::TestCase
|
|
37
37
|
response = conn { |b|
|
38
38
|
b.request :token_auth, 'baz', :foo => 42
|
39
39
|
}.get('/auth-echo')
|
40
|
-
assert_match
|
41
|
-
assert_match
|
42
|
-
assert_match
|
40
|
+
assert_match(/^Token /, response.body)
|
41
|
+
assert_match(/token="baz"/, response.body)
|
42
|
+
assert_match(/foo="42"/, response.body)
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_token_middleware_does_not_interfere_with_existing_authorization
|
@@ -52,14 +52,14 @@ class AuthenticationMiddlewareTest < Faraday::TestCase
|
|
52
52
|
response = conn { |b|
|
53
53
|
b.request :authorization, 'custom', 'abc def'
|
54
54
|
}.get('/auth-echo')
|
55
|
-
assert_match
|
55
|
+
assert_match(/^custom abc def$/, response.body)
|
56
56
|
end
|
57
57
|
|
58
58
|
def test_authorization_middleware_with_hash
|
59
59
|
response = conn { |b|
|
60
60
|
b.request :authorization, 'baz', :foo => 42
|
61
61
|
}.get('/auth-echo')
|
62
|
-
assert_match
|
63
|
-
assert_match
|
62
|
+
assert_match(/^baz /, response.body)
|
63
|
+
assert_match(/foo="42"/, response.body)
|
64
64
|
end
|
65
65
|
end
|
data/test/connection_test.rb
CHANGED
@@ -2,10 +2,6 @@ require File.expand_path('../helper', __FILE__)
|
|
2
2
|
|
3
3
|
class TestConnection < Faraday::TestCase
|
4
4
|
|
5
|
-
def teardown
|
6
|
-
Faraday::Utils.default_params_encoder = nil
|
7
|
-
end
|
8
|
-
|
9
5
|
def with_env(key, proxy)
|
10
6
|
old_value = ENV.fetch(key, false)
|
11
7
|
ENV[key] = proxy
|
@@ -101,109 +97,137 @@ class TestConnection < Faraday::TestCase
|
|
101
97
|
assert_match(/nonce="abc"/, auth)
|
102
98
|
end
|
103
99
|
|
104
|
-
def
|
100
|
+
def test_build_exclusive_url_uses_connection_host_as_default_uri_host
|
105
101
|
conn = Faraday::Connection.new
|
106
102
|
conn.host = 'sushi.com'
|
107
103
|
uri = conn.build_exclusive_url("/sake.html")
|
108
104
|
assert_equal 'sushi.com', uri.host
|
109
105
|
end
|
110
106
|
|
111
|
-
def
|
107
|
+
def test_build_exclusive_url_overrides_connection_port_for_absolute_urls
|
112
108
|
conn = Faraday::Connection.new
|
113
109
|
conn.port = 23
|
114
110
|
uri = conn.build_exclusive_url("http://sushi.com")
|
115
111
|
assert_equal 80, uri.port
|
116
112
|
end
|
117
113
|
|
118
|
-
def
|
114
|
+
def test_build_exclusive_url_uses_connection_scheme_as_default_uri_scheme
|
119
115
|
conn = Faraday::Connection.new 'http://sushi.com'
|
120
116
|
uri = conn.build_exclusive_url("/sake.html")
|
121
117
|
assert_equal 'http', uri.scheme
|
122
118
|
end
|
123
119
|
|
124
|
-
def
|
120
|
+
def test_build_exclusive_url_uses_connection_path_prefix_to_customize_path
|
125
121
|
conn = Faraday::Connection.new
|
126
122
|
conn.path_prefix = '/fish'
|
127
123
|
uri = conn.build_exclusive_url("sake.html")
|
128
124
|
assert_equal '/fish/sake.html', uri.path
|
129
125
|
end
|
130
126
|
|
131
|
-
def
|
127
|
+
def test_build_exclusive_url_uses_root_connection_path_prefix_to_customize_path
|
132
128
|
conn = Faraday::Connection.new
|
133
129
|
conn.path_prefix = '/'
|
134
130
|
uri = conn.build_exclusive_url("sake.html")
|
135
131
|
assert_equal '/sake.html', uri.path
|
136
132
|
end
|
137
133
|
|
138
|
-
def
|
134
|
+
def test_build_exclusive_url_forces_connection_path_prefix_to_be_absolute
|
139
135
|
conn = Faraday::Connection.new
|
140
136
|
conn.path_prefix = 'fish'
|
141
137
|
uri = conn.build_exclusive_url("sake.html")
|
142
138
|
assert_equal '/fish/sake.html', uri.path
|
143
139
|
end
|
144
140
|
|
145
|
-
def
|
141
|
+
def test_build_exclusive_url_ignores_connection_path_prefix_trailing_slash
|
146
142
|
conn = Faraday::Connection.new
|
147
143
|
conn.path_prefix = '/fish/'
|
148
144
|
uri = conn.build_exclusive_url("sake.html")
|
149
145
|
assert_equal '/fish/sake.html', uri.path
|
150
146
|
end
|
151
147
|
|
152
|
-
def
|
148
|
+
def test_build_exclusive_url_allows_absolute_uri_to_ignore_connection_path_prefix
|
153
149
|
conn = Faraday::Connection.new
|
154
150
|
conn.path_prefix = '/fish'
|
155
151
|
uri = conn.build_exclusive_url("/sake.html")
|
156
152
|
assert_equal '/sake.html', uri.path
|
157
153
|
end
|
158
154
|
|
159
|
-
def
|
155
|
+
def test_build_exclusive_url_parses_url_params_into_path
|
160
156
|
conn = Faraday::Connection.new
|
161
157
|
uri = conn.build_exclusive_url("http://sushi.com/sake.html")
|
162
158
|
assert_equal '/sake.html', uri.path
|
163
159
|
end
|
164
160
|
|
165
|
-
def
|
161
|
+
def test_build_exclusive_url_doesnt_add_ending_slash_given_nil_url
|
166
162
|
conn = Faraday::Connection.new
|
167
163
|
conn.url_prefix = "http://sushi.com/nigiri"
|
168
164
|
uri = conn.build_exclusive_url
|
169
165
|
assert_equal "/nigiri", uri.path
|
170
166
|
end
|
171
167
|
|
172
|
-
def
|
168
|
+
def test_build_exclusive_url_doesnt_add_ending_slash_given_empty_url
|
173
169
|
conn = Faraday::Connection.new
|
174
170
|
conn.url_prefix = "http://sushi.com/nigiri"
|
175
171
|
uri = conn.build_exclusive_url('')
|
176
172
|
assert_equal "/nigiri", uri.path
|
177
173
|
end
|
178
|
-
|
179
|
-
def
|
180
|
-
|
174
|
+
|
175
|
+
def test_build_exclusive_url_doesnt_use_connection_params
|
176
|
+
conn = Faraday::Connection.new "http://sushi.com/nigiri"
|
177
|
+
conn.params = {:a => 1}
|
178
|
+
assert_equal "http://sushi.com/nigiri", conn.build_exclusive_url.to_s
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_build_exclusive_url_uses_argument_params
|
182
|
+
conn = Faraday::Connection.new "http://sushi.com/nigiri"
|
183
|
+
conn.params = {:a => 1}
|
184
|
+
params = Faraday::Utils::ParamsHash.new
|
185
|
+
params[:a] = 2
|
186
|
+
url = conn.build_exclusive_url(nil, params)
|
187
|
+
assert_equal "http://sushi.com/nigiri?a=2", url.to_s
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_build_url_uses_params
|
191
|
+
conn = Faraday::Connection.new "http://sushi.com/nigiri"
|
192
|
+
conn.params = {:a => 1, :b => 1}
|
193
|
+
assert_equal "http://sushi.com/nigiri?a=1&b=1", conn.build_url.to_s
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_build_url_merges_params
|
197
|
+
conn = Faraday::Connection.new "http://sushi.com/nigiri"
|
198
|
+
conn.params = {:a => 1, :b => 1}
|
199
|
+
url = conn.build_url(nil, :b => 2, :c => 3)
|
200
|
+
assert_equal "http://sushi.com/nigiri?a=1&b=2&c=3", url.to_s
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_env_url_parses_url_params_into_query
|
204
|
+
uri = env_url("http://sushi.com/sake.html", 'a[b]' => '1 + 2')
|
181
205
|
assert_equal "a%5Bb%5D=1+%2B+2", uri.query
|
182
206
|
end
|
183
207
|
|
184
|
-
def
|
185
|
-
uri =
|
208
|
+
def test_env_url_escapes_per_spec
|
209
|
+
uri = env_url('http:/', 'a' => '1+2 foo~bar.-baz')
|
186
210
|
assert_equal "a=1%2B2+foo~bar.-baz", uri.query
|
187
211
|
end
|
188
212
|
|
189
|
-
def
|
190
|
-
url =
|
213
|
+
def test_env_url_bracketizes_nested_params_in_query
|
214
|
+
url = env_url nil, 'a' => {'b' => 'c'}
|
191
215
|
assert_equal "a%5Bb%5D=c", url.query
|
192
216
|
end
|
193
217
|
|
194
|
-
def
|
195
|
-
uri =
|
218
|
+
def test_env_url_bracketizes_repeated_params_in_query
|
219
|
+
uri = env_url("http://sushi.com/sake.html", 'a' => [1, 2])
|
196
220
|
assert_equal "a%5B%5D=1&a%5B%5D=2", uri.query
|
197
221
|
end
|
198
222
|
|
199
|
-
def
|
200
|
-
uri =
|
223
|
+
def test_env_url_without_braketizing_repeated_params_in_query
|
224
|
+
uri = env_url 'http://sushi.com', 'a' => [1, 2] do |conn|
|
201
225
|
conn.options.params_encoder = Faraday::FlatParamsEncoder
|
202
226
|
end
|
203
227
|
assert_equal "a=1&a=2", uri.query
|
204
228
|
end
|
205
229
|
|
206
|
-
def
|
230
|
+
def test_build_exclusive_url_parses_url
|
207
231
|
conn = Faraday::Connection.new
|
208
232
|
uri = conn.build_exclusive_url("http://sushi.com/sake.html")
|
209
233
|
assert_equal "http", uri.scheme
|
@@ -211,32 +235,32 @@ class TestConnection < Faraday::TestCase
|
|
211
235
|
assert_equal '/sake.html', uri.path
|
212
236
|
end
|
213
237
|
|
214
|
-
def
|
238
|
+
def test_build_exclusive_url_parses_url_and_changes_scheme
|
215
239
|
conn = Faraday::Connection.new :url => "http://sushi.com/sushi"
|
216
240
|
conn.scheme = 'https'
|
217
241
|
uri = conn.build_exclusive_url("sake.html")
|
218
242
|
assert_equal 'https://sushi.com/sushi/sake.html', uri.to_s
|
219
243
|
end
|
220
244
|
|
221
|
-
def
|
245
|
+
def test_build_exclusive_url_joins_url_to_base_with_ending_slash
|
222
246
|
conn = Faraday::Connection.new :url => "http://sushi.com/sushi/"
|
223
247
|
uri = conn.build_exclusive_url("sake.html")
|
224
248
|
assert_equal 'http://sushi.com/sushi/sake.html', uri.to_s
|
225
249
|
end
|
226
250
|
|
227
|
-
def
|
251
|
+
def test_build_exclusive_url_used_default_base_with_ending_slash
|
228
252
|
conn = Faraday::Connection.new :url => "http://sushi.com/sushi/"
|
229
253
|
uri = conn.build_exclusive_url
|
230
254
|
assert_equal 'http://sushi.com/sushi/', uri.to_s
|
231
255
|
end
|
232
256
|
|
233
|
-
def
|
257
|
+
def test_build_exclusive_url_overrides_base
|
234
258
|
conn = Faraday::Connection.new :url => "http://sushi.com/sushi/"
|
235
259
|
uri = conn.build_exclusive_url('/sake/')
|
236
260
|
assert_equal 'http://sushi.com/sake/', uri.to_s
|
237
261
|
end
|
238
262
|
|
239
|
-
def
|
263
|
+
def test_build_exclusive_url_handles_uri_instances
|
240
264
|
conn = Faraday::Connection.new
|
241
265
|
uri = conn.build_exclusive_url(URI('/sake.html'))
|
242
266
|
assert_equal '/sake.html', uri.path
|
@@ -291,6 +315,42 @@ class TestConnection < Faraday::TestCase
|
|
291
315
|
end
|
292
316
|
end
|
293
317
|
|
318
|
+
def test_proxy_accepts_env_without_scheme
|
319
|
+
with_env 'http_proxy', "localhost:8888" do
|
320
|
+
uri = Faraday::Connection.new.proxy[:uri]
|
321
|
+
assert_equal 'localhost', uri.host
|
322
|
+
assert_equal 8888, uri.port
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_no_proxy_from_env
|
327
|
+
with_env 'http_proxy', nil do
|
328
|
+
conn = Faraday::Connection.new
|
329
|
+
assert_equal nil, conn.proxy
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
def test_no_proxy_from_blank_env
|
334
|
+
with_env 'http_proxy', '' do
|
335
|
+
conn = Faraday::Connection.new
|
336
|
+
assert_equal nil, conn.proxy
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
def test_proxy_doesnt_accept_uppercase_env
|
341
|
+
with_env 'HTTP_PROXY', "http://localhost:8888/" do
|
342
|
+
conn = Faraday::Connection.new
|
343
|
+
assert_nil conn.proxy
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
def test_proxy_requires_uri
|
348
|
+
conn = Faraday::Connection.new
|
349
|
+
assert_raises ArgumentError do
|
350
|
+
conn.proxy :uri => :bad_uri, :user => 'rick'
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
294
354
|
def test_dups_connection_object
|
295
355
|
conn = Faraday::Connection.new 'http://sushi.com/foo',
|
296
356
|
:ssl => { :verify => :none },
|
@@ -333,7 +393,7 @@ class TestConnection < Faraday::TestCase
|
|
333
393
|
assert_equal '/omnom', conn.path_prefix
|
334
394
|
end
|
335
395
|
|
336
|
-
def
|
396
|
+
def env_url(url, params)
|
337
397
|
conn = Faraday::Connection.new(url, :params => params)
|
338
398
|
yield conn if block_given?
|
339
399
|
req = conn.build_request(:get)
|
@@ -356,6 +416,16 @@ class TestRequestParams < Faraday::TestCase
|
|
356
416
|
assert_equal expected, query.split('&').sort
|
357
417
|
end
|
358
418
|
|
419
|
+
def with_default_params_encoder(encoder)
|
420
|
+
old_encoder = Faraday::Utils.default_params_encoder
|
421
|
+
begin
|
422
|
+
Faraday::Utils.default_params_encoder = encoder
|
423
|
+
yield
|
424
|
+
ensure
|
425
|
+
Faraday::Utils.default_params_encoder = old_encoder
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
359
429
|
def test_merges_connection_and_request_params
|
360
430
|
create_connection 'http://a.co/?token=abc', :params => {'format' => 'json'}
|
361
431
|
query = get '?page=1', :limit => 5
|
@@ -412,31 +482,35 @@ class TestRequestParams < Faraday::TestCase
|
|
412
482
|
end
|
413
483
|
|
414
484
|
def test_array_params_in_url
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
485
|
+
with_default_params_encoder(nil) do
|
486
|
+
create_connection 'http://a.co/page1?color[]=red&color[]=blue'
|
487
|
+
query = get
|
488
|
+
assert_equal "color%5B%5D=red&color%5B%5D=blue", query
|
489
|
+
end
|
419
490
|
end
|
420
491
|
|
421
492
|
def test_array_params_in_params
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
493
|
+
with_default_params_encoder(nil) do
|
494
|
+
create_connection 'http://a.co/page1', :params => {:color => ['red', 'blue']}
|
495
|
+
query = get
|
496
|
+
assert_equal "color%5B%5D=red&color%5B%5D=blue", query
|
497
|
+
end
|
426
498
|
end
|
427
499
|
|
428
500
|
def test_array_params_in_url_with_flat_params
|
429
|
-
Faraday::
|
430
|
-
|
431
|
-
|
432
|
-
|
501
|
+
with_default_params_encoder(Faraday::FlatParamsEncoder) do
|
502
|
+
create_connection 'http://a.co/page1?color=red&color=blue'
|
503
|
+
query = get
|
504
|
+
assert_equal "color=red&color=blue", query
|
505
|
+
end
|
433
506
|
end
|
434
507
|
|
435
508
|
def test_array_params_in_params_with_flat_params
|
436
|
-
Faraday::
|
437
|
-
|
438
|
-
|
439
|
-
|
509
|
+
with_default_params_encoder(Faraday::FlatParamsEncoder) do
|
510
|
+
create_connection 'http://a.co/page1', :params => {:color => ['red', 'blue']}
|
511
|
+
query = get
|
512
|
+
assert_equal "color=red&color=blue", query
|
513
|
+
end
|
440
514
|
end
|
441
515
|
|
442
516
|
def get(*args)
|