faraday 0.16.1 → 0.17.4

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +232 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +358 -18
  5. data/Rakefile +13 -0
  6. data/lib/faraday.rb +174 -93
  7. data/lib/faraday/adapter.rb +22 -36
  8. data/lib/faraday/adapter/em_http.rb +97 -140
  9. data/lib/faraday/adapter/em_http_ssl_patch.rb +17 -23
  10. data/lib/faraday/adapter/em_synchrony.rb +60 -104
  11. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +15 -18
  12. data/lib/faraday/adapter/excon.rb +55 -100
  13. data/lib/faraday/adapter/httpclient.rb +39 -61
  14. data/lib/faraday/adapter/net_http.rb +51 -103
  15. data/lib/faraday/adapter/net_http_persistent.rb +28 -49
  16. data/lib/faraday/adapter/patron.rb +35 -54
  17. data/lib/faraday/adapter/rack.rb +12 -28
  18. data/lib/faraday/adapter/test.rb +53 -86
  19. data/lib/faraday/adapter/typhoeus.rb +1 -4
  20. data/lib/faraday/autoload.rb +36 -47
  21. data/lib/faraday/connection.rb +179 -321
  22. data/lib/faraday/deprecate.rb +109 -0
  23. data/lib/faraday/error.rb +72 -28
  24. data/lib/faraday/middleware.rb +28 -4
  25. data/lib/faraday/options.rb +183 -32
  26. data/lib/faraday/parameters.rb +197 -4
  27. data/lib/faraday/rack_builder.rb +55 -66
  28. data/lib/faraday/request.rb +36 -68
  29. data/lib/faraday/request/authorization.rb +30 -42
  30. data/lib/faraday/request/basic_authentication.rb +7 -14
  31. data/lib/faraday/request/instrumentation.rb +27 -45
  32. data/lib/faraday/request/multipart.rb +48 -79
  33. data/lib/faraday/request/retry.rb +171 -197
  34. data/lib/faraday/request/token_authentication.rb +10 -15
  35. data/lib/faraday/request/url_encoded.rb +23 -41
  36. data/lib/faraday/response.rb +13 -20
  37. data/lib/faraday/response/logger.rb +69 -22
  38. data/lib/faraday/response/raise_error.rb +18 -36
  39. data/lib/faraday/upload_io.rb +67 -0
  40. data/lib/faraday/utils.rb +245 -28
  41. data/spec/faraday/deprecate_spec.rb +147 -0
  42. data/spec/faraday/error_spec.rb +102 -0
  43. data/spec/faraday/response/raise_error_spec.rb +106 -0
  44. data/spec/spec_helper.rb +105 -0
  45. data/test/adapters/default_test.rb +14 -0
  46. data/test/adapters/em_http_test.rb +30 -0
  47. data/test/adapters/em_synchrony_test.rb +32 -0
  48. data/test/adapters/excon_test.rb +30 -0
  49. data/test/adapters/httpclient_test.rb +34 -0
  50. data/test/adapters/integration.rb +263 -0
  51. data/test/adapters/logger_test.rb +136 -0
  52. data/test/adapters/net_http_persistent_test.rb +114 -0
  53. data/test/adapters/net_http_test.rb +79 -0
  54. data/test/adapters/patron_test.rb +40 -0
  55. data/test/adapters/rack_test.rb +38 -0
  56. data/test/adapters/test_middleware_test.rb +157 -0
  57. data/test/adapters/typhoeus_test.rb +38 -0
  58. data/test/authentication_middleware_test.rb +65 -0
  59. data/test/composite_read_io_test.rb +109 -0
  60. data/test/connection_test.rb +738 -0
  61. data/test/env_test.rb +268 -0
  62. data/test/helper.rb +75 -0
  63. data/test/live_server.rb +67 -0
  64. data/test/middleware/instrumentation_test.rb +88 -0
  65. data/test/middleware/retry_test.rb +282 -0
  66. data/test/middleware_stack_test.rb +260 -0
  67. data/test/multibyte.txt +1 -0
  68. data/test/options_test.rb +333 -0
  69. data/test/parameters_test.rb +157 -0
  70. data/test/request_middleware_test.rb +126 -0
  71. data/test/response_middleware_test.rb +72 -0
  72. data/test/strawberry.rb +2 -0
  73. data/test/utils_test.rb +98 -0
  74. metadata +50 -26
  75. data/lib/faraday/adapter_registry.rb +0 -28
  76. data/lib/faraday/dependency_loader.rb +0 -37
  77. data/lib/faraday/deprecated_constant.rb +0 -53
  78. data/lib/faraday/encoders/flat_params_encoder.rb +0 -94
  79. data/lib/faraday/encoders/nested_params_encoder.rb +0 -171
  80. data/lib/faraday/file_part.rb +0 -128
  81. data/lib/faraday/logging/formatter.rb +0 -92
  82. data/lib/faraday/middleware_registry.rb +0 -129
  83. data/lib/faraday/options/connection_options.rb +0 -22
  84. data/lib/faraday/options/env.rb +0 -181
  85. data/lib/faraday/options/proxy_options.rb +0 -28
  86. data/lib/faraday/options/request_options.rb +0 -21
  87. data/lib/faraday/options/ssl_options.rb +0 -59
  88. data/lib/faraday/param_part.rb +0 -53
  89. data/lib/faraday/utils/headers.rb +0 -139
  90. data/lib/faraday/utils/params_hash.rb +0 -61
  91. data/spec/external_adapters/faraday_specs_setup.rb +0 -14
