faraday 0.17.5 → 2.3.0

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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +350 -8
  3. data/LICENSE.md +1 -1
  4. data/README.md +24 -364
  5. data/Rakefile +1 -7
  6. data/examples/client_spec.rb +97 -0
  7. data/examples/client_test.rb +118 -0
  8. data/lib/faraday/adapter/test.rb +127 -72
  9. data/lib/faraday/adapter.rb +69 -22
  10. data/lib/faraday/adapter_registry.rb +30 -0
  11. data/lib/faraday/connection.rb +309 -232
  12. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  13. data/lib/faraday/encoders/nested_params_encoder.rb +183 -0
  14. data/lib/faraday/error.rb +31 -42
  15. data/lib/faraday/logging/formatter.rb +106 -0
  16. data/lib/faraday/methods.rb +6 -0
  17. data/lib/faraday/middleware.rb +18 -25
  18. data/lib/faraday/middleware_registry.rb +83 -0
  19. data/lib/faraday/options/connection_options.rb +22 -0
  20. data/lib/faraday/options/env.rb +181 -0
  21. data/lib/faraday/options/proxy_options.rb +32 -0
  22. data/lib/faraday/options/request_options.rb +22 -0
  23. data/lib/faraday/options/ssl_options.rb +59 -0
  24. data/lib/faraday/options.rb +38 -193
  25. data/lib/faraday/parameters.rb +4 -197
  26. data/lib/faraday/rack_builder.rb +91 -76
  27. data/lib/faraday/request/authorization.rb +37 -29
  28. data/lib/faraday/request/instrumentation.rb +47 -27
  29. data/lib/faraday/request/json.rb +55 -0
  30. data/lib/faraday/request/url_encoded.rb +48 -24
  31. data/lib/faraday/request.rb +64 -44
  32. data/lib/faraday/response/json.rb +54 -0
  33. data/lib/faraday/response/logger.rb +22 -69
  34. data/lib/faraday/response/raise_error.rb +57 -18
  35. data/lib/faraday/response.rb +25 -32
  36. data/lib/faraday/utils/headers.rb +139 -0
  37. data/lib/faraday/utils/params_hash.rb +61 -0
  38. data/lib/faraday/utils.rb +47 -251
  39. data/lib/faraday/version.rb +5 -0
  40. data/lib/faraday.rb +108 -198
  41. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  42. data/spec/faraday/adapter/test_spec.rb +377 -0
  43. data/spec/faraday/adapter_registry_spec.rb +28 -0
  44. data/spec/faraday/adapter_spec.rb +55 -0
  45. data/spec/faraday/connection_spec.rb +787 -0
  46. data/spec/faraday/error_spec.rb +12 -54
  47. data/spec/faraday/middleware_registry_spec.rb +31 -0
  48. data/spec/faraday/middleware_spec.rb +52 -0
  49. data/spec/faraday/options/env_spec.rb +70 -0
  50. data/spec/faraday/options/options_spec.rb +297 -0
  51. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  52. data/spec/faraday/options/request_options_spec.rb +19 -0
  53. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  54. data/spec/faraday/params_encoders/nested_spec.rb +150 -0
  55. data/spec/faraday/rack_builder_spec.rb +317 -0
  56. data/spec/faraday/request/authorization_spec.rb +83 -0
  57. data/spec/faraday/request/instrumentation_spec.rb +74 -0
  58. data/spec/faraday/request/json_spec.rb +111 -0
  59. data/spec/faraday/request/url_encoded_spec.rb +93 -0
  60. data/spec/faraday/request_spec.rb +109 -0
  61. data/spec/faraday/response/json_spec.rb +117 -0
  62. data/spec/faraday/response/logger_spec.rb +220 -0
  63. data/spec/faraday/response/raise_error_spec.rb +81 -15
  64. data/spec/faraday/response_spec.rb +75 -0
  65. data/spec/faraday/utils/headers_spec.rb +82 -0
  66. data/spec/faraday/utils_spec.rb +117 -0
  67. data/spec/faraday_spec.rb +37 -0
  68. data/spec/spec_helper.rb +63 -36
  69. data/spec/support/disabling_stub.rb +14 -0
  70. data/spec/support/fake_safe_buffer.rb +15 -0
  71. data/spec/support/helper_methods.rb +96 -0
  72. data/spec/support/shared_examples/adapter.rb +104 -0
  73. data/spec/support/shared_examples/params_encoder.rb +18 -0
  74. data/spec/support/shared_examples/request_method.rb +249 -0
  75. data/spec/support/streaming_response_checker.rb +35 -0
  76. metadata +74 -63
  77. data/lib/faraday/adapter/em_http.rb +0 -243
  78. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  79. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  80. data/lib/faraday/adapter/em_synchrony.rb +0 -106
  81. data/lib/faraday/adapter/excon.rb +0 -82
  82. data/lib/faraday/adapter/httpclient.rb +0 -128
  83. data/lib/faraday/adapter/net_http.rb +0 -153
  84. data/lib/faraday/adapter/net_http_persistent.rb +0 -68
  85. data/lib/faraday/adapter/patron.rb +0 -95
  86. data/lib/faraday/adapter/rack.rb +0 -58
  87. data/lib/faraday/adapter/typhoeus.rb +0 -12
  88. data/lib/faraday/autoload.rb +0 -84
  89. data/lib/faraday/deprecate.rb +0 -109
  90. data/lib/faraday/request/basic_authentication.rb +0 -13
  91. data/lib/faraday/request/multipart.rb +0 -68
  92. data/lib/faraday/request/retry.rb +0 -213
  93. data/lib/faraday/request/token_authentication.rb +0 -15
  94. data/lib/faraday/upload_io.rb +0 -67
  95. data/spec/faraday/deprecate_spec.rb +0 -147
  96. data/test/adapters/default_test.rb +0 -14
  97. data/test/adapters/em_http_test.rb +0 -30
  98. data/test/adapters/em_synchrony_test.rb +0 -32
  99. data/test/adapters/excon_test.rb +0 -30
  100. data/test/adapters/httpclient_test.rb +0 -34
  101. data/test/adapters/integration.rb +0 -263
  102. data/test/adapters/logger_test.rb +0 -136
  103. data/test/adapters/net_http_persistent_test.rb +0 -114
  104. data/test/adapters/net_http_test.rb +0 -79
  105. data/test/adapters/patron_test.rb +0 -40
  106. data/test/adapters/rack_test.rb +0 -38
  107. data/test/adapters/test_middleware_test.rb +0 -157
  108. data/test/adapters/typhoeus_test.rb +0 -38
  109. data/test/authentication_middleware_test.rb +0 -65
  110. data/test/composite_read_io_test.rb +0 -109
  111. data/test/connection_test.rb +0 -738
  112. data/test/env_test.rb +0 -268
  113. data/test/helper.rb +0 -75
  114. data/test/live_server.rb +0 -67
  115. data/test/middleware/instrumentation_test.rb +0 -88
  116. data/test/middleware/retry_test.rb +0 -282
  117. data/test/middleware_stack_test.rb +0 -260
  118. data/test/multibyte.txt +0 -1
  119. data/test/options_test.rb +0 -333
  120. data/test/parameters_test.rb +0 -157
  121. data/test/request_middleware_test.rb +0 -126
  122. data/test/response_middleware_test.rb +0 -72
  123. data/test/strawberry.rb +0 -2
  124. data/test/utils_test.rb +0 -98
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.5
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "@technoweenie"
@@ -10,28 +10,36 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-02-21 00:00:00.000000000 Z
13
+ date: 2022-05-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: multipart-post
16
+ name: faraday-net_http
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ">="
20
- - !ruby/object:Gem::Version
21
- version: '1.2'
22
- - - "<"
19
+ - - "~>"
23
20
  - !ruby/object:Gem::Version
