faraday 0.9.1 → 0.17.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.
Files changed (74) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +196 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +192 -28
  5. data/Rakefile +6 -64
  6. data/lib/faraday/adapter/em_http.rb +17 -11
  7. data/lib/faraday/adapter/em_http_ssl_patch.rb +1 -1
  8. data/lib/faraday/adapter/em_synchrony.rb +19 -5
  9. data/lib/faraday/adapter/excon.rb +13 -11
  10. data/lib/faraday/adapter/httpclient.rb +31 -9
  11. data/lib/faraday/adapter/net_http.rb +36 -14
  12. data/lib/faraday/adapter/net_http_persistent.rb +37 -17
  13. data/lib/faraday/adapter/patron.rb +44 -21
  14. data/lib/faraday/adapter/rack.rb +1 -1
  15. data/lib/faraday/adapter/test.rb +79 -28
  16. data/lib/faraday/adapter/typhoeus.rb +4 -115
  17. data/lib/faraday/adapter.rb +10 -1
  18. data/lib/faraday/autoload.rb +1 -1
  19. data/lib/faraday/connection.rb +72 -20
  20. data/lib/faraday/deprecate.rb +101 -0
  21. data/lib/faraday/error.rb +90 -24
  22. data/lib/faraday/options.rb +43 -20
  23. data/lib/faraday/parameters.rb +56 -39
  24. data/lib/faraday/rack_builder.rb +27 -2
  25. data/lib/faraday/request/authorization.rb +1 -2
  26. data/lib/faraday/request/multipart.rb +7 -2
  27. data/lib/faraday/request/retry.rb +84 -19
  28. data/lib/faraday/request.rb +22 -0
  29. data/lib/faraday/response/logger.rb +29 -8
  30. data/lib/faraday/response/raise_error.rb +7 -3
  31. data/lib/faraday/response.rb +9 -5
  32. data/lib/faraday/utils.rb +32 -3
  33. data/lib/faraday.rb +14 -34
  34. data/spec/faraday/deprecate_spec.rb +69 -0
  35. data/spec/faraday/error_spec.rb +102 -0
  36. data/spec/faraday/response/raise_error_spec.rb +95 -0
  37. data/spec/spec_helper.rb +104 -0
  38. data/test/adapters/em_http_test.rb +10 -0
  39. data/test/adapters/em_synchrony_test.rb +22 -10
  40. data/test/adapters/excon_test.rb +10 -0
  41. data/test/adapters/httpclient_test.rb +14 -1
  42. data/test/adapters/integration.rb +17 -8
  43. data/test/adapters/logger_test.rb +65 -11
  44. data/test/adapters/net_http_persistent_test.rb +96 -2
  45. data/test/adapters/net_http_test.rb +67 -2
  46. data/test/adapters/patron_test.rb +28 -8
  47. data/test/adapters/rack_test.rb +8 -1
  48. data/test/adapters/test_middleware_test.rb +46 -3
  49. data/test/adapters/typhoeus_test.rb +19 -9
  50. data/test/composite_read_io_test.rb +16 -18
  51. data/test/connection_test.rb +294 -78
  52. data/test/env_test.rb +55 -5
  53. data/test/helper.rb +11 -17
  54. data/test/middleware/retry_test.rb +115 -10
  55. data/test/middleware_stack_test.rb +97 -10
  56. data/test/options_test.rb +97 -16
  57. data/test/parameters_test.rb +94 -1
  58. data/test/request_middleware_test.rb +24 -40
  59. data/test/response_middleware_test.rb +4 -4
  60. data/test/utils_test.rb +40 -0
  61. metadata +21 -66
  62. data/.document +0 -6
  63. data/CONTRIBUTING.md +0 -36
  64. data/Gemfile +0 -25
  65. data/faraday.gemspec +0 -34
  66. data/script/cached-bundle +0 -46
  67. data/script/console +0 -7
  68. data/script/generate_certs +0 -42
  69. data/script/package +0 -7
  70. data/script/proxy-server +0 -42
  71. data/script/release +0 -17
  72. data/script/s3-put +0 -71
  73. data/script/server +0 -36
  74. data/script/test +0 -172
@@ -1,53 +1,90 @@
1
1
  require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class TestConnection < Faraday::TestCase
