faraday 0.17.3 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +156 -8
  3. data/LICENSE.md +1 -1
  4. data/README.md +16 -358
  5. data/Rakefile +1 -7
  6. data/examples/client_spec.rb +65 -0
  7. data/examples/client_test.rb +79 -0
  8. data/lib/faraday.rb +120 -189
  9. data/lib/faraday/adapter.rb +77 -22
  10. data/lib/faraday/adapter/em_http.rb +148 -102
  11. data/lib/faraday/adapter/em_http_ssl_patch.rb +24 -18
  12. data/lib/faraday/adapter/em_synchrony.rb +110 -63
  13. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +18 -15
  14. data/lib/faraday/adapter/httpclient.rb +83 -59
  15. data/lib/faraday/adapter/patron.rb +80 -43
  16. data/lib/faraday/adapter/rack.rb +30 -13
  17. data/lib/faraday/adapter/test.rb +86 -53
  18. data/lib/faraday/adapter/typhoeus.rb +4 -1
  19. data/lib/faraday/adapter_registry.rb +30 -0
  20. data/lib/faraday/autoload.rb +44 -36
  21. data/lib/faraday/connection.rb +313 -182
  22. data/lib/faraday/dependency_loader.rb +37 -0
  23. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  24. data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
  25. data/lib/faraday/error.rb +29 -35
  26. data/lib/faraday/file_part.rb +128 -0
  27. data/lib/faraday/logging/formatter.rb +105 -0
  28. data/lib/faraday/methods.rb +6 -0
  29. data/lib/faraday/middleware.rb +19 -25
  30. data/lib/faraday/middleware_registry.rb +129 -0
  31. data/lib/faraday/options.rb +36 -191
  32. data/lib/faraday/options/connection_options.rb +22 -0
  33. data/lib/faraday/options/env.rb +181 -0
  34. data/lib/faraday/options/proxy_options.rb +28 -0
  35. data/lib/faraday/options/request_options.rb +22 -0
  36. data/lib/faraday/options/ssl_options.rb +59 -0
  37. data/lib/faraday/param_part.rb +53 -0
  38. data/lib/faraday/parameters.rb +4 -197
  39. data/lib/faraday/rack_builder.rb +76 -64
  40. data/lib/faraday/request.rb +86 -44
  41. data/lib/faraday/request/authorization.rb +44 -30
  42. data/lib/faraday/request/basic_authentication.rb +14 -7
  43. data/lib/faraday/request/instrumentation.rb +45 -27
  44. data/lib/faraday/request/multipart.rb +86 -48
  45. data/lib/faraday/request/retry.rb +197 -171
  46. data/lib/faraday/request/token_authentication.rb +15 -10
  47. data/lib/faraday/request/url_encoded.rb +43 -23
  48. data/lib/faraday/response.rb +24 -20
  49. data/lib/faraday/response/logger.rb +22 -69
  50. data/lib/faraday/response/raise_error.rb +49 -18
  51. data/lib/faraday/utils.rb +38 -247
  52. data/lib/faraday/utils/headers.rb +139 -0
  53. data/lib/faraday/utils/params_hash.rb +61 -0
  54. data/lib/faraday/version.rb +5 -0
  55. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  56. data/spec/faraday/adapter/em_http_spec.rb +47 -0
  57. data/spec/faraday/adapter/em_synchrony_spec.rb +16 -0
  58. data/spec/faraday/adapter/excon_spec.rb +49 -0
  59. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  60. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  61. data/spec/faraday/adapter/patron_spec.rb +18 -0
  62. data/spec/faraday/adapter/rack_spec.rb +8 -0
  63. data/spec/faraday/adapter/test_spec.rb +260 -0
  64. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  65. data/spec/faraday/adapter_registry_spec.rb +28 -0
  66. data/spec/faraday/adapter_spec.rb +55 -0
  67. data/spec/faraday/composite_read_io_spec.rb +80 -0
  68. data/spec/faraday/connection_spec.rb +721 -0
  69. data/spec/faraday/error_spec.rb +12 -54
  70. data/spec/faraday/middleware_spec.rb +52 -0
  71. data/spec/faraday/options/env_spec.rb +70 -0
  72. data/spec/faraday/options/options_spec.rb +297 -0
  73. data/spec/faraday/options/proxy_options_spec.rb +37 -0
  74. data/spec/faraday/options/request_options_spec.rb +19 -0
  75. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  76. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  77. data/spec/faraday/rack_builder_spec.rb +345 -0
  78. data/spec/faraday/request/authorization_spec.rb +88 -0
  79. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  80. data/spec/faraday/request/multipart_spec.rb +302 -0
  81. data/spec/faraday/request/retry_spec.rb +242 -0
  82. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  83. data/spec/faraday/request_spec.rb +120 -0
  84. data/spec/faraday/response/logger_spec.rb +220 -0
  85. data/spec/faraday/response/middleware_spec.rb +68 -0
  86. data/spec/faraday/response/raise_error_spec.rb +78 -15
  87. data/spec/faraday/response_spec.rb +75 -0
  88. data/spec/faraday/utils/headers_spec.rb +82 -0
  89. data/spec/faraday/utils_spec.rb +56 -0
  90. data/spec/faraday_spec.rb +37 -0
  91. data/spec/spec_helper.rb +63 -36
  92. data/spec/support/disabling_stub.rb +14 -0
  93. data/spec/support/fake_safe_buffer.rb +15 -0
  94. data/spec/support/helper_methods.rb +133 -0
  95. data/spec/support/shared_examples/adapter.rb +105 -0
  96. data/spec/support/shared_examples/params_encoder.rb +18 -0
  97. data/spec/support/shared_examples/request_method.rb +262 -0
  98. data/spec/support/streaming_response_checker.rb +35 -0
  99. data/spec/support/webmock_rack_app.rb +68 -0
  100. metadata +124 -41
  101. data/lib/faraday/adapter/excon.rb +0 -82
  102. data/lib/faraday/adapter/net_http.rb +0 -152
  103. data/lib/faraday/adapter/net_http_persistent.rb +0 -68
  104. data/lib/faraday/deprecate.rb +0 -107
  105. data/lib/faraday/upload_io.rb +0 -67
  106. data/spec/faraday/deprecate_spec.rb +0 -69
  107. data/test/adapters/default_test.rb +0 -14
  108. data/test/adapters/em_http_test.rb +0 -30
  109. data/test/adapters/em_synchrony_test.rb +0 -32
  110. data/test/adapters/excon_test.rb +0 -30
  111. data/test/adapters/httpclient_test.rb +0 -34
  112. data/test/adapters/integration.rb +0 -263
  113. data/test/adapters/logger_test.rb +0 -136
  114. data/test/adapters/net_http_persistent_test.rb +0 -114
  115. data/test/adapters/net_http_test.rb +0 -79
  116. data/test/adapters/patron_test.rb +0 -40
  117. data/test/adapters/rack_test.rb +0 -38
  118. data/test/adapters/test_middleware_test.rb +0 -157
  119. data/test/adapters/typhoeus_test.rb +0 -38
  120. data/test/authentication_middleware_test.rb +0 -65
  121. data/test/composite_read_io_test.rb +0 -109
  122. data/test/connection_test.rb +0 -738
  123. data/test/env_test.rb +0 -268
  124. data/test/helper.rb +0 -75
  125. data/test/live_server.rb +0 -67
  126. data/test/middleware/instrumentation_test.rb +0 -88
  127. data/test/middleware/retry_test.rb +0 -282
  128. data/test/middleware_stack_test.rb +0 -260
  129. data/test/multibyte.txt +0 -1
  130. data/test/options_test.rb +0 -333
  131. data/test/parameters_test.rb +0 -157
  132. data/test/request_middleware_test.rb +0 -126
  133. data/test/response_middleware_test.rb +0 -72
  134. data/test/strawberry.rb +0 -2
  135. data/test/utils_test.rb +0 -98
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module StreamingResponseChecker
5
+ def check_streaming_response(streamed, options = {})
6
+ opts = {
7
+ prefix: '',
8
+ streaming?: true
9
+ }.merge(options)
10
+
11
+ expected_response = opts[:prefix] + big_string
12
+
13
+ chunks, sizes = streamed.transpose
14
+
15
+ # Check that the total size of the chunks (via the last size returned)
16
+ # is the same size as the expected_response
17
+ expect(sizes.last).to eq(expected_response.bytesize)
18
+
19
+ start_index = 0
20
+ expected_chunks = []
21
+ chunks.each do |actual_chunk|
22
+ expected_chunk = expected_response[start_index..((start_index + actual_chunk.bytesize) - 1)]
23
+ expected_chunks << expected_chunk
24
+ start_index += expected_chunk.bytesize
25
+ end
26
+
27
+ # it's easier to read a smaller portion, so we check that first
28
+ expect(expected_chunks[0][0..255]).to eq(chunks[0][0..255])
29
+
30
+ [expected_chunks, chunks].transpose.each do |expected, actual|
31
+ expect(actual).to eq(expected)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Rack app used to test the Rack adapter.
4
+ # Uses Webmock to check if requests are registered, in which case it returns
5
+ # the registered response.
6
+ class WebmockRackApp
7
+ def call(env)
8
+ req_signature = WebMock::RequestSignature.new(
9
+ req_method(env),
10
+ req_uri(env),
11
+ body: req_body(env),
12
+ headers: req_headers(env)
13
+ )
14
+
15
+ WebMock::RequestRegistry
16
+ .instance
17
+ .requested_signatures
18
+ .put(req_signature)
19
+
20
+ process_response(req_signature)
21
+ end
22
+
23
+ def req_method(env)
24
+ env['REQUEST_METHOD'].downcase.to_sym
25
+ end
26
+
27
+ def req_uri(env)
28
+ scheme = env['rack.url_scheme']
29
+ host = env['SERVER_NAME']
30
+ port = env['SERVER_PORT']
31
+ path = env['PATH_INFO']
32
+ query = env['QUERY_STRING']
33
+
34
+ url = +"#{scheme}://#{host}:#{port}#{path}"
35
+ url += "?#{query}" if query
36
+
37
+ uri = WebMock::Util::URI.heuristic_parse(url)
38
+ uri.path = uri.normalized_path.gsub('[^:]//', '/')
39
+ uri
40
+ end
41
+
42
+ def req_headers(env)
43
+ http_headers = env.select { |k, _| k.start_with?('HTTP_') }
44
+ .map { |k, v| [k[5..-1], v] }
45
+ .to_h
46
+
47
+ special_headers = Faraday::Adapter::Rack::SPECIAL_HEADERS
48
+ http_headers.merge(env.select { |k, _| special_headers.include?(k) })
49
+ end
50
+
51
+ def req_body(env)
52
+ env['rack.input'].read
53
+ end
54
+
55
+ def process_response(req_signature)
56
+ res = WebMock::StubRegistry.instance.response_for_request(req_signature)
57
+
58
+ if res.nil? && req_signature.uri.host == 'localhost'
59
+ raise Faraday::ConnectionFailed, 'Trying to connect to localhost'
60
+ end
61
+
62
+ raise WebMock::NetConnectNotAllowedError, req_signature unless res
63
+
64
+ raise Faraday::TimeoutError if res.should_timeout
65
+
66
+ [res.status[0], res.headers || {}, [res.body || '']]
67
+ end
68
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.3
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - "@technoweenie"
@@ -10,8 +10,50 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-12-31 00:00:00.000000000 Z
13
+ date: 2021-04-18 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: faraday-excon
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '1.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '1.1'
29
+ - !ruby/object:Gem::Dependency
30
+ name: faraday-net_http
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '1.0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: faraday-net_http_persistent
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.1'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.1'
15
57
  - !ruby/object:Gem::Dependency