24
- version: '3'
21
+ version: '2.0'
25
22
  type: :runtime
26
23
  prerelease: false
27
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '2.0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: ruby2_keywords
31
+ requirement: !ruby/object:Gem::Requirement
28
32
  requirements:
29
33
  - - ">="
30
34
  - !ruby/object:Gem::Version
31
- version: '1.2'
32
- - - "<"
35
+ version: 0.0.4
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
33
41
  - !ruby/object:Gem::Version
34
- version: '3'
42
+ version: 0.0.4
35
43
  description:
36
44
  email: technoweenie@gmail.com
37
45
  executables: []
@@ -42,98 +50,101 @@ files:
42
50
  - LICENSE.md
43
51
  - README.md
44
52
  - Rakefile
53
+ - examples/client_spec.rb
54
+ - examples/client_test.rb
45
55
  - lib/faraday.rb
46
56
  - lib/faraday/adapter.rb
47
- - lib/faraday/adapter/em_http.rb
48
- - lib/faraday/adapter/em_http_ssl_patch.rb
49
- - lib/faraday/adapter/em_synchrony.rb
50
- - lib/faraday/adapter/em_synchrony/parallel_manager.rb
51
- - lib/faraday/adapter/excon.rb
52
- - lib/faraday/adapter/httpclient.rb
53
- - lib/faraday/adapter/net_http.rb
54
- - lib/faraday/adapter/net_http_persistent.rb
55
- - lib/faraday/adapter/patron.rb
56
- - lib/faraday/adapter/rack.rb
57
57
  - lib/faraday/adapter/test.rb