4
+ def teardown
5
+ Faraday.default_connection_options = nil
6
+ end
7
+
8
+ def with_test_conn
9
+ old_conn = Faraday.default_connection
10
+ Faraday.default_connection = Faraday::Connection.new do |builder|
11
+ builder.adapter :test do |stub|
12
+ stub.get('/') do |_|
13
+ [200, nil, nil]
14
+ end
15
+ end
16
+ end
17
+
18
+ begin
19
+ yield
20
+ ensure
21
+ Faraday.default_connection = old_conn
22
+ end
23
+ end
24
+
25
+ def with_env_proxy_disabled
26
+ Faraday.ignore_env_proxy = true
27
+
28
+ begin
29
+ yield
30
+ ensure
31
+ Faraday.ignore_env_proxy = false
32
+ end
33
+ end
34
+
35
+ def with_env(new_env)
36
+ old_env = {}
37
+
38
+ new_env.each do |key, value|
39
+ old_env[key] = ENV.fetch(key, false)
40
+ ENV[key] = value
41
+ end
4
42
 
5
- def with_env(key, proxy)
6
- old_value = ENV.fetch(key, false)
7
- ENV[key] = proxy
8
43
  begin
9
44
  yield
10
45
  ensure
11
- if old_value == false
12
- ENV.delete key
13
- else
14
- ENV[key] = old_value
46
+ old_env.each do |key, value|
47
+ if value == false
48
+ ENV.delete key
49
+ else
50
+ ENV[key] = value
51
+ end
15
52
  end
16
53
  end
17
54
  end
18
55
 
19
56
  def test_initialize_parses_host_out_of_given_url
20
- conn = Faraday::Connection.new "http://sushi.com"
57
+ conn = Faraday::Connection.new 'http://sushi.com'
21
58
  assert_equal 'sushi.com', conn.host
22
59
  end
23
60
 
24
61
  def test_initialize_inherits_default_port_out_of_given_url
25
- conn = Faraday::Connection.new "http://sushi.com"
62
+ conn = Faraday::Connection.new 'http://sushi.com'
26
63
  assert_equal 80, conn.port
27
64
  end
28
65
 
29
66
  def test_initialize_parses_scheme_out_of_given_url
30
- conn = Faraday::Connection.new "http://sushi.com"
67
+ conn = Faraday::Connection.new 'http://sushi.com'
31
68
  assert_equal 'http', conn.scheme
32
69
  end
33
70
 
34
71
  def test_initialize_parses_port_out_of_given_url
35
- conn = Faraday::Connection.new "http://sushi.com:815"
72
+ conn = Faraday::Connection.new 'http://sushi.com:815'
36
73
  assert_equal 815, conn.port
37
74
  end
38
75
 
39
76
  def test_initialize_parses_nil_path_prefix_out_of_given_url
40
- conn = Faraday::Connection.new "http://sushi.com"
77
+ conn = Faraday::Connection.new 'http://sushi.com'
41
78
  assert_equal '/', conn.path_prefix
42
79
  end
43
80
 
44
81
  def test_initialize_parses_path_prefix_out_of_given_url
45
- conn = Faraday::Connection.new "http://sushi.com/fish"
82
+ conn = Faraday::Connection.new 'http://sushi.com/fish'
46
83
  assert_equal '/fish', conn.path_prefix
47
84
  end
48
85
 
49
86
  def test_initialize_parses_path_prefix_out_of_given_url_option
50
- conn = Faraday::Connection.new :url => "http://sushi.com/fish"
87
+ conn = Faraday::Connection.new :url => 'http://sushi.com/fish'
51
88
  assert_equal '/fish', conn.path_prefix
52
89
  end
53
90
 
@@ -57,12 +94,12 @@ class TestConnection < Faraday::TestCase
57
94
  end
58
95
 
59
96
  def test_initialize_stores_default_params_from_uri
60
- conn = Faraday::Connection.new "http://sushi.com/fish?a=1"
97
+ conn = Faraday::Connection.new 'http://sushi.com/fish?a=1'
61
98
  assert_equal({'a' => '1'}, conn.params)
62
99
  end
63
100
 
64
101
  def test_initialize_stores_default_params_from_uri_and_options
65
- conn = Faraday::Connection.new "http://sushi.com/fish?a=1&b=2", :params => {'a' => 3}
102
+ conn = Faraday::Connection.new 'http://sushi.com/fish?a=1&b=2', :params => {'a' => 3}
66
103
  assert_equal({'a' => 3, 'b' => '2'}, conn.params)
67
104
  end
68
105
 
@@ -81,9 +118,9 @@ class TestConnection < Faraday::TestCase
81
118
  end
82
119
 
83
120
  def test_auto_parses_basic_auth_from_url_and_unescapes
84
- conn = Faraday::Connection.new :url => "http://foo%40bar.com:pass%20word@sushi.com/fish"
121
+ conn = Faraday::Connection.new :url => 'http://foo%40bar.com:pass%20word@sushi.com/fish'
85
122
  assert auth = conn.headers['Authorization']