16
58
  name: multipart-post
17
59
  requirement: !ruby/object:Gem::Requirement
@@ -32,6 +74,20 @@ dependencies:
32
74
  - - "<"
33
75
  - !ruby/object:Gem::Version
34
76
  version: '3'
77
+ - !ruby/object:Gem::Dependency
78
+ name: ruby2_keywords
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 0.0.4
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 0.0.4
35
91
  description:
36
92
  email: technoweenie@gmail.com
37
93
  executables: []
@@ -42,26 +98,38 @@ files:
42
98
  - LICENSE.md
43
99
  - README.md
44
100
  - Rakefile
101
+ - examples/client_spec.rb
102
+ - examples/client_test.rb
45
103
  - lib/faraday.rb
46
104
  - lib/faraday/adapter.rb
47
105
  - lib/faraday/adapter/em_http.rb
48
106
  - lib/faraday/adapter/em_http_ssl_patch.rb
49
107
  - lib/faraday/adapter/em_synchrony.rb
50
108
  - lib/faraday/adapter/em_synchrony/parallel_manager.rb
51
- - lib/faraday/adapter/excon.rb
52
109
  - lib/faraday/adapter/httpclient.rb
53
- - lib/faraday/adapter/net_http.rb
54
- - lib/faraday/adapter/net_http_persistent.rb
55
110
  - lib/faraday/adapter/patron.rb