@@ -0,0 +1,126 @@
1
+ # encoding: utf-8
2
+ require File.expand_path('../helper', __FILE__)
3
+
4
+ Faraday::CompositeReadIO.class_eval { attr_reader :ios }
5
+
6
+ class RequestMiddlewareTest < Faraday::TestCase
7
+ def conn
8
+ Faraday.new do |b|
9
+ b.request :multipart
10
+ b.request :url_encoded
11
+ b.adapter :test do |stub|
12
+ stub.post('/echo') do |env|
13
+ posted_as = env[:request_headers]['Content-Type']
14
+ [200, {'Content-Type' => posted_as}, env[:body]]
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ def test_does_nothing_without_payload
21
+ response = conn.post('/echo')
22
+ assert_nil response.headers['Content-Type']
23
+ assert response.body.empty?
24
+ end
25
+
26
+ def test_ignores_custom_content_type
27
+ response = conn.post('/echo', { :some => 'data' }, 'content-type' => 'application/x-foo')
28
+ assert_equal 'application/x-foo', response.headers['Content-Type']
29
+ assert_equal({ :some => 'data' }, response.body)
30
+ end
31
+
32
+ def test_url_encoded_no_header
33
+ response = conn.post('/echo', { :fruit => %w[apples oranges] })
34
+ assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
35
+ assert_equal 'fruit%5B%5D=apples&fruit%5B%5D=oranges', response.body
36
+ end
37
+
38
+ def test_url_encoded_with_header
39
+ response = conn.post('/echo', {'a'=>123}, 'content-type' => 'application/x-www-form-urlencoded')
40
+ assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
41
+ assert_equal 'a=123', response.body
42
+ end
43
+
44
+ def test_url_encoded_nested
45
+ response = conn.post('/echo', { :user => {:name => 'Mislav', :web => 'mislav.net'} })
46
+ assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
47
+ expected = { 'user' => {'name' => 'Mislav', 'web' => 'mislav.net'} }
48
+ assert_equal expected, Faraday::Utils.parse_nested_query(response.body)
49
+ end
50
+
51
+ def test_url_encoded_non_nested
52
+ response = conn.post('/echo', { :dimensions => ['date', 'location']}) do |req|
53
+ req.options.params_encoder = Faraday::FlatParamsEncoder
54
+ end
55
+ assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
56
+ expected = { 'dimensions' => ['date', 'location'] }
57
+ assert_equal expected, Faraday::Utils.parse_query(response.body)
58
+ assert_equal 'dimensions=date&dimensions=location', response.body
59
+ end
60
+
61
+ def test_url_encoded_unicode
62
+ err = capture_warnings {
63
+ response = conn.post('/echo', {:str => "eé cç aã aâ"})
64
+ assert_equal "str=e%C3%A9+c%C3%A7+a%C3%A3+a%C3%A2", response.body
65
+ }
66
+ assert err.empty?, "stderr did include: #{err}"
67
+ end
68
+
69
+ def test_url_encoded_nested_keys
70
+ response = conn.post('/echo', {'a'=>{'b'=>{'c'=>['d']}}})
71
+ assert_equal "a%5Bb%5D%5Bc%5D%5B%5D=d", response.body
72
+ end
73
+
74
+ def test_multipart
75
+ # assume params are out of order
76
+ regexes = [
77
+ /name\=\"a\"/,
78
+ /name=\"b\[c\]\"\; filename\=\"request_middleware_test\.rb\"/,
79
+ /name=\"b\[d\]\"/]
80
+
81
+ payload = {:a => 1, :b => {:c => Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), :d => 2}}
82
+ response = conn.post('/echo', payload)
83
+
84
+ assert_kind_of Faraday::CompositeReadIO, response.body
85
+ assert response.headers['Content-Type'].start_with?(
86
+ "multipart/form-data; boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY_PREFIX,
87
+ )
88
+
89
+ response.body.send(:ios).map{|io| io.read}.each do |io|
90
+ if re = regexes.detect { |r| io =~ r }
91
+ regexes.delete re
92
+ end
93
+ end
94
+ assert_equal [], regexes
95
+ end
96
+
97
+ def test_multipart_with_arrays
98
+ # assume params are out of order
99
+ regexes = [
100
+ /name\=\"a\"/,
101
+ /name=\"b\[\]\[c\]\"\; filename\=\"request_middleware_test\.rb\"/,
102
+ /name=\"b\[\]\[d\]\"/]
103
+
104
+ payload = {:a => 1, :b =>[{:c => Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), :d => 2}]}
105
+ response = conn.post('/echo', payload)
106
+
107
+ assert_kind_of Faraday::CompositeReadIO, response.body
108
+ assert response.headers['Content-Type'].start_with?(
109
+ "multipart/form-data; boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY_PREFIX,
110
+ )
111
+
112
+ response.body.send(:ios).map{|io| io.read}.each do |io|
113
+ if re = regexes.detect { |r| io =~ r }
114
+ regexes.delete re
115
+ end
116
+ end
117
+ assert_equal [], regexes
118
+ end
119
+
120
+ def test_multipart_unique_boundary
121
+ payload = {:a => 1, :b =>[{:c => Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), :d => 2}]}
122
+ response1 = conn.post('/echo', payload)
123
+ response2 = conn.post('/echo', payload)
124
+ assert response1.headers['Content-Type'] != response2.headers['Content-Type']
125
+ end
126
+ end
@@ -0,0 +1,72 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class ResponseMiddlewareTest < Faraday::TestCase
4
+ def setup
5
+ @conn = Faraday.new do |b|
6
+ b.response :raise_error
7
+ b.adapter :test do |stub|
8
+ stub.get('ok') { [200, {'Content-Type' => 'text/html'}, '<body></body>'] }
9
+ stub.get('not-found') { [404, {'X-Reason' => 'because'}, 'keep looking'] }
10
+ stub.get('error') { [500, {'X-Error' => 'bailout'}, 'fail'] }
11
+ end
12
+ end
13
+ end
14
+
15
+ class ResponseUpcaser < Faraday::Response::Middleware
16
+ def parse(body)
17
+ body.upcase
18
+ end
19
+ end
20
+
21
+ def test_success
22
+ assert @conn.get('ok')
23
+ end
24
+
25
+ def test_raises_not_found
26
+ error = assert_raises Faraday::ResourceNotFound do
27
+ @conn.get('not-found')
28
+ end
29
+ assert_equal 'the server responded with status 404', error.message
30
+ assert_equal 'because', error.response[:headers]['X-Reason']
31
+ end
32
+
33
+ def test_raises_error
34
+ error = assert_raises Faraday::ClientError do
35
+ @conn.get('error')
36
+ end
37
+ assert_equal 'the server responded with status 500', error.message
38
+ assert_equal 'bailout', error.response[:headers]['X-Error']
39
+ end
40
+
41
+ def test_upcase
42
+ @conn.builder.insert(0, ResponseUpcaser)
43
+ assert_equal '<BODY></BODY>', @conn.get('ok').body
44
+ end
45
+ end
46
+
47
+ class ResponseNoBodyMiddleWareTest < Faraday::TestCase
48
+ def setup
49
+ @conn = Faraday.new do |b|
50
+ b.response :raise_error
51
+ b.adapter :test do |stub|
52
+ stub.get('not_modified') { [304, nil, nil] }
53
+ stub.get('no_content') { [204, nil, nil] }
54
+ end
55
+ end
56
+ @conn.builder.insert(0, NotCalled)
57
+ end
58
+
59
+ class NotCalled < Faraday::Response::Middleware
60
+ def parse(body)
61
+ raise "this should not be called"
62
+ end
63
+ end
64
+
65
+ def test_204
66
+ assert_nil @conn.get('no_content').body
67
+ end
68
+
69
+ def test_304
70
+ assert_nil @conn.get('not_modified').body
71
+ end
72
+ end
@@ -0,0 +1,2 @@
1
+ class MiddlewareStackTest::Strawberry < MiddlewareStackTest::Handler
2
+ end
@@ -0,0 +1,98 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestUtils < Faraday::TestCase
4
+
5
+ # Headers parsing
6
+
7
+ def test_headers
8
+ "HTTP/1.x 500 OK\r\nContent-Type: text/html; charset=UTF-8\r\n" \
9
+ "HTTP/1.x 200 OK\r\nContent-Type: application/json; charset=UTF-8\r\n\r\n"
10
+ end
11
+
12
+ def test_headers_parsing_for_aggregated_responses
13
+ headers = Faraday::Utils::Headers.new()
14
+ headers.parse(test_headers)
15
+
16
+ result = headers.to_hash
17
+
18
+ assert_equal result["Content-Type"], "application/json; charset=UTF-8"
19
+ end
20
+
21
+ # URI parsing
22
+
23
+ def setup
24
+ @url = "http://example.com/abc"
25
+ end
26
+
27
+ # emulates ActiveSupport::SafeBuffer#gsub
28
+ FakeSafeBuffer = Struct.new(:string) do
29
+ def to_s() self end
30
+ def gsub(regex)
31
+ string.gsub(regex) {
32
+ match, = $&, '' =~ /a/
33
+ yield(match)
34
+ }
35
+ end
36
+ end
37
+
38
+ def test_escaping_safe_buffer
39
+ str = FakeSafeBuffer.new('$32,000.00')
40
+ assert_equal '%2432%2C000.00', Faraday::Utils.escape(str)
41
+ end
42
+
43
+ def test_parses_with_default
44
+ with_default_uri_parser(nil) do
45
+ uri = normalize(@url)
46
+ assert_equal 'example.com', uri.host
47
+ end
48
+ end
49
+
50
+ def test_parses_with_URI
51
+ with_default_uri_parser(::URI) do
52
+ uri = normalize(@url)
53
+ assert_equal 'example.com', uri.host
54
+ end
55
+ end
56
+
57
+ def test_parses_with_block
58
+ with_default_uri_parser(lambda {|u| "booya#{"!" * u.size}" }) do
59
+ assert_equal 'booya!!!!!!!!!!!!!!!!!!!!!!', normalize(@url)
60
+ end
61
+ end
62
+
63
+ def test_replace_header_hash
64
+ headers = Faraday::Utils::Headers.new('authorization' => 't0ps3cr3t!')
65
+ assert headers.include?('authorization')
66
+
67
+ headers.replace({'content-type' => 'text/plain'})
68
+
69
+ assert !headers.include?('authorization')
70
+ end
71
+
72
+ def normalize(url)
73
+ Faraday::Utils::URI(url)
74
+ end
75
+
76
+ def with_default_uri_parser(parser)
77
+ old_parser = Faraday::Utils.default_uri_parser
78
+ begin
79
+ Faraday::Utils.default_uri_parser = parser
80
+ yield
81
+ ensure
82
+ Faraday::Utils.default_uri_parser = old_parser
83
+ end
84
+ end
85
+
86
+ # YAML parsing
87
+
88
+ def test_headers_yaml_roundtrip
89
+ headers = Faraday::Utils::Headers.new('User-Agent' => 'safari', 'Content-type' => 'text/html')
90
+ result = YAML.load(headers.to_yaml)
91
+
92
+ assert result.include?('user-agent'), 'Unable to hydrate to a correct Headers'
93
+ assert result.include?('content-type'), 'Unable to hydrate to a correct Headers'
94
+ assert result['user-agent'] == 'safari', 'Unable to access rehydrated Headers'
95
+ assert result['content-type'] == 'text/html', 'Unable to access rehydrated Headers'
96
+ end
97
+ end
98
+
metadata CHANGED
@@ -1,14 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.1
4
+ version: 0.17.4
5
5
  platform: ruby