86
- assert_equal Faraday::Request::BasicAuthentication.header("foo@bar.com", "pass word"), auth
123
+ assert_equal Faraday::Request::BasicAuthentication.header('foo@bar.com', 'pass word'), auth
87
124
  end
88
125
 
89
126
  def test_token_auth_sets_header
@@ -100,162 +137,176 @@ class TestConnection < Faraday::TestCase
100
137
  def test_build_exclusive_url_uses_connection_host_as_default_uri_host
101
138
  conn = Faraday::Connection.new
102
139
  conn.host = 'sushi.com'
103
- uri = conn.build_exclusive_url("/sake.html")
140
+ uri = conn.build_exclusive_url('/sake.html')
104
141
  assert_equal 'sushi.com', uri.host
105
142
  end
106
143
 
107
144
  def test_build_exclusive_url_overrides_connection_port_for_absolute_urls
108
145
  conn = Faraday::Connection.new
109
146
  conn.port = 23
110
- uri = conn.build_exclusive_url("http://sushi.com")
147
+ uri = conn.build_exclusive_url('http://sushi.com')
111
148
  assert_equal 80, uri.port
112
149
  end
113
150
 
114
151
  def test_build_exclusive_url_uses_connection_scheme_as_default_uri_scheme
115
152
  conn = Faraday::Connection.new 'http://sushi.com'
116
- uri = conn.build_exclusive_url("/sake.html")
153
+ uri = conn.build_exclusive_url('/sake.html')
117
154
  assert_equal 'http', uri.scheme
118
155
  end
119
156
 
120
157
  def test_build_exclusive_url_uses_connection_path_prefix_to_customize_path
121
158
  conn = Faraday::Connection.new
122
159
  conn.path_prefix = '/fish'
123
- uri = conn.build_exclusive_url("sake.html")
160
+ uri = conn.build_exclusive_url('sake.html')
124
161
  assert_equal '/fish/sake.html', uri.path
125
162
  end
126
163
 
127
164
  def test_build_exclusive_url_uses_root_connection_path_prefix_to_customize_path
128
165
  conn = Faraday::Connection.new
129
166
  conn.path_prefix = '/'
130
- uri = conn.build_exclusive_url("sake.html")
167
+ uri = conn.build_exclusive_url('sake.html')
131
168
  assert_equal '/sake.html', uri.path
132
169
  end
133
170
 
134
171
  def test_build_exclusive_url_forces_connection_path_prefix_to_be_absolute
135
172
  conn = Faraday::Connection.new
136
173
  conn.path_prefix = 'fish'
137
- uri = conn.build_exclusive_url("sake.html")
174
+ uri = conn.build_exclusive_url('sake.html')
138
175
  assert_equal '/fish/sake.html', uri.path
139
176
  end
140
177
 
141
178
  def test_build_exclusive_url_ignores_connection_path_prefix_trailing_slash
142
179
  conn = Faraday::Connection.new
143
180
  conn.path_prefix = '/fish/'
144
- uri = conn.build_exclusive_url("sake.html")
181
+ uri = conn.build_exclusive_url('sake.html')
145
182
  assert_equal '/fish/sake.html', uri.path
146
183
  end
147
184
 
148
185
  def test_build_exclusive_url_allows_absolute_uri_to_ignore_connection_path_prefix
149
186
  conn = Faraday::Connection.new
150
187
  conn.path_prefix = '/fish'
151
- uri = conn.build_exclusive_url("/sake.html")
188
+ uri = conn.build_exclusive_url('/sake.html')
152
189
  assert_equal '/sake.html', uri.path
153
190
  end
154
191
 
155
192
  def test_build_exclusive_url_parses_url_params_into_path
156
193
  conn = Faraday::Connection.new
157
- uri = conn.build_exclusive_url("http://sushi.com/sake.html")
194
+ uri = conn.build_exclusive_url('http://sushi.com/sake.html')
158
195
  assert_equal '/sake.html', uri.path
159
196
  end
160
197
 
161
198
  def test_build_exclusive_url_doesnt_add_ending_slash_given_nil_url
162
199
  conn = Faraday::Connection.new
163
- conn.url_prefix = "http://sushi.com/nigiri"
200
+ conn.url_prefix = 'http://sushi.com/nigiri'
164
201
  uri = conn.build_exclusive_url
165
- assert_equal "/nigiri", uri.path
202
+ assert_equal '/nigiri', uri.path
166
203
  end
167
204
 