56
111
  - lib/faraday/adapter/rack.rb
57
112
  - lib/faraday/adapter/test.rb
58
113
  - lib/faraday/adapter/typhoeus.rb
114
+ - lib/faraday/adapter_registry.rb
59
115
  - lib/faraday/autoload.rb
60
116
  - lib/faraday/connection.rb
61
- - lib/faraday/deprecate.rb
117
+ - lib/faraday/dependency_loader.rb
118
+ - lib/faraday/encoders/flat_params_encoder.rb
119
+ - lib/faraday/encoders/nested_params_encoder.rb
62
120
  - lib/faraday/error.rb
121
+ - lib/faraday/file_part.rb
122
+ - lib/faraday/logging/formatter.rb
123
+ - lib/faraday/methods.rb
63
124
  - lib/faraday/middleware.rb
125
+ - lib/faraday/middleware_registry.rb
64
126
  - lib/faraday/options.rb
127
+ - lib/faraday/options/connection_options.rb
128
+ - lib/faraday/options/env.rb
129
+ - lib/faraday/options/proxy_options.rb
130
+ - lib/faraday/options/request_options.rb
131
+ - lib/faraday/options/ssl_options.rb
132
+ - lib/faraday/param_part.rb
65
133
  - lib/faraday/parameters.rb