58
- - lib/faraday/adapter/typhoeus.rb
59
- - lib/faraday/autoload.rb
58
+ - lib/faraday/adapter_registry.rb
60
59
  - lib/faraday/connection.rb
61
- - lib/faraday/deprecate.rb
60
+ - lib/faraday/encoders/flat_params_encoder.rb
61
+ - lib/faraday/encoders/nested_params_encoder.rb
62
62
  - lib/faraday/error.rb
63
+ - lib/faraday/logging/formatter.rb
64
+ - lib/faraday/methods.rb
63
65
  - lib/faraday/middleware.rb
66
+ - lib/faraday/middleware_registry.rb
64
67
  - 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
65
73
  - lib/faraday/parameters.rb
66
74
  - lib/faraday/rack_builder.rb
67
75
  - lib/faraday/request.rb
68
76
  - lib/faraday/request/authorization.rb
69
- - lib/faraday/request/basic_authentication.rb
70
77
  - lib/faraday/request/instrumentation.rb
71
- - lib/faraday/request/multipart.rb
72
- - lib/faraday/request/retry.rb
73
- - lib/faraday/request/token_authentication.rb
78
+ - lib/faraday/request/json.rb
74
79
  - lib/faraday/request/url_encoded.rb
75
80
  - lib/faraday/response.rb
81
+ - lib/faraday/response/json.rb
76
82
  - lib/faraday/response/logger.rb
77
83
  - lib/faraday/response/raise_error.rb
78
- - lib/faraday/upload_io.rb
79
84
  - lib/faraday/utils.rb
80
- - spec/faraday/deprecate_spec.rb
85
+ - lib/faraday/utils/headers.rb
86
+ - lib/faraday/utils/params_hash.rb
87
+ - lib/faraday/version.rb
88
+ - spec/external_adapters/faraday_specs_setup.rb
89
+ - spec/faraday/adapter/test_spec.rb
90
+ - spec/faraday/adapter_registry_spec.rb
91
+ - spec/faraday/adapter_spec.rb
92
+ - spec/faraday/connection_spec.rb
81
93
  - spec/faraday/error_spec.rb