168
205
  def test_build_exclusive_url_doesnt_add_ending_slash_given_empty_url
169
206
  conn = Faraday::Connection.new
170
- conn.url_prefix = "http://sushi.com/nigiri"
207
+ conn.url_prefix = 'http://sushi.com/nigiri'
171
208
  uri = conn.build_exclusive_url('')
172
- assert_equal "/nigiri", uri.path
209
+ assert_equal '/nigiri', uri.path
173
210
  end
174
211
 
175
212
  def test_build_exclusive_url_doesnt_use_connection_params
176
- conn = Faraday::Connection.new "http://sushi.com/nigiri"
213
+ conn = Faraday::Connection.new 'http://sushi.com/nigiri'
177
214
  conn.params = {:a => 1}
178
- assert_equal "http://sushi.com/nigiri", conn.build_exclusive_url.to_s
215
+ assert_equal 'http://sushi.com/nigiri', conn.build_exclusive_url.to_s
179
216
  end
180
217
 
181
218
  def test_build_exclusive_url_uses_argument_params
182
- conn = Faraday::Connection.new "http://sushi.com/nigiri"
219
+ conn = Faraday::Connection.new 'http://sushi.com/nigiri'
183
220
  conn.params = {:a => 1}
184
221
  params = Faraday::Utils::ParamsHash.new
185
222
  params[:a] = 2
186
223
  url = conn.build_exclusive_url(nil, params)
187
- assert_equal "http://sushi.com/nigiri?a=2", url.to_s
224
+ assert_equal 'http://sushi.com/nigiri?a=2', url.to_s
188
225
  end
189
226
 
190
227
  def test_build_url_uses_params
191
- conn = Faraday::Connection.new "http://sushi.com/nigiri"
228
+ conn = Faraday::Connection.new 'http://sushi.com/nigiri'
192
229
  conn.params = {:a => 1, :b => 1}
193
- assert_equal "http://sushi.com/nigiri?a=1&b=1", conn.build_url.to_s
230
+ assert_equal 'http://sushi.com/nigiri?a=1&b=1', conn.build_url.to_s
194
231
  end
195
232
 
196
233
  def test_build_url_merges_params
197
- conn = Faraday::Connection.new "http://sushi.com/nigiri"
234
+ conn = Faraday::Connection.new 'http://sushi.com/nigiri'
198
235
  conn.params = {:a => 1, :b => 1}
199
236
  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
237
+ assert_equal 'http://sushi.com/nigiri?a=1&b=2&c=3', url.to_s
238
+ end
239
+
240
+ def test_request_header_change_does_not_modify_connection_header
241
+ connection = Faraday.new(:url => 'https://asushi.com/sake.html')
242
+ connection.headers = {'Authorization' => 'token abc123'}
243
+
244
+ request = connection.build_request(:get)
245
+ request.headers.delete('Authorization')
246
+
247
+ assert_equal connection.headers.keys.sort, ['Authorization']
248
+ assert connection.headers.include?('Authorization')
249
+
250
+ assert_equal request.headers.keys.sort, []
251
+ assert !request.headers.include?('Authorization')
201
252
  end
202
253
 
203
254
  def test_env_url_parses_url_params_into_query
204
- uri = env_url("http://sushi.com/sake.html", 'a[b]' => '1 + 2')
205
- assert_equal "a%5Bb%5D=1+%2B+2", uri.query
255
+ uri = env_url('http://sushi.com/sake.html', 'a[b]' => '1 + 2')
256
+ assert_equal 'a%5Bb%5D=1+%2B+2', uri.query
206
257
  end
207
258
 
208
259
  def test_env_url_escapes_per_spec
209
- uri = env_url('http:/', 'a' => '1+2 foo~bar.-baz')
210
- assert_equal "a=1%2B2+foo~bar.-baz", uri.query
260
+ uri = env_url(nil, 'a' => '1+2 foo~bar.-baz')
261
+ assert_equal 'a=1%2B2+foo~bar.-baz', uri.query
211
262
  end
212
263
 
213
264
  def test_env_url_bracketizes_nested_params_in_query
214
265
  url = env_url nil, 'a' => {'b' => 'c'}
215
- assert_equal "a%5Bb%5D=c", url.query
266
+ assert_equal 'a%5Bb%5D=c', url.query
216
267
  end
217
268
 
218
269
  def test_env_url_bracketizes_repeated_params_in_query
219
- uri = env_url("http://sushi.com/sake.html", 'a' => [1, 2])
220
- assert_equal "a%5B%5D=1&a%5B%5D=2", uri.query
270
+ uri = env_url('http://sushi.com/sake.html', 'a' => [1, 2])
271
+ assert_equal 'a%5B%5D=1&a%5B%5D=2', uri.query
221
272
  end