66
134
  - lib/faraday/rack_builder.rb
67
135
  - lib/faraday/request.rb
@@ -75,65 +143,80 @@ files:
75
143
  - lib/faraday/response.rb
76
144
  - lib/faraday/response/logger.rb
77
145
  - lib/faraday/response/raise_error.rb
78
- - lib/faraday/upload_io.rb
79
146
  - lib/faraday/utils.rb
80
- - spec/faraday/deprecate_spec.rb
147
+ - lib/faraday/utils/headers.rb
148
+ - lib/faraday/utils/params_hash.rb
149
+ - lib/faraday/version.rb
150
+ - spec/external_adapters/faraday_specs_setup.rb
151
+ - spec/faraday/adapter/em_http_spec.rb
152
+ - spec/faraday/adapter/em_synchrony_spec.rb
153
+ - spec/faraday/adapter/excon_spec.rb
154
+ - spec/faraday/adapter/httpclient_spec.rb
155
+ - spec/faraday/adapter/net_http_spec.rb
156
+ - spec/faraday/adapter/patron_spec.rb
157
+ - spec/faraday/adapter/rack_spec.rb
158
+ - spec/faraday/adapter/test_spec.rb
159
+ - spec/faraday/adapter/typhoeus_spec.rb
160
+ - spec/faraday/adapter_registry_spec.rb
161
+ - spec/faraday/adapter_spec.rb
162
+ - spec/faraday/composite_read_io_spec.rb
163
+ - spec/faraday/connection_spec.rb
81
164
  - spec/faraday/error_spec.rb