6
6
  authors:
7
- - Rick Olson
7
+ - "@technoweenie"
8
+ - "@iMacTia"
9
+ - "@olleolleolle"
8
10
  autorequire:
9
11
  bindir: bin
10
12
  cert_chain: []
11
- date: 2019-09-27 00:00:00.000000000 Z
13
+ date: 2021-02-06 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
16
  name: multipart-post
@@ -36,8 +38,10 @@ executables: []
36
38
  extensions: []
37
39
  extra_rdoc_files: []
38
40
  files:
41
+ - CHANGELOG.md
39
42
  - LICENSE.md
40
43
  - README.md
44
+ - Rakefile
41
45
  - lib/faraday.rb
42
46
  - lib/faraday/adapter.rb
43
47
  - lib/faraday/adapter/em_http.rb
@@ -52,25 +56,12 @@ files:
52
56
  - lib/faraday/adapter/rack.rb
53
57
  - lib/faraday/adapter/test.rb
54
58
  - lib/faraday/adapter/typhoeus.rb
55
- - lib/faraday/adapter_registry.rb
56
59
  - lib/faraday/autoload.rb
57
60
  - lib/faraday/connection.rb
58
- - lib/faraday/dependency_loader.rb
59
- - lib/faraday/deprecated_constant.rb
60
- - lib/faraday/encoders/flat_params_encoder.rb
61
- - lib/faraday/encoders/nested_params_encoder.rb
61
+ - lib/faraday/deprecate.rb
62
62
  - lib/faraday/error.rb