222
273
 
223
274
  def test_env_url_without_braketizing_repeated_params_in_query
224
275
  uri = env_url 'http://sushi.com', 'a' => [1, 2] do |conn|
225
276
  conn.options.params_encoder = Faraday::FlatParamsEncoder
226
277
  end
227
- assert_equal "a=1&a=2", uri.query
278
+ assert_equal 'a=1&a=2', uri.query
228
279
  end
229
280
 
230
281
  def test_build_exclusive_url_parses_url
231
282
  conn = Faraday::Connection.new
232
- uri = conn.build_exclusive_url("http://sushi.com/sake.html")
233
- assert_equal "http", uri.scheme
234
- assert_equal "sushi.com", uri.host
283
+ uri = conn.build_exclusive_url('http://sushi.com/sake.html')
284
+ assert_equal 'http', uri.scheme
285
+ assert_equal 'sushi.com', uri.host
235
286
  assert_equal '/sake.html', uri.path
236
287
  end
237
288
 
238
289
  def test_build_exclusive_url_parses_url_and_changes_scheme
239
- conn = Faraday::Connection.new :url => "http://sushi.com/sushi"
290
+ conn = Faraday::Connection.new :url => 'http://sushi.com/sushi'
240
291
  conn.scheme = 'https'
241
- uri = conn.build_exclusive_url("sake.html")
292
+ uri = conn.build_exclusive_url('sake.html')
242
293
  assert_equal 'https://sushi.com/sushi/sake.html', uri.to_s
243
294
  end
244
295
 
245
296
  def test_build_exclusive_url_joins_url_to_base_with_ending_slash
246
- conn = Faraday::Connection.new :url => "http://sushi.com/sushi/"
247
- uri = conn.build_exclusive_url("sake.html")
297
+ conn = Faraday::Connection.new :url => 'http://sushi.com/sushi/'
298
+ uri = conn.build_exclusive_url('sake.html')
248
299
  assert_equal 'http://sushi.com/sushi/sake.html', uri.to_s
249
300
  end
250
301
 
251
302
  def test_build_exclusive_url_used_default_base_with_ending_slash
252
- conn = Faraday::Connection.new :url => "http://sushi.com/sushi/"
303
+ conn = Faraday::Connection.new :url => 'http://sushi.com/sushi/'
253
304
  uri = conn.build_exclusive_url
254
305
  assert_equal 'http://sushi.com/sushi/', uri.to_s
255
306
  end
256
307
 
257
308
  def test_build_exclusive_url_overrides_base
258
- conn = Faraday::Connection.new :url => "http://sushi.com/sushi/"
309
+ conn = Faraday::Connection.new :url => 'http://sushi.com/sushi/'
259
310
  uri = conn.build_exclusive_url('/sake/')
260
311
  assert_equal 'http://sushi.com/sake/', uri.to_s
261
312
  end
@@ -267,48 +318,48 @@ class TestConnection < Faraday::TestCase
267
318
  end
268
319
 
269
320
  def test_proxy_accepts_string
270
- with_env 'http_proxy', "http://duncan.proxy.com:80" do
321
+ with_env 'http_proxy' => 'http://duncan.proxy.com:80' do
271
322
  conn = Faraday::Connection.new
272
- conn.proxy 'http://proxy.com'
323
+ conn.proxy = 'http://proxy.com'
273
324
  assert_equal 'proxy.com', conn.proxy.host
274
325
  end
275
326
  end
276
327
 
277
328
  def test_proxy_accepts_uri
278
- with_env 'http_proxy', "http://duncan.proxy.com:80" do
329
+ with_env 'http_proxy' => 'http://duncan.proxy.com:80' do
279
330
  conn = Faraday::Connection.new
280
- conn.proxy URI.parse('http://proxy.com')
331
+ conn.proxy = URI.parse('http://proxy.com')
281
332
  assert_equal 'proxy.com', conn.proxy.host
282
333
  end
283
334
  end
284
335
 
285
336
  def test_proxy_accepts_hash_with_string_uri
286
- with_env 'http_proxy', "http://duncan.proxy.com:80" do
337
+ with_env 'http_proxy' => 'http://duncan.proxy.com:80' do
287
338
  conn = Faraday::Connection.new
288
- conn.proxy :uri => 'http://proxy.com', :user => 'rick'
339
+ conn.proxy = {:uri => 'http://proxy.com', :user => 'rick'}
289
340
  assert_equal 'proxy.com', conn.proxy.host