165
+ - spec/faraday/middleware_spec.rb
166
+ - spec/faraday/options/env_spec.rb
167
+ - spec/faraday/options/options_spec.rb
168
+ - spec/faraday/options/proxy_options_spec.rb
169
+ - spec/faraday/options/request_options_spec.rb
170
+ - spec/faraday/params_encoders/flat_spec.rb
171
+ - spec/faraday/params_encoders/nested_spec.rb
172
+ - spec/faraday/rack_builder_spec.rb
173
+ - spec/faraday/request/authorization_spec.rb
174
+ - spec/faraday/request/instrumentation_spec.rb
175
+ - spec/faraday/request/multipart_spec.rb
176
+ - spec/faraday/request/retry_spec.rb
177
+ - spec/faraday/request/url_encoded_spec.rb
178
+ - spec/faraday/request_spec.rb
179
+ - spec/faraday/response/logger_spec.rb
180
+ - spec/faraday/response/middleware_spec.rb
82
181
  - spec/faraday/response/raise_error_spec.rb
182
+ - spec/faraday/response_spec.rb
183
+ - spec/faraday/utils/headers_spec.rb
184
+ - spec/faraday/utils_spec.rb
185
+ - spec/faraday_spec.rb
83
186
  - 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
187
+ - spec/support/disabling_stub.rb
188
+ - spec/support/fake_safe_buffer.rb
189
+ - spec/support/helper_methods.rb
190
+ - spec/support/shared_examples/adapter.rb
191
+ - spec/support/shared_examples/params_encoder.rb
192
+ - spec/support/shared_examples/request_method.rb
193
+ - spec/support/streaming_response_checker.rb
194
+ - spec/support/webmock_rack_app.rb
113
195
  homepage: https://lostisland.github.io/faraday
114
196
  licenses:
115
197
  - MIT
116
198
  metadata:
117
199
  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/
200
+ changelog_uri: https://github.com/lostisland/faraday/releases/tag/v1.4.1
201
+ source_code_uri: https://github.com/lostisland/faraday
120
202
  bug_tracker_uri: https://github.com/lostisland/faraday/issues
121
203
  post_install_message:
122
204
  rdoc_options: []
123
205
  require_paths:
124
206
  - lib
207
+ - spec/external_adapters
125
208
  required_ruby_version: !ruby/object:Gem::Requirement
126
209
  requirements:
127
210
  - - ">="
128
211
  - !ruby/object:Gem::Version
129
- version: '1.9'
212
+ version: '2.4'
130
213
  required_rubygems_version: !ruby/object:Gem::Requirement
131
214
  requirements:
132
215
  - - ">="
133
216
  - !ruby/object:Gem::Version
134
217
  version: '0'
135
218
  requirements: []
136
- rubygems_version: 3.1.2
219
+ rubygems_version: 3.0.3.1
137
220
  signing_key:
138
221
  specification_version: 4
139
222
  summary: HTTP/REST API client library.