94
+ - spec/faraday/middleware_registry_spec.rb
95
+ - spec/faraday/middleware_spec.rb
96
+ - spec/faraday/options/env_spec.rb
97
+ - spec/faraday/options/options_spec.rb
98
+ - spec/faraday/options/proxy_options_spec.rb
99
+ - spec/faraday/options/request_options_spec.rb
100
+ - spec/faraday/params_encoders/flat_spec.rb
101
+ - spec/faraday/params_encoders/nested_spec.rb
102
+ - spec/faraday/rack_builder_spec.rb
103
+ - spec/faraday/request/authorization_spec.rb
104
+ - spec/faraday/request/instrumentation_spec.rb
105
+ - spec/faraday/request/json_spec.rb
106
+ - spec/faraday/request/url_encoded_spec.rb
107
+ - spec/faraday/request_spec.rb
108
+ - spec/faraday/response/json_spec.rb
109
+ - spec/faraday/response/logger_spec.rb
82
110
  - spec/faraday/response/raise_error_spec.rb
111
+ - spec/faraday/response_spec.rb
112
+ - spec/faraday/utils/headers_spec.rb
113
+ - spec/faraday/utils_spec.rb
114
+ - spec/faraday_spec.rb
83
115
  - 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
116
+ - spec/support/disabling_stub.rb
117
+ - spec/support/fake_safe_buffer.rb
118
+ - spec/support/helper_methods.rb
119
+ - spec/support/shared_examples/adapter.rb
120
+ - spec/support/shared_examples/params_encoder.rb
121
+ - spec/support/shared_examples/request_method.rb
122
+ - spec/support/streaming_response_checker.rb
113
123
  homepage: https://lostisland.github.io/faraday
114
124
  licenses:
115
125
  - MIT
116
126
  metadata:
117
127
  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/
128
+ changelog_uri: https://github.com/lostisland/faraday/releases/tag/v2.3.0
129
+ source_code_uri: https://github.com/lostisland/faraday
120
130
  bug_tracker_uri: https://github.com/lostisland/faraday/issues
121
131
  post_install_message:
122
132
  rdoc_options: []
123
133
  require_paths:
124
134
  - lib
135
+ - spec/external_adapters
125
136
  required_ruby_version: !ruby/object:Gem::Requirement
126
137
  requirements:
127
138
  - - ">="
128
139
  - !ruby/object:Gem::Version
129
- version: '1.9'
140
+ version: '2.6'
130
141
  required_rubygems_version: !ruby/object:Gem::Requirement
131
142
  requirements:
132
143
  - - ">="
133
144
  - !ruby/object:Gem::Version
134
145
  version: '0'
135
146
  requirements: []
136
- rubygems_version: 3.2.32
147
+ rubygems_version: 3.1.6
137
148
  signing_key:
138
149
  specification_version: 4
139
150
  summary: HTTP/REST API client library.