290
341
  assert_equal 'rick', conn.proxy.user
291
342
  end
292
343
  end
293
344
 
294
345
  def test_proxy_accepts_hash
295
- with_env 'http_proxy', "http://duncan.proxy.com:80" do
346
+ with_env 'http_proxy' => 'http://duncan.proxy.com:80' do
296
347
  conn = Faraday::Connection.new
297
- conn.proxy :uri => URI.parse('http://proxy.com'), :user => 'rick'
348
+ conn.proxy = {:uri => URI.parse('http://proxy.com'), :user => 'rick'}
298
349
  assert_equal 'proxy.com', conn.proxy.host
299
350
  assert_equal 'rick', conn.proxy.user
300
351
  end
301
352
  end
302
353
 
303
354
  def test_proxy_accepts_http_env
304
- with_env 'http_proxy', "http://duncan.proxy.com:80" do
355
+ with_env 'http_proxy' => 'http://duncan.proxy.com:80' do
305
356
  conn = Faraday::Connection.new
306
357
  assert_equal 'duncan.proxy.com', conn.proxy.host
307
358
  end
308
359
  end
309
360
 
310
361
  def test_proxy_accepts_http_env_with_auth
311
- with_env 'http_proxy', "http://a%40b:my%20pass@duncan.proxy.com:80" do
362
+ with_env 'http_proxy' => 'http://a%40b:my%20pass@duncan.proxy.com:80' do
312
363
  conn = Faraday::Connection.new
313
364
  assert_equal 'a@b', conn.proxy.user
314
365
  assert_equal 'my pass', conn.proxy.password
@@ -316,7 +367,7 @@ class TestConnection < Faraday::TestCase
316
367
  end
317
368
 
318
369
  def test_proxy_accepts_env_without_scheme
319
- with_env 'http_proxy', "localhost:8888" do
370
+ with_env 'http_proxy' => 'localhost:8888' do
320
371
  uri = Faraday::Connection.new.proxy[:uri]
321
372
  assert_equal 'localhost', uri.host
322
373
  assert_equal 8888, uri.port
@@ -324,30 +375,123 @@ class TestConnection < Faraday::TestCase
324
375
  end
325
376
 
326
377
  def test_no_proxy_from_env
327
- with_env 'http_proxy', nil do
378
+ with_env 'http_proxy' => nil do
328
379
  conn = Faraday::Connection.new
329
- assert_equal nil, conn.proxy
380
+ assert_nil conn.proxy
330
381
  end
331
382
  end
332
383
 
333
384
  def test_no_proxy_from_blank_env
334
- with_env 'http_proxy', '' do
385
+ with_env 'http_proxy' => '' do
335
386
  conn = Faraday::Connection.new
336
- assert_equal nil, conn.proxy
387
+ assert_nil conn.proxy
337
388
  end
338
389
  end
339
390
 
340
391
  def test_proxy_doesnt_accept_uppercase_env
341
- with_env 'HTTP_PROXY', "http://localhost:8888/" do
392
+ with_env 'HTTP_PROXY' => 'http://localhost:8888/' do
342
393
  conn = Faraday::Connection.new
343
394
  assert_nil conn.proxy
344
395
  end
345
396
  end
346
397
 