@@ -1,82 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class Excon < Faraday::Adapter
4
- dependency 'excon'
5
-
6
- def call(env)
7
- super
8
-
9
- opts = {}
10
- if env[:url].scheme == 'https' && ssl = env[:ssl]
11
- opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true)
12
- opts[:ssl_ca_path] = ssl[:ca_path] if ssl[:ca_path]
13
- opts[:ssl_ca_file] = ssl[:ca_file] if ssl[:ca_file]
14
- opts[:client_cert] = ssl[:client_cert] if ssl[:client_cert]
15
- opts[:client_key] = ssl[:client_key] if ssl[:client_key]
16
- opts[:certificate] = ssl[:certificate] if ssl[:certificate]
17
- opts[:private_key] = ssl[:private_key] if ssl[:private_key]
18
- opts[:ssl_version] = ssl[:version] if ssl[:version]
19
- opts[:ssl_min_version] = ssl[:min_version] if ssl[:min_version]
20
- opts[:ssl_max_version] = ssl[:max_version] if ssl[:max_version]
21
-
22
- # https://github.com/geemus/excon/issues/106
23
- # https://github.com/jruby/jruby-ossl/issues/19
24
- opts[:nonblock] = false
25
- end
26
-
27
- if ( req = env[:request] )
28
- if req[:timeout]
29
- opts[:read_timeout] = req[:timeout]
30
- opts[:connect_timeout] = req[:timeout]
31
- opts[:write_timeout] = req[:timeout]
32
- end
33
-
34
- if req[:open_timeout]
35
- opts[:connect_timeout] = req[:open_timeout]
36
- end
37
-
38
- if req[:proxy]
39
- opts[:proxy] = {
40
- :host => req[:proxy][:uri].host,
41
- :hostname => req[:proxy][:uri].hostname,
42
- :port => req[:proxy][:uri].port,
43
- :scheme => req[:proxy][:uri].scheme,
44
- :user => req[:proxy][:user],
45
- :password => req[:proxy][:password]
46
- }
47
- end
48
- end
49
-
50
- conn = create_connection(env, opts)
51
-
52
- resp = conn.request \
53
- :method => env[:method].to_s.upcase,
54
- :headers => env[:request_headers],
55
- :body => read_body(env)
56
-
57
- save_response(env, resp.status.to_i, resp.body, resp.headers, resp.reason_phrase)
58
-
59
- @app.call env
60
- rescue ::Excon::Errors::SocketError => err
61
- if err.message =~ /\btimeout\b/
62
- raise Faraday::TimeoutError, err
63
- elsif err.message =~ /\bcertificate\b/
64
- raise Faraday::SSLError, err
65
- else
66
- raise Faraday::ConnectionFailed, err
67
- end
68
- rescue ::Excon::Errors::Timeout => err
69
- raise Faraday::TimeoutError, err
70
- end
71
-
72
- def create_connection(env, opts)
73
- ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
74
- end
75
-
76
- # TODO: support streaming requests
77
- def read_body(env)
78
- env[:body].respond_to?(:read) ? env[:body].read : env[:body]
79
- end
80
- end
81
- end
82
- end
@@ -1,152 +0,0 @@
1
- begin
2
- require 'net/https'
3
- rescue LoadError
4
- warn "Warning: no such file to load -- net/https. Make sure openssl is installed if you want ssl support"
5
- require 'net/http'
6
- end
7
- require 'zlib'
8
-
9
- module Faraday
10
- class Adapter
11
- class NetHttp < Faraday::Adapter
12
- NET_HTTP_EXCEPTIONS = [
13
- IOError,
14
- Errno::ECONNABORTED,
15
- Errno::ECONNREFUSED,
16
- Errno::ECONNRESET,
17
- Errno::EHOSTUNREACH,
18
- Errno::EINVAL,
19
- Errno::ENETUNREACH,
20
- Errno::EPIPE,
21
- Net::HTTPBadResponse,
22
- Net::HTTPHeaderSyntaxError,
23
- Net::ProtocolError,
24
- SocketError,
25
- Zlib::GzipFile::Error,
26
- ]
27
-
28
- NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
29
- NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout)
30
-
31
- def initialize(app = nil, opts = {}, &block)
32
- @cert_store = nil
33
- super(app, opts, &block)
34
- end
35
-
36
- def call(env)
37
- super
38
- with_net_http_connection(env) do |http|
39
- configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
40
- configure_request(http, env[:request])
41
-
42
- begin
43
- http_response = perform_request(http, env)
44
- rescue *NET_HTTP_EXCEPTIONS => err
45
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
46
- raise Faraday::SSLError, err
47
- else
48
- raise Faraday::ConnectionFailed, err
49
- end
50
- end
51
-
52
- save_response(env, http_response.code.to_i, http_response.body || '', nil, http_response.message) do |response_headers|
53
- http_response.each_header do |key, value|
54
- response_headers[key] = value
55
- end
56
- end
57
- end
58
-
59
- @app.call env
60
- rescue Timeout::Error, Errno::ETIMEDOUT => err
61
- raise Faraday::TimeoutError, err
62
- end
63
-
64
- private
65
-
66
- def create_request(env)
67
- request = Net::HTTPGenericRequest.new \
68
- env[:method].to_s.upcase, # request method
69
- !!env[:body], # is there request body
70
- :head != env[:method], # is there response body
71
- env[:url].request_uri, # request uri path
72
- env[:request_headers] # request headers
73
-
74
- if env[:body].respond_to?(:read)
75
- request.body_stream = env[:body]
76
- else
77
- request.body = env[:body]
78
- end
79
- request
80
- end
81
-
82
- def perform_request(http, env)
83
- if :get == env[:method] and !env[:body]
84
- # prefer `get` to `request` because the former handles gzip (ruby 1.9)
85
- http.get env[:url].request_uri, env[:request_headers]
86
- else
87
- http.request create_request(env)
88
- end
89
- end
90
-
91
- def with_net_http_connection(env)
92
- yield net_http_connection(env)
93
- end
94
-
95
- def net_http_connection(env)
96
- if proxy = env[:request][:proxy]
97
- Net::HTTP::Proxy(proxy[:uri].hostname, proxy[:uri].port, proxy[:user], proxy[:password])
98
- else
99
- Net::HTTP
100
- end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == 'https' ? 443 : 80))
101
- end
102
-
103
- def configure_ssl(http, ssl)
104
- http.use_ssl = true
105
- http.verify_mode = ssl_verify_mode(ssl)
106
- http.cert_store = ssl_cert_store(ssl)
107
-
108
- http.cert = ssl[:client_cert] if ssl[:client_cert]
109
- http.key = ssl[:client_key] if ssl[:client_key]
110
- http.ca_file = ssl[:ca_file] if ssl[:ca_file]
111
- http.ca_path = ssl[:ca_path] if ssl[:ca_path]
112
- http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
113
- http.ssl_version = ssl[:version] if ssl[:version]
114
- http.min_version = ssl[:min_version] if ssl[:min_version]
115
- http.max_version = ssl[:max_version] if ssl[:max_version]
116
- end
117
-
118
- def configure_request(http, req)
119
- if req[:timeout]
120
- http.read_timeout = req[:timeout]
121
- http.open_timeout = req[:timeout]
122
- http.write_timeout = req[:timeout] if http.respond_to?(:write_timeout=)
123
- end
124
- http.open_timeout = req[:open_timeout] if req[:open_timeout]
125
- http.write_timeout = req[:write_timeout] if req[:write_timeout] && http.respond_to?(:write_timeout=)
126
- # Only set if Net::Http supports it, since Ruby 2.5.
127
- http.max_retries = 0 if http.respond_to?(:max_retries=)
128
-
129
- @config_block.call(http) if @config_block
130
- end
131
-
132
- def ssl_cert_store(ssl)
133
- return ssl[:cert_store] if ssl[:cert_store]
134
- return @cert_store if @cert_store
135
- # Use the default cert store by default, i.e. system ca certs
136
- @cert_store = OpenSSL::X509::Store.new
137
- @cert_store.set_default_paths
138
- @cert_store
139
- end
140
-
141
- def ssl_verify_mode(ssl)
142
- ssl[:verify_mode] || begin
143
- if ssl.fetch(:verify, true)
144
- OpenSSL::SSL::VERIFY_PEER
145
- else
146
- OpenSSL::SSL::VERIFY_NONE
147
- end
148
- end
149
- end
150
- end
151
- end
152
- end