63
- - lib/faraday/file_part.rb
64
- - lib/faraday/logging/formatter.rb
65
63
  - lib/faraday/middleware.rb
66
- - lib/faraday/middleware_registry.rb
67
64
  - lib/faraday/options.rb
68
- - lib/faraday/options/connection_options.rb
69
- - lib/faraday/options/env.rb
70
- - lib/faraday/options/proxy_options.rb
71
- - lib/faraday/options/request_options.rb
72
- - lib/faraday/options/ssl_options.rb
73
- - lib/faraday/param_part.rb
74
65
  - lib/faraday/parameters.rb
75
66
  - lib/faraday/rack_builder.rb
76
67
  - lib/faraday/request.rb
@@ -84,32 +75,65 @@ files:
84
75
  - lib/faraday/response.rb
85
76
  - lib/faraday/response/logger.rb
86
77
  - lib/faraday/response/raise_error.rb
78
+ - lib/faraday/upload_io.rb
87
79
  - lib/faraday/utils.rb
88
- - lib/faraday/utils/headers.rb
89
- - lib/faraday/utils/params_hash.rb
90
- - spec/external_adapters/faraday_specs_setup.rb
91
- homepage: https://github.com/lostisland/faraday
80
+ - spec/faraday/deprecate_spec.rb
81
+ - spec/faraday/error_spec.rb
82
+ - spec/faraday/response/raise_error_spec.rb
83
+ - spec/spec_helper.rb
84
+ - test/adapters/default_test.rb
85
+ - test/adapters/em_http_test.rb
86
+ - test/adapters/em_synchrony_test.rb
87
+ - test/adapters/excon_test.rb
88
+ - test/adapters/httpclient_test.rb
89
+ - test/adapters/integration.rb
90
+ - test/adapters/logger_test.rb
91
+ - test/adapters/net_http_persistent_test.rb
92
+ - test/adapters/net_http_test.rb
93
+ - test/adapters/patron_test.rb
94
+ - test/adapters/rack_test.rb
95
+ - test/adapters/test_middleware_test.rb
96
+ - test/adapters/typhoeus_test.rb
97
+ - test/authentication_middleware_test.rb
98
+ - test/composite_read_io_test.rb
99
+ - test/connection_test.rb
100
+ - test/env_test.rb
101
+ - test/helper.rb
102
+ - test/live_server.rb
103
+ - test/middleware/instrumentation_test.rb
104
+ - test/middleware/retry_test.rb
105
+ - test/middleware_stack_test.rb
106
+ - test/multibyte.txt
107
+ - test/options_test.rb
108
+ - test/parameters_test.rb
109
+ - test/request_middleware_test.rb
110
+ - test/response_middleware_test.rb
111
+ - test/strawberry.rb
112
+ - test/utils_test.rb
113
+ homepage: https://lostisland.github.io/faraday
92
114
  licenses:
93
115
  - MIT
94
- metadata: {}
116
+ metadata:
117
+ homepage_uri: https://lostisland.github.io/faraday
118
+ changelog_uri: https://github.com/lostisland/faraday/blob/master/CHANGELOG.md
119
+ source_code_uri: https://github.com/lostisland/faraday/
120
+ bug_tracker_uri: https://github.com/lostisland/faraday/issues
95
121
  post_install_message:
96
122
  rdoc_options: []
97
123
  require_paths:
98
124
  - lib
99
- - spec/external_adapters
100
125
  required_ruby_version: !ruby/object:Gem::Requirement
101
126
  requirements:
102
127
  - - ">="
103
128
  - !ruby/object:Gem::Version
104
- version: '2.3'
129
+ version: '1.9'
105
130
  required_rubygems_version: !ruby/object:Gem::Requirement
106
131
  requirements:
107
132
  - - ">="
108
133
  - !ruby/object:Gem::Version
109
134
  version: '0'
110
135
  requirements: []
111
- rubyforge_project:
112
- rubygems_version: 2.7.6.2
136
+ rubygems_version: 3.2.3
113
137
  signing_key:
114
138
  specification_version: 4
115
139
  summary: HTTP/REST API client library.
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'monitor'
4
-
5
- module Faraday
6
- # AdapterRegistry registers adapter class names so they can be looked up by a
7
- # String or Symbol name.
8
- class AdapterRegistry
9
- def initialize
10
- @lock = Monitor.new
11
- @constants = {}
12
- end
13
-
14
- def get(name)
15
- klass = @constants[name]
16
- return klass if klass
17
-
18
- Object.const_get(name).tap { |c| set(c, name) }
19
- end
20
-
21
- def set(klass, name = nil)
22
- name ||= klass.to_s
23
- @lock.synchronize do
24
- @constants[name] = klass
25
- end
26
- end
27
- end
28
- end