398
+ def test_dynamic_proxy
399
+ with_test_conn do
400
+ with_env 'http_proxy' => 'http://duncan.proxy.com:80' do
401
+ Faraday.get('http://google.co.uk')
402
+ assert_equal 'duncan.proxy.com', Faraday.default_connection.instance_variable_get('@temp_proxy').host
403
+ end
404
+ Faraday.get('http://google.co.uk')
405
+ assert_nil Faraday.default_connection.instance_variable_get('@temp_proxy')
406
+ end
407
+ end
408
+
409
+ def test_ignore_env_proxy
410
+ with_env_proxy_disabled do
411
+ with_env 'http_proxy' => 'http://duncan.proxy.com:80' do
412
+ conn = Faraday::Connection.new(proxy: nil)
413
+ assert_nil conn.proxy
414
+ end
415
+ end
416
+ end
417
+
418
+ if URI.parse('').respond_to?(:find_proxy)
419
+ def test_proxy_allowed_when_url_in_no_proxy_list
420
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
421
+ conn = Faraday::Connection.new('http://example.com')
422
+ assert_nil conn.proxy
423
+ end
424
+ end
425
+
426
+ def test_proxy_allowed_when_prefixed_url_is_not_in_no_proxy_list
427
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
428
+ conn = Faraday::Connection.new('http://prefixedexample.com')
429
+ assert_equal 'proxy.com', conn.proxy.host
430
+ end
431
+ end
432
+
433
+ def test_proxy_allowed_when_subdomain_url_is_in_no_proxy_list
434
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example.com' do
435
+ conn = Faraday::Connection.new('http://subdomain.example.com')
436
+ assert_nil conn.proxy
437
+ end
438
+ end
439
+
440
+ def test_proxy_allowed_when_url_not_in_no_proxy_list
441
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example2.com' do
442
+ conn = Faraday::Connection.new('http://example.com')
443
+ assert_equal 'proxy.com', conn.proxy.host
444
+ end
445
+ end
446
+
447
+ def test_proxy_allowed_when_ip_address_is_not_in_no_proxy_list_but_url_is
448
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'localhost' do
449
+ conn = Faraday::Connection.new('http://127.0.0.1')
450
+ assert_nil conn.proxy
451
+ end
452
+ end
453
+
454
+ def test_proxy_allowed_when_url_is_not_in_no_proxy_list_but_ip_address_is
455
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => '127.0.0.1' do
456
+ conn = Faraday::Connection.new('http://localhost')
457
+ assert_nil conn.proxy
458
+ end
459
+ end
460
+
461
+ def test_proxy_allowed_in_multi_element_no_proxy_list
462
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'example0.com,example.com,example1.com' do
463
+ assert_nil Faraday::Connection.new('http://example0.com').proxy
464
+ assert_nil Faraday::Connection.new('http://example.com').proxy
465
+ assert_nil Faraday::Connection.new('http://example1.com').proxy
466
+ assert_equal 'proxy.com', Faraday::Connection.new('http://example2.com').proxy.host
467
+ end
468
+ end
469
+
470
+ def test_dynamic_no_proxy
471
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'google.co.uk' do
472
+ conn = Faraday.new
473
+
474
+ assert_equal 'proxy.com', conn.instance_variable_get('@temp_proxy').host
475
+ conn.get('https://google.co.uk')
476
+ assert_nil conn.instance_variable_get('@temp_proxy')
477
+ end
478
+ end
479
+
480
+ def test_issue
481
+ with_env 'http_proxy' => 'http://proxy.com', 'no_proxy' => 'google.co.uk' do
482
+ conn = Faraday.new
483
+ conn.proxy = 'http://proxy2.com'
484
+
485
+ assert_equal true, conn.instance_variable_get('@manual_proxy')
486
+ assert_equal 'proxy2.com', conn.proxy_for_request('https://google.co.uk').host
487
+ end
488
+ end
489
+ end
490
+
347
491
  def test_proxy_requires_uri
348
492
  conn = Faraday::Connection.new
349
493
  assert_raises ArgumentError do
350
- conn.proxy :uri => :bad_uri, :user => 'rick'
494
+ conn.proxy = {:uri => :bad_uri, :user => 'rick'}
351
495
  end
352
496
  end
353
497
 
@@ -355,7 +499,8 @@ class TestConnection < Faraday::TestCase
355
499
  conn = Faraday::Connection.new 'http://sushi.com/foo',
356
500
  :ssl => { :verify => :none },
357
501
  :headers => {'content-type' => 'text/plain'},
358
- :params => {'a'=>'1'}
502
+ :params => {'a'=>'1'},
503
+ :request => {:timeout => 5}
359
504
 
360
505
  other = conn.dup
361
506
 
@@ -366,11 +511,14 @@ class TestConnection < Faraday::TestCase
366
511
  other.basic_auth('', '')
367
512
  other.headers['content-length'] = 12
368
513
  other.params['b'] = '2'
514
+ other.options[:open_timeout] = 10
369
515
 
370
516
  assert_equal 2, other.builder.handlers.size
371
517
  assert_equal 2, conn.builder.handlers.size
372
518
  assert !conn.headers.key?('content-length')
373
519
  assert !conn.params.key?('b')
520
+ assert_equal 5, other.options[:timeout]
521
+ assert_nil conn.options[:open_timeout]
374
522
  end
375
523
 
376
524
  def test_initialize_with_false_option
@@ -393,6 +541,61 @@ class TestConnection < Faraday::TestCase
393
541
  assert_equal '/omnom', conn.path_prefix
394
542
  end
395
543
 