@@ -1,243 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- # EventMachine adapter is useful for either asynchronous requests
4
- # when in EM reactor loop or for making parallel requests in
5
- # synchronous code.
6
- class EMHttp < Faraday::Adapter
7
- module Options
8
- def connection_config(env)
9
- options = {}
10
- configure_proxy(options, env)
11
- configure_timeout(options, env)
12
- configure_socket(options, env)
13
- configure_ssl(options, env)
14
- options
15
- end
16
-
17
- def request_config(env)
18
- options = {
19
- :body => read_body(env),
20
- :head => env[:request_headers],
21
- # :keepalive => true,
22
- # :file => 'path/to/file', # stream data off disk
23
- }
24
- configure_compression(options, env)
25
- options
26
- end
27
-
28
- def read_body(env)
29
- body = env[:body]
30
- body.respond_to?(:read) ? body.read : body
31
- end
32
-
33
- def configure_proxy(options, env)
34
- if proxy = request_options(env)[:proxy]
35
- options[:proxy] = {
36
- :host => proxy[:uri].host,
37
- :port => proxy[:uri].port,
38
- :authorization => [proxy[:user], proxy[:password]]
39
- }
40
- end
41
- end
42
-
43
- def configure_socket(options, env)
44
- if bind = request_options(env)[:bind]
45
- options[:bind] = {
46
- :host => bind[:host],
47
- :port => bind[:port]
48
- }
49
- end
50
- end
51
-
52
- def configure_ssl(options, env)
53
- if env[:url].scheme == 'https' && env[:ssl]
54
- options[:ssl] = {
55
- :cert_chain_file => env[:ssl][:ca_file],
56
- :verify_peer => env[:ssl].fetch(:verify, true)
57
- }
58
- end
59
- end
60
-
61
- def configure_timeout(options, env)
62
- timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout)
63
- options[:connect_timeout] = options[:inactivity_timeout] = timeout
64
- options[:connect_timeout] = open_timeout if open_timeout
65
- end
66
-
67
- def configure_compression(options, env)
68
- if env[:method] == :get and not options[:head].key? 'accept-encoding'
69
- options[:head]['accept-encoding'] = 'gzip, compressed'
70
- end
71
- end
72
-
73
- def request_options(env)
74
- env[:request]
75
- end
76
- end
77
-
78
- include Options
79
-
80
- dependency 'em-http'
81
-
82
- self.supports_parallel = true
83
-
84
- def self.setup_parallel_manager(options = nil)
85
- Manager.new
86
- end
87
-
88
- def call(env)
89
- super
90
- perform_request env
91
- @app.call env
92
- end
93
-
94
- def perform_request(env)
95
- if parallel?(env)
96
- manager = env[:parallel_manager]
97
- manager.add {
98
- perform_single_request(env).
99
- callback { env[:response].finish(env) }
100
- }
101
- else
102
- unless EventMachine.reactor_running?
103
- error = nil
104
- # start EM, block until request is completed
105
- EventMachine.run do
106
- perform_single_request(env).
107
- callback { EventMachine.stop }.
108
- errback { |client|
109
- error = error_message(client)
110
- EventMachine.stop
111
- }
112
- end
113
- raise_error(error) if error
114
- else
115
- # EM is running: instruct upstream that this is an async request
116
- env[:parallel_manager] = true
117
- perform_single_request(env).
118
- callback { env[:response].finish(env) }.
119
- errback {
120
- # TODO: no way to communicate the error in async mode
121
- raise NotImplementedError
122
- }
123
- end
124
- end
125
- rescue EventMachine::Connectify::CONNECTError => err
126
- if err.message.include?("Proxy Authentication Required")
127
- raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
128
- else
129
- raise Faraday::ConnectionFailed, err
130
- end
131
- rescue => err
132
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
133
- raise Faraday::SSLError, err
134
- else
135
- raise
136
- end
137
- end
138
-
139
- # TODO: reuse the connection to support pipelining
140
- def perform_single_request(env)
141
- req = create_request(env)
142
- req.setup_request(env[:method], request_config(env)).callback { |client|
143
- status = client.response_header.status
144
- reason = client.response_header.http_reason
145
- save_response(env, status, client.response, nil, reason) do |resp_headers|
146
- client.response_header.each do |name, value|
147
- resp_headers[name.to_sym] = value
148
- end
149
- end
150
- }
151
- end
152
-
153
- def create_request(env)
154
- EventMachine::HttpRequest.new(env[:url], connection_config(env).merge(@connection_options))
155
- end
156
-
157
- def error_message(client)
158
- client.error or "request failed"
159
- end
160
-
161
- def raise_error(msg)
162
- errklass = Faraday::ClientError
163
- if msg == Errno::ETIMEDOUT
164
- errklass = Faraday::TimeoutError
165
- msg = "request timed out"
166
- elsif msg == Errno::ECONNREFUSED
167
- errklass = Faraday::ConnectionFailed
168
- msg = "connection refused"
169
- elsif msg == "connection closed by server"
170
- errklass = Faraday::ConnectionFailed
171
- end
172
- raise errklass, msg
173
- end
174
-
175
- def parallel?(env)
176
- !!env[:parallel_manager]
177
- end
178
-
179
- # The parallel manager is designed to start an EventMachine loop
180
- # and block until all registered requests have been completed.
181
- class Manager
182
- def initialize
183
- reset
184
- end
185
-
186
- def reset
187
- @registered_procs = []
188
- @num_registered = 0
189
- @num_succeeded = 0
190
- @errors = []
191
- @running = false
192
- end
193
-
194
- def running?() @running end
195
-
196
- def add(&block)
197
- if running?
198
- perform_request { yield }
199
- else
200
- @registered_procs << block
201
- end
202
- @num_registered += 1
203
- end
204
-
205
- def run
206
- if @num_registered > 0
207
- @running = true
208
- EventMachine.run do
209
- @registered_procs.each do |proc|
210
- perform_request(&proc)
211
- end
212
- end
213
- if @errors.size > 0
214
- raise Faraday::ClientError, @errors.first || "connection failed"
215
- end
216
- end
217
- ensure
218
- reset
219
- end
220
-
221
- def perform_request
222
- client = yield
223
- client.callback { @num_succeeded += 1; check_finished }
224
- client.errback { @errors << client.error; check_finished }
225
- end
226
-
227
- def check_finished
228
- if @num_succeeded + @errors.size == @num_registered
229
- EventMachine.stop
230
- end
231
- end
232
- end
233
- end
234
- end
235
- end
236
-
237
- begin
238
- require 'openssl'
239
- rescue LoadError
240
- warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
241
- else
242
- require 'faraday/adapter/em_http_ssl_patch'
243
- end if Faraday::Adapter::EMHttp.loaded?
@@ -1,56 +0,0 @@
1
- require 'openssl'
2
- require 'em-http'
3
-
4
- module EmHttpSslPatch
5
- def ssl_verify_peer(cert_string)
6
- cert = nil
7
- begin
8
- cert = OpenSSL::X509::Certificate.new(cert_string)
9
- rescue OpenSSL::X509::CertificateError
10
- return false
11
- end
12
-
13
- @last_seen_cert = cert
14
-
15
- if certificate_store.verify(@last_seen_cert)
16
- begin
17
- certificate_store.add_cert(@last_seen_cert)
18
- rescue OpenSSL::X509::StoreError => e
19
- raise e unless e.message == 'cert already in hash table'
20
- end
21
- true
22
- else
23
- raise OpenSSL::SSL::SSLError.new(%(unable to verify the server certificate for "#{host}"))
24
- end
25
- end
26
-
27
- def ssl_handshake_completed
28
- return true unless verify_peer?
29
-
30
- unless OpenSSL::SSL.verify_certificate_identity(@last_seen_cert, host)
31
- raise OpenSSL::SSL::SSLError.new(%(host "#{host}" does not match the server certificate))
32
- else
33
- true
34
- end
35
- end
36
-
37
- def verify_peer?
38
- parent.connopts.tls[:verify_peer]
39
- end
40
-
41
- def host
42
- parent.uri.host
43
- end
44
-
45
- def certificate_store
46
- @certificate_store ||= begin
47
- store = OpenSSL::X509::Store.new
48
- store.set_default_paths
49
- ca_file = parent.connopts.tls[:cert_chain_file]
50
- store.add_file(ca_file) if ca_file
51
- store
52
- end
53
- end
54
- end
55
-
56
- EventMachine::HttpStubConnection.send(:include, EmHttpSslPatch)
@@ -1,66 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class EMSynchrony < Faraday::Adapter
4
- class ParallelManager
5
-
6
- # Add requests to queue. The `request` argument should be a
7
- # `EM::HttpRequest` object.
8
- def add(request, method, *args, &block)
9
- queue << {
10
- :request => request,
11
- :method => method,
12
- :args => args,
13
- :block => block
14
- }
15
- end
16
-
17
- # Run all requests on queue with `EM::Synchrony::Multi`, wrapping
18
- # it in a reactor and fiber if needed.
19
- def run
20
- result = nil
21
- if !EM.reactor_running?
22
- EM.run {
23
- Fiber.new do
24
- result = perform
25
- EM.stop
26
- end.resume
27
- }
28
- else
29
- result = perform
30
- end
31
- result
32
- end
33
-
34
-
35
- private
36
-
37
- # The request queue.
38
- def queue
39
- @queue ||= []
40
- end
41
-
42
- # Main `EM::Synchrony::Multi` performer.
43
- def perform
44
- multi = ::EM::Synchrony::Multi.new
45
-
46
- queue.each do |item|
47
- method = "a#{item[:method]}".to_sym
48
-
49
- req = item[:request].send(method, *item[:args])
50
- req.callback(&item[:block])
51
-
52
- req_name = "req_#{multi.requests.size}".to_sym
53
- multi.add(req_name, req)
54
- end
55
-
56
- # Clear the queue, so parallel manager objects can be reused.
57
- @queue = []
58
-
59
- # Block fiber until all requests have returned.
60
- multi.perform
61
- end
62
-
63
- end # ParallelManager
64
- end # EMSynchrony
65
- end # Adapter
66
- end # Faraday
@@ -1,106 +0,0 @@
1
- require 'uri'
2
-
3
- module Faraday
4
- class Adapter
5
- class EMSynchrony < Faraday::Adapter
6
- include EMHttp::Options
7
-
8
- dependency do
9
- require 'em-synchrony/em-http'
10
- require 'em-synchrony/em-multi'
11
- require 'fiber'
12
- end
13
-
14
- self.supports_parallel = true
15
-
16
- def self.setup_parallel_manager(options = {})
17
- ParallelManager.new
18
- end
19
-
20
- def call(env)
21
- super
22
- request = create_request(env)
23
-
24
- http_method = env[:method].to_s.downcase.to_sym
25
-
26
- # Queue requests for parallel execution.
27
- if env[:parallel_manager]
28
- env[:parallel_manager].add(request, http_method, request_config(env)) do |resp|
29
- save_response(env, resp.response_header.status, resp.response) do |resp_headers|
30
- resp.response_header.each do |name, value|
31
- resp_headers[name.to_sym] = value
32
- end
33
- end
34
-
35
- # Finalize the response object with values from `env`.
36
- env[:response].finish(env)
37
- end
38
-
39
- # Execute single request.
40
- else
41
- client = nil
42
- block = lambda { request.send(http_method, request_config(env)) }
43
-
44
- if !EM.reactor_running?
45
- EM.run do
46
- Fiber.new {
47
- client = block.call
48
- EM.stop
49
- }.resume
50
- end
51
- else
52
- client = block.call
53
- end
54
-
55
- raise client.error if client.error
56
-
57
- status = client.response_header.status
58
- reason = client.response_header.http_reason
59
- save_response(env, status, client.response, nil, reason) do |resp_headers|
60
- client.response_header.each do |name, value|
61
- resp_headers[name.to_sym] = value
62
- end
63
- end
64
- end
65
-
66
- @app.call env
67
- rescue Errno::ECONNREFUSED
68
- raise Faraday::ConnectionFailed, $!
69
- rescue EventMachine::Connectify::CONNECTError => err
70
- if err.message.include?("Proxy Authentication Required")
71
- raise Faraday::ConnectionFailed, %{407 "Proxy Authentication Required "}
72
- else
73
- raise Faraday::ConnectionFailed, err
74
- end
75
- rescue Errno::ETIMEDOUT => err
76
- raise Faraday::TimeoutError, err
77
- rescue RuntimeError => err
78
- if err.message == "connection closed by server"
79
- raise Faraday::ConnectionFailed, err
80
- else
81
- raise
82
- end
83
- rescue => err
84
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
85
- raise Faraday::SSLError, err
86
- else
87
- raise
88
- end
89
- end
90
-
91
- def create_request(env)
92
- EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env).merge(@connection_options))
93
- end
94
- end
95
- end
96
- end
97
-
98
- require 'faraday/adapter/em_synchrony/parallel_manager'
99
-
100
- begin
101
- require 'openssl'
102
- rescue LoadError
103
- warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
104
- else
105
- require 'faraday/adapter/em_http_ssl_patch'
106
- end if Faraday::Adapter::EMSynchrony.loaded?