544
+ def test_respond_to
545
+ assert Faraday.respond_to?(:get)
546
+ assert Faraday.respond_to?(:post)
547
+ end
548
+
549
+ def test_default_connection_options
550
+ Faraday.default_connection_options.request.timeout = 10
551
+ conn = Faraday.new 'http://sushi.com/foo'
552
+ assert_equal 10, conn.options.timeout
553
+ end
554
+
555
+ def test_default_connection_options_without_url
556
+ Faraday.default_connection_options.request.timeout = 10
557
+ conn = Faraday.new :url => 'http://sushi.com/foo'
558
+ assert_equal 10, conn.options.timeout
559
+ end
560
+
561
+ def test_default_connection_options_as_hash
562
+ Faraday.default_connection_options = { request: { timeout: 10 } }
563
+ conn = Faraday.new 'http://sushi.com/foo'
564
+ assert_equal 10, conn.options.timeout
565
+ end
566
+
567
+ def test_default_connection_options_as_hash_without_url
568
+ Faraday.default_connection_options = { request: { timeout: 10 } }
569
+ conn = Faraday.new :url => 'http://sushi.com/foo'
570
+ assert_equal 10, conn.options.timeout
571
+ end
572
+
573
+ def test_default_connection_options_as_hash_with_instance_connection_options
574
+ Faraday.default_connection_options = { request: { timeout: 10 } }
575
+ conn = Faraday.new 'http://sushi.com/foo', request: { open_timeout: 1 }
576
+ assert_equal 1, conn.options.open_timeout
577
+ assert_equal 10, conn.options.timeout
578
+ end
579
+
580
+ def test_default_connection_options_persist_with_an_instance_overriding
581
+ Faraday.default_connection_options.request.timeout = 10
582
+ conn = Faraday.new 'http://nigiri.com/bar'
583
+ conn.options.timeout = 1
584
+ assert_equal 10, Faraday.default_connection_options.request.timeout
585
+
586
+ other = Faraday.new :url => 'https://sushi.com/foo'
587
+ other.options.timeout = 1
588
+
589
+ assert_equal 10, Faraday.default_connection_options.request.timeout
590
+ end
591
+
592
+ def test_default_connection_uses_default_connection_options
593
+ Faraday.default_connection_options.request.timeout = 10
594
+ default_conn = Faraday.default_connection
595
+
596
+ assert_equal 10, default_conn.options.timeout
597
+ end
598
+
396
599
  def env_url(url, params)
397
600
  conn = Faraday::Connection.new(url, :params => params)
398
601
  yield(conn) if block_given?
@@ -485,7 +688,7 @@ class TestRequestParams < Faraday::TestCase
485
688
  with_default_params_encoder(nil) do
486
689
  create_connection 'http://a.co/page1?color[]=red&color[]=blue'
487
690
  query = get
488
- assert_equal "color%5B%5D=red&color%5B%5D=blue", query
691
+ assert_equal 'color%5B%5D=red&color%5B%5D=blue', query
489
692
  end
490
693
  end
491
694
 
@@ -493,7 +696,7 @@ class TestRequestParams < Faraday::TestCase
493
696
  with_default_params_encoder(nil) do
494
697
  create_connection 'http://a.co/page1', :params => {:color => ['red', 'blue']}
495
698
  query = get
496
- assert_equal "color%5B%5D=red&color%5B%5D=blue", query
699
+ assert_equal 'color%5B%5D=red&color%5B%5D=blue', query
497
700
  end
498
701
  end
499
702
 
@@ -501,7 +704,7 @@ class TestRequestParams < Faraday::TestCase
501
704
  with_default_params_encoder(Faraday::FlatParamsEncoder) do
502
705
  create_connection 'http://a.co/page1?color=red&color=blue'
503
706
  query = get
504
- assert_equal "color=red&color=blue", query
707
+ assert_equal 'color=red&color=blue', query
505
708
  end
506
709
  end
507
710
 
@@ -509,8 +712,21 @@ class TestRequestParams < Faraday::TestCase
509
712
  with_default_params_encoder(Faraday::FlatParamsEncoder) do
510
713
  create_connection 'http://a.co/page1', :params => {:color => ['red', 'blue']}
511
714
  query = get
512
- assert_equal "color=red&color=blue", query
715
+ assert_equal 'color=red&color=blue', query
716
+ end
717
+ end
718
+
719
+ def test_params_with_connection_options
720
+ encoder = Object.new
721
+ def encoder.encode(params)
722
+ params.map { |k,v| "#{k.upcase}-#{v.upcase}" }.join(',')
723
+ end
724
+
725
+ create_connection :params => {:color => 'red'}
726
+ query = get('', :feeling => 'blue') do |req|
727
+ req.options.params_encoder = encoder
513
728
  end
729
+ assert_equal ['COLOR-RED', 'FEELING-BLUE'], query.split(',').sort
514
730
  end
515
731
 
516
732
  def get(*args)