faraday 1.0.0 → 2.9.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +299 -1
- data/LICENSE.md +1 -1
- data/README.md +35 -23
- data/Rakefile +3 -1
- data/examples/client_spec.rb +68 -14
- data/examples/client_test.rb +80 -15
- data/lib/faraday/adapter/test.rb +117 -52
- data/lib/faraday/adapter.rb +6 -20
- data/lib/faraday/adapter_registry.rb +3 -1
- data/lib/faraday/connection.rb +73 -132
- data/lib/faraday/encoders/flat_params_encoder.rb +9 -2
- data/lib/faraday/encoders/nested_params_encoder.rb +20 -8
- data/lib/faraday/error.rb +37 -8
- data/lib/faraday/logging/formatter.rb +28 -15
- data/lib/faraday/methods.rb +6 -0
- data/lib/faraday/middleware.rb +17 -5
- data/lib/faraday/middleware_registry.rb +17 -63
- data/lib/faraday/options/connection_options.rb +7 -6
- data/lib/faraday/options/env.rb +85 -62
- data/lib/faraday/options/proxy_options.rb +11 -3
- data/lib/faraday/options/request_options.rb +7 -6
- data/lib/faraday/options/ssl_options.rb +56 -45
- data/lib/faraday/options.rb +11 -14
- data/lib/faraday/rack_builder.rb +35 -32
- data/lib/faraday/request/authorization.rb +37 -36
- data/lib/faraday/request/instrumentation.rb +5 -1
- data/lib/faraday/request/json.rb +70 -0
- data/lib/faraday/request/url_encoded.rb +8 -2
- data/lib/faraday/request.rb +22 -29
- data/lib/faraday/response/json.rb +73 -0
- data/lib/faraday/response/logger.rb +8 -4
- data/lib/faraday/response/raise_error.rb +41 -3
- data/lib/faraday/response.rb +10 -23
- data/lib/faraday/utils/headers.rb +9 -4
- data/lib/faraday/utils.rb +22 -10
- data/lib/faraday/version.rb +5 -0
- data/lib/faraday.rb +49 -58
- data/spec/faraday/adapter/test_spec.rb +442 -0
- data/spec/faraday/connection_spec.rb +207 -90
- data/spec/faraday/error_spec.rb +45 -5
- data/spec/faraday/middleware_registry_spec.rb +31 -0
- data/spec/faraday/middleware_spec.rb +50 -6
- data/spec/faraday/options/env_spec.rb +8 -2
- data/spec/faraday/options/options_spec.rb +1 -1
- data/spec/faraday/options/proxy_options_spec.rb +15 -0
- data/spec/faraday/params_encoders/flat_spec.rb +8 -0
- data/spec/faraday/params_encoders/nested_spec.rb +16 -0
- data/spec/faraday/rack_builder_spec.rb +171 -50
- data/spec/faraday/request/authorization_spec.rb +54 -24
- data/spec/faraday/request/instrumentation_spec.rb +5 -7
- data/spec/faraday/request/json_spec.rb +199 -0
- data/spec/faraday/request/url_encoded_spec.rb +25 -2
- data/spec/faraday/request_spec.rb +11 -10
- data/spec/faraday/response/json_spec.rb +189 -0
- data/spec/faraday/response/logger_spec.rb +38 -0
- data/spec/faraday/response/raise_error_spec.rb +105 -0
- data/spec/faraday/response_spec.rb +3 -1
- data/spec/faraday/utils/headers_spec.rb +22 -4
- data/spec/faraday/utils_spec.rb +63 -1
- data/spec/faraday_spec.rb +8 -4
- data/spec/spec_helper.rb +6 -5
- data/spec/support/fake_safe_buffer.rb +1 -1
- data/spec/support/helper_methods.rb +0 -37
- data/spec/support/shared_examples/adapter.rb +4 -3
- data/spec/support/shared_examples/request_method.rb +60 -31
- metadata +19 -44
- data/UPGRADING.md +0 -55
- data/lib/faraday/adapter/em_http.rb +0 -285
- data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -62
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -69
- data/lib/faraday/adapter/em_synchrony.rb +0 -150
- data/lib/faraday/adapter/excon.rb +0 -124
- data/lib/faraday/adapter/httpclient.rb +0 -151
- data/lib/faraday/adapter/net_http.rb +0 -209
- data/lib/faraday/adapter/net_http_persistent.rb +0 -91
- data/lib/faraday/adapter/patron.rb +0 -132
- data/lib/faraday/adapter/rack.rb +0 -75
- data/lib/faraday/adapter/typhoeus.rb +0 -15
- data/lib/faraday/autoload.rb +0 -95
- data/lib/faraday/dependency_loader.rb +0 -37
- data/lib/faraday/file_part.rb +0 -128
- data/lib/faraday/param_part.rb +0 -53
- data/lib/faraday/request/basic_authentication.rb +0 -20
- data/lib/faraday/request/multipart.rb +0 -99
- data/lib/faraday/request/retry.rb +0 -239
- data/lib/faraday/request/token_authentication.rb +0 -20
- data/spec/faraday/adapter/em_http_spec.rb +0 -47
- data/spec/faraday/adapter/em_synchrony_spec.rb +0 -16
- data/spec/faraday/adapter/excon_spec.rb +0 -49
- data/spec/faraday/adapter/httpclient_spec.rb +0 -73
- data/spec/faraday/adapter/net_http_persistent_spec.rb +0 -57
- data/spec/faraday/adapter/net_http_spec.rb +0 -64
- data/spec/faraday/adapter/patron_spec.rb +0 -18
- data/spec/faraday/adapter/rack_spec.rb +0 -8
- data/spec/faraday/adapter/typhoeus_spec.rb +0 -7
- data/spec/faraday/composite_read_io_spec.rb +0 -80
- data/spec/faraday/request/multipart_spec.rb +0 -274
- data/spec/faraday/request/retry_spec.rb +0 -242
- data/spec/faraday/response/middleware_spec.rb +0 -52
- data/spec/support/webmock_rack_app.rb +0 -68
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:
|
4
|
+
version: 2.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "@technoweenie"
|
@@ -10,28 +10,28 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-01-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: faraday-net_http
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '2.0'
|
22
22
|
- - "<"
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: '3'
|
24
|
+
version: '3.2'
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
28
28
|
requirements:
|
29
29
|
- - ">="
|
30
30
|
- !ruby/object:Gem::Version
|
31
|
-
version: '
|
31
|
+
version: '2.0'
|
32
32
|
- - "<"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '3'
|
34
|
+
version: '3.2'
|
35
35
|
description:
|
36
36
|
email: technoweenie@gmail.com
|
37
37
|
executables: []
|
@@ -42,32 +42,18 @@ files:
|
|
42
42
|
- LICENSE.md
|
43
43
|
- README.md
|
44
44
|
- Rakefile
|
45
|
-
- UPGRADING.md
|
46
45
|
- examples/client_spec.rb
|
47
46
|
- examples/client_test.rb
|
48
47
|
- lib/faraday.rb
|
49
48
|
- lib/faraday/adapter.rb
|
50
|
-
- lib/faraday/adapter/em_http.rb
|
51
|
-
- lib/faraday/adapter/em_http_ssl_patch.rb
|
52
|
-
- lib/faraday/adapter/em_synchrony.rb
|
53
|
-
- lib/faraday/adapter/em_synchrony/parallel_manager.rb
|
54
|
-
- lib/faraday/adapter/excon.rb
|
55
|
-
- lib/faraday/adapter/httpclient.rb
|
56
|
-
- lib/faraday/adapter/net_http.rb
|
57
|
-
- lib/faraday/adapter/net_http_persistent.rb
|
58
|
-
- lib/faraday/adapter/patron.rb
|
59
|
-
- lib/faraday/adapter/rack.rb
|
60
49
|
- lib/faraday/adapter/test.rb
|
61
|
-
- lib/faraday/adapter/typhoeus.rb
|
62
50
|
- lib/faraday/adapter_registry.rb
|
63
|
-
- lib/faraday/autoload.rb
|
64
51
|
- lib/faraday/connection.rb
|
65
|
-
- lib/faraday/dependency_loader.rb
|
66
52
|
- lib/faraday/encoders/flat_params_encoder.rb
|
67
53
|
- lib/faraday/encoders/nested_params_encoder.rb
|
68
54
|
- lib/faraday/error.rb
|
69
|
-
- lib/faraday/file_part.rb
|
70
55
|
- lib/faraday/logging/formatter.rb
|
56
|
+
- lib/faraday/methods.rb
|
71
57
|
- lib/faraday/middleware.rb
|
72
58
|
- lib/faraday/middleware_registry.rb
|
73
59
|
- lib/faraday/options.rb
|
@@ -76,38 +62,28 @@ files:
|
|
76
62
|
- lib/faraday/options/proxy_options.rb
|
77
63
|
- lib/faraday/options/request_options.rb
|
78
64
|
- lib/faraday/options/ssl_options.rb
|
79
|
-
- lib/faraday/param_part.rb
|
80
65
|
- lib/faraday/parameters.rb
|
81
66
|
- lib/faraday/rack_builder.rb
|
82
67
|
- lib/faraday/request.rb
|
83
68
|
- lib/faraday/request/authorization.rb
|
84
|
-
- lib/faraday/request/basic_authentication.rb
|
85
69
|
- lib/faraday/request/instrumentation.rb
|
86
|
-
- lib/faraday/request/
|
87
|
-
- lib/faraday/request/retry.rb
|
88
|
-
- lib/faraday/request/token_authentication.rb
|
70
|
+
- lib/faraday/request/json.rb
|
89
71
|
- lib/faraday/request/url_encoded.rb
|
90
72
|
- lib/faraday/response.rb
|
73
|
+
- lib/faraday/response/json.rb
|
91
74
|
- lib/faraday/response/logger.rb
|
92
75
|
- lib/faraday/response/raise_error.rb
|
93
76
|
- lib/faraday/utils.rb
|
94
77
|
- lib/faraday/utils/headers.rb
|
95
78
|
- lib/faraday/utils/params_hash.rb
|
79
|
+
- lib/faraday/version.rb
|
96
80
|
- spec/external_adapters/faraday_specs_setup.rb
|
97
|
-
- spec/faraday/adapter/
|
98
|
-
- spec/faraday/adapter/em_synchrony_spec.rb
|
99
|
-
- spec/faraday/adapter/excon_spec.rb
|
100
|
-
- spec/faraday/adapter/httpclient_spec.rb
|
101
|
-
- spec/faraday/adapter/net_http_persistent_spec.rb
|
102
|
-
- spec/faraday/adapter/net_http_spec.rb
|
103
|
-
- spec/faraday/adapter/patron_spec.rb
|
104
|
-
- spec/faraday/adapter/rack_spec.rb
|
105
|
-
- spec/faraday/adapter/typhoeus_spec.rb
|
81
|
+
- spec/faraday/adapter/test_spec.rb
|
106
82
|
- spec/faraday/adapter_registry_spec.rb
|
107
83
|
- spec/faraday/adapter_spec.rb
|
108
|
-
- spec/faraday/composite_read_io_spec.rb
|
109
84
|
- spec/faraday/connection_spec.rb
|
110
85
|
- spec/faraday/error_spec.rb
|
86
|
+
- spec/faraday/middleware_registry_spec.rb
|
111
87
|
- spec/faraday/middleware_spec.rb
|
112
88
|
- spec/faraday/options/env_spec.rb
|
113
89
|
- spec/faraday/options/options_spec.rb
|
@@ -118,12 +94,11 @@ files:
|
|
118
94
|
- spec/faraday/rack_builder_spec.rb
|
119
95
|
- spec/faraday/request/authorization_spec.rb
|
120
96
|
- spec/faraday/request/instrumentation_spec.rb
|
121
|
-
- spec/faraday/request/
|
122
|
-
- spec/faraday/request/retry_spec.rb
|
97
|
+
- spec/faraday/request/json_spec.rb
|
123
98
|
- spec/faraday/request/url_encoded_spec.rb
|
124
99
|
- spec/faraday/request_spec.rb
|
100
|
+
- spec/faraday/response/json_spec.rb
|
125
101
|
- spec/faraday/response/logger_spec.rb
|
126
|
-
- spec/faraday/response/middleware_spec.rb
|
127
102
|
- spec/faraday/response/raise_error_spec.rb
|
128
103
|
- spec/faraday/response_spec.rb
|
129
104
|
- spec/faraday/utils/headers_spec.rb
|
@@ -137,31 +112,31 @@ files:
|
|
137
112
|
- spec/support/shared_examples/params_encoder.rb
|
138
113
|
- spec/support/shared_examples/request_method.rb
|
139
114
|
- spec/support/streaming_response_checker.rb
|
140
|
-
- spec/support/webmock_rack_app.rb
|
141
115
|
homepage: https://lostisland.github.io/faraday
|
142
116
|
licenses:
|
143
117
|
- MIT
|
144
118
|
metadata:
|
145
119
|
homepage_uri: https://lostisland.github.io/faraday
|
146
|
-
changelog_uri: https://github.com/lostisland/faraday/releases/tag/
|
120
|
+
changelog_uri: https://github.com/lostisland/faraday/releases/tag/v2.9.0
|
147
121
|
source_code_uri: https://github.com/lostisland/faraday
|
148
122
|
bug_tracker_uri: https://github.com/lostisland/faraday/issues
|
149
123
|
post_install_message:
|
150
124
|
rdoc_options: []
|
151
125
|
require_paths:
|
152
126
|
- lib
|
127
|
+
- spec/external_adapters
|
153
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
154
129
|
requirements:
|
155
130
|
- - ">="
|
156
131
|
- !ruby/object:Gem::Version
|
157
|
-
version: '
|
132
|
+
version: '3.0'
|
158
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
134
|
requirements:
|
160
135
|
- - ">="
|
161
136
|
- !ruby/object:Gem::Version
|
162
137
|
version: '0'
|
163
138
|
requirements: []
|
164
|
-
rubygems_version: 3.
|
139
|
+
rubygems_version: 3.5.3
|
165
140
|
signing_key:
|
166
141
|
specification_version: 4
|
167
142
|
summary: HTTP/REST API client library.
|
data/UPGRADING.md
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
## Faraday 1.0
|
2
|
-
|
3
|
-
### Errors
|
4
|
-
* Removes sub-class constants definition from `Faraday::Error`. A sub-class (e.g. `ClientError`) was previously accessible
|
5
|
-
either through the `Faraday` module (e.g. `Faraday::ClientError`) or through the `Faraday::Error` class (e.g. `Faraday::Error::ClientError`).
|
6
|
-
The latter is no longer available and the former should be used instead, so check your `rescue`s.
|
7
|
-
* Introduces a new `Faraday::ServerError` (5xx status codes) alongside the existing `Faraday::ClientError` (4xx status codes).
|
8
|
-
Please note `Faraday::ClientError` was previously used for both.
|
9
|
-
* Introduces new Errors that describe the most common REST status codes:
|
10
|
-
* Faraday::BadRequestError (400)
|
11
|
-
* Faraday::UnauthorizedError (401)
|
12
|
-
* Faraday::ForbiddenError (403)
|
13
|
-
* Faraday::ProxyAuthError (407). Please note this raised a `Faraday::ConnectionFailed` before.
|
14
|
-
* Faraday::ConflictError (409)
|
15
|
-
* Faraday::UnprocessableEntityError (422)
|
16
|
-
* The following error classes have changed the hierarchy to better mirror their real-world usage and semantic meaning:
|
17
|
-
* TimeoutError < ServerError (was < ClientError)
|
18
|
-
* ConnectionFailed < Error (was < ClientError)
|
19
|
-
* SSLError < Error (was < ClientError)
|
20
|
-
* ParsingError < Error (was < ClientError)
|
21
|
-
* RetriableResponse < Error (was < ClientError)
|
22
|
-
|
23
|
-
### Custom adapters
|
24
|
-
If you have written a custom adapter, please be aware that `env.body` is now an alias to the two new properties `request_body` and `response_body`.
|
25
|
-
This should work without you noticing if your adapter inherits from `Faraday::Adapter` and calls `save_response`, but if it doesn't, then please ensure you set the `status` BEFORE the `body` while processing the response.
|
26
|
-
|
27
|
-
### Others
|
28
|
-
* Dropped support for jruby and Rubinius.
|
29
|
-
* Officially supports Ruby 2.4+
|
30
|
-
* In order to specify the adapter you now MUST use the `#adapter` method on the connection builder. If you don't do so and your adapter inherits from `Faraday::Adapter` then Faraday will raise an exception. Otherwise, Faraday will automatically push the default adapter at the end of the stack causing your request to be executed twice.
|
31
|
-
```ruby
|
32
|
-
class OfficialAdapter < Faraday::Adapter
|
33
|
-
...
|
34
|
-
end
|
35
|
-
|
36
|
-
class MyAdapter
|
37
|
-
...
|
38
|
-
end
|
39
|
-
|
40
|
-
# This will raise an exception
|
41
|
-
conn = Faraday.new(...) do |f|
|
42
|
-
f.use OfficialAdapter
|
43
|
-
end
|
44
|
-
|
45
|
-
# This will cause Faraday inserting the default adapter at the end of the stack
|
46
|
-
conn = Faraday.new(...) do |f|
|
47
|
-
f.use MyAdapter
|
48
|
-
end
|
49
|
-
|
50
|
-
# You MUST use `adapter` method
|
51
|
-
conn = Faraday.new(...) do |f|
|
52
|
-
f.adapter AnyAdapter
|
53
|
-
end
|
54
|
-
```
|
55
|
-
|
@@ -1,285 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Faraday
|
4
|
-
class Adapter
|
5
|
-
# EventMachine adapter. This adapter is useful for either asynchronous
|
6
|
-
# requests when in an EM reactor loop, or for making parallel requests in
|
7
|
-
# synchronous code.
|
8
|
-
class EMHttp < Faraday::Adapter
|
9
|
-
# Options is a module containing helpers to convert the Faraday env object
|
10
|
-
# into options hashes for EMHTTP method calls.
|
11
|
-
module Options
|
12
|
-
# @return [Hash]
|
13
|
-
def connection_config(env)
|
14
|
-
options = {}
|
15
|
-
configure_proxy(options, env)
|
16
|
-
configure_timeout(options, env)
|
17
|
-
configure_socket(options, env)
|
18
|
-
configure_ssl(options, env)
|
19
|
-
options
|
20
|
-
end
|
21
|
-
|
22
|
-
def request_config(env)
|
23
|
-
options = {
|
24
|
-
body: read_body(env),
|
25
|
-
head: env[:request_headers]
|
26
|
-
# keepalive: true,
|
27
|
-
# file: 'path/to/file', # stream data off disk
|
28
|
-
}
|
29
|
-
configure_compression(options, env)
|
30
|
-
options
|
31
|
-
end
|
32
|
-
|
33
|
-
def read_body(env)
|
34
|
-
body = env[:body]
|
35
|
-
body.respond_to?(:read) ? body.read : body
|
36
|
-
end
|
37
|
-
|
38
|
-
# Reads out proxy settings from env into options
|
39
|
-
def configure_proxy(options, env)
|
40
|
-
proxy = request_options(env)[:proxy]
|
41
|
-
return unless proxy
|
42
|
-
|
43
|
-
options[:proxy] = {
|
44
|
-
host: proxy[:uri].host,
|
45
|
-
port: proxy[:uri].port,
|
46
|
-
authorization: [proxy[:user], proxy[:password]]
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
|
-
# Reads out host and port settings from env into options
|
51
|
-
def configure_socket(options, env)
|
52
|
-
bind = request_options(env)[:bind]
|
53
|
-
return unless bind
|
54
|
-
|
55
|
-
options[:bind] = {
|
56
|
-
host: bind[:host],
|
57
|
-
port: bind[:port]
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
# Reads out SSL certificate settings from env into options
|
62
|
-
def configure_ssl(options, env)
|
63
|
-
return unless env[:url].scheme == 'https' && env[:ssl]
|
64
|
-
|
65
|
-
options[:ssl] = {
|
66
|
-
cert_chain_file: env[:ssl][:ca_file],
|
67
|
-
verify_peer: env[:ssl].fetch(:verify, true)
|
68
|
-
}
|
69
|
-
end
|
70
|
-
|
71
|
-
# Reads out timeout settings from env into options
|
72
|
-
def configure_timeout(options, env)
|
73
|
-
req = request_options(env)
|
74
|
-
options[:inactivity_timeout] = request_timeout(:read, req)
|
75
|
-
options[:connect_timeout] = request_timeout(:open, req)
|
76
|
-
end
|
77
|
-
|
78
|
-
# Reads out compression header settings from env into options
|
79
|
-
def configure_compression(options, env)
|
80
|
-
return unless (env[:method] == :get) &&
|
81
|
-
!options[:head].key?('accept-encoding')
|
82
|
-
|
83
|
-
options[:head]['accept-encoding'] = 'gzip, compressed'
|
84
|
-
end
|
85
|
-
|
86
|
-
def request_options(env)
|
87
|
-
env[:request]
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
include Options
|
92
|
-
|
93
|
-
dependency 'em-http'
|
94
|
-
|
95
|
-
self.supports_parallel = true
|
96
|
-
|
97
|
-
# @return [Manager]
|
98
|
-
def self.setup_parallel_manager(_options = nil)
|
99
|
-
Manager.new
|
100
|
-
end
|
101
|
-
|
102
|
-
def call(env)
|
103
|
-
super
|
104
|
-
perform_request env
|
105
|
-
@app.call env
|
106
|
-
end
|
107
|
-
|
108
|
-
def perform_request(env)
|
109
|
-
if parallel?(env)
|
110
|
-
manager = env[:parallel_manager]
|
111
|
-
manager.add do
|
112
|
-
perform_single_request(env)
|
113
|
-
.callback { env[:response].finish(env) }
|
114
|
-
end
|
115
|
-
elsif EventMachine.reactor_running?
|
116
|
-
# EM is running: instruct upstream that this is an async request
|
117
|
-
env[:parallel_manager] = true
|
118
|
-
perform_single_request(env)
|
119
|
-
.callback { env[:response].finish(env) }
|
120
|
-
.errback do
|
121
|
-
# TODO: no way to communicate the error in async mode
|
122
|
-
raise NotImplementedError
|
123
|
-
end
|
124
|
-
else
|
125
|
-
error = nil
|
126
|
-
# start EM, block until request is completed
|
127
|
-
EventMachine.run do
|
128
|
-
perform_single_request(env)
|
129
|
-
.callback { EventMachine.stop }
|
130
|
-
.errback do |client|
|
131
|
-
error = error_message(client)
|
132
|
-
EventMachine.stop
|
133
|
-
end
|
134
|
-
end
|
135
|
-
raise_error(error) if error
|
136
|
-
end
|
137
|
-
rescue EventMachine::Connectify::CONNECTError => e
|
138
|
-
if e.message.include?('Proxy Authentication Required')
|
139
|
-
raise Faraday::ConnectionFailed,
|
140
|
-
%(407 "Proxy Authentication Required ")
|
141
|
-
end
|
142
|
-
|
143
|
-
raise Faraday::ConnectionFailed, e
|
144
|
-
rescue StandardError => e
|
145
|
-
if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError)
|
146
|
-
raise Faraday::SSLError, e
|
147
|
-
end
|
148
|
-
|
149
|
-
raise
|
150
|
-
end
|
151
|
-
|
152
|
-
# TODO: reuse the connection to support pipelining
|
153
|
-
def perform_single_request(env)
|
154
|
-
req = create_request(env)
|
155
|
-
req = req.setup_request(env[:method], request_config(env))
|
156
|
-
req.callback do |client|
|
157
|
-
if env[:request].stream_response?
|
158
|
-
warn "Streaming downloads for #{self.class.name} " \
|
159
|
-
'are not yet implemented.'
|
160
|
-
env[:request].on_data.call(
|
161
|
-
client.response,
|
162
|
-
client.response.bytesize
|
163
|
-
)
|
164
|
-
end
|
165
|
-
status = client.response_header.status
|
166
|
-
reason = client.response_header.http_reason
|
167
|
-
save_response(env, status, client.response, nil, reason) do |headers|
|
168
|
-
client.response_header.each do |name, value|
|
169
|
-
headers[name.to_sym] = value
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
def create_request(env)
|
176
|
-
EventMachine::HttpRequest.new(
|
177
|
-
env[:url], connection_config(env).merge(@connection_options)
|
178
|
-
)
|
179
|
-
end
|
180
|
-
|
181
|
-
def error_message(client)
|
182
|
-
client.error || 'request failed'
|
183
|
-
end
|
184
|
-
|
185
|
-
def raise_error(msg)
|
186
|
-
error_class = Faraday::ClientError
|
187
|
-
if timeout_message?(msg)
|
188
|
-
error_class = Faraday::TimeoutError
|
189
|
-
msg = 'request timed out'
|
190
|
-
elsif msg == Errno::ECONNREFUSED
|
191
|
-
error_class = Faraday::ConnectionFailed
|
192
|
-
msg = 'connection refused'
|
193
|
-
elsif msg == 'connection closed by server'
|
194
|
-
error_class = Faraday::ConnectionFailed
|
195
|
-
end
|
196
|
-
raise error_class, msg
|
197
|
-
end
|
198
|
-
|
199
|
-
def timeout_message?(msg)
|
200
|
-
msg == Errno::ETIMEDOUT ||
|
201
|
-
(msg.is_a?(String) && msg.include?('timeout error'))
|
202
|
-
end
|
203
|
-
|
204
|
-
# @return [Boolean]
|
205
|
-
def parallel?(env)
|
206
|
-
!!env[:parallel_manager]
|
207
|
-
end
|
208
|
-
|
209
|
-
# This parallel manager is designed to start an EventMachine loop
|
210
|
-
# and block until all registered requests have been completed.
|
211
|
-
class Manager
|
212
|
-
# @see reset
|
213
|
-
def initialize
|
214
|
-
reset
|
215
|
-
end
|
216
|
-
|
217
|
-
# Re-initializes instance variables
|
218
|
-
def reset
|
219
|
-
@registered_procs = []
|
220
|
-
@num_registered = 0
|
221
|
-
@num_succeeded = 0
|
222
|
-
@errors = []
|
223
|
-
@running = false
|
224
|
-
end
|
225
|
-
|
226
|
-
# @return [Boolean]
|
227
|
-
def running?
|
228
|
-
@running
|
229
|
-
end
|
230
|
-
|
231
|
-
def add(&block)
|
232
|
-
if running?
|
233
|
-
perform_request { yield }
|
234
|
-
else
|
235
|
-
@registered_procs << block
|
236
|
-
end
|
237
|
-
@num_registered += 1
|
238
|
-
end
|
239
|
-
|
240
|
-
def run
|
241
|
-
if @num_registered.positive?
|
242
|
-
@running = true
|
243
|
-
EventMachine.run do
|
244
|
-
@registered_procs.each do |proc|
|
245
|
-
perform_request(&proc)
|
246
|
-
end
|
247
|
-
end
|
248
|
-
unless @errors.empty?
|
249
|
-
raise Faraday::ClientError, @errors.first || 'connection failed'
|
250
|
-
end
|
251
|
-
end
|
252
|
-
ensure
|
253
|
-
reset
|
254
|
-
end
|
255
|
-
|
256
|
-
def perform_request
|
257
|
-
client = yield
|
258
|
-
client.callback do
|
259
|
-
@num_succeeded += 1
|
260
|
-
check_finished
|
261
|
-
end
|
262
|
-
client.errback do
|
263
|
-
@errors << client.error
|
264
|
-
check_finished
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
def check_finished
|
269
|
-
EventMachine.stop if @num_succeeded + @errors.size == @num_registered
|
270
|
-
end
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
if Faraday::Adapter::EMHttp.loaded?
|
277
|
-
begin
|
278
|
-
require 'openssl'
|
279
|
-
rescue LoadError
|
280
|
-
warn 'Warning: no such file to load -- openssl. ' \
|
281
|
-
'Make sure it is installed if you want HTTPS support'
|
282
|
-
else
|
283
|
-
require 'faraday/adapter/em_http_ssl_patch'
|
284
|
-
end
|
285
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'openssl'
|
4
|
-
require 'em-http'
|
5
|
-
|
6
|
-
# EventMachine patch to make SSL work.
|
7
|
-
module EmHttpSslPatch
|
8
|
-
def ssl_verify_peer(cert_string)
|
9
|
-
begin
|
10
|
-
@last_seen_cert = OpenSSL::X509::Certificate.new(cert_string)
|
11
|
-
rescue OpenSSL::X509::CertificateError
|
12
|
-
return false
|
13
|
-
end
|
14
|
-
|
15
|
-
unless certificate_store.verify(@last_seen_cert)
|
16
|
-
raise OpenSSL::SSL::SSLError,
|
17
|
-
%(unable to verify the server certificate for "#{host}")
|
18
|
-
end
|
19
|
-
|
20
|
-
begin
|
21
|
-
certificate_store.add_cert(@last_seen_cert)
|
22
|
-
rescue OpenSSL::X509::StoreError => e
|
23
|
-
raise e unless e.message == 'cert already in hash table'
|
24
|
-
end
|
25
|
-
true
|
26
|
-
end
|
27
|
-
|
28
|
-
def ssl_handshake_completed
|
29
|
-
return true unless verify_peer?
|
30
|
-
|
31
|
-
unless verified_cert_identity?
|
32
|
-
raise OpenSSL::SSL::SSLError,
|
33
|
-
%(host "#{host}" does not match the server certificate)
|
34
|
-
end
|
35
|
-
|
36
|
-
true
|
37
|
-
end
|
38
|
-
|
39
|
-
def verify_peer?
|
40
|
-
parent.connopts.tls[:verify_peer]
|
41
|
-
end
|
42
|
-
|
43
|
-
def verified_cert_identity?
|
44
|
-
OpenSSL::SSL.verify_certificate_identity(@last_seen_cert, host)
|
45
|
-
end
|
46
|
-
|
47
|
-
def host
|
48
|
-
parent.uri.host
|
49
|
-
end
|
50
|
-
|
51
|
-
def certificate_store
|
52
|
-
@certificate_store ||= begin
|
53
|
-
store = OpenSSL::X509::Store.new
|
54
|
-
store.set_default_paths
|
55
|
-
ca_file = parent.connopts.tls[:cert_chain_file]
|
56
|
-
store.add_file(ca_file) if ca_file
|
57
|
-
store
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
EventMachine::HttpStubConnection.include(EmHttpSslPatch)
|
@@ -1,69 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Faraday
|
4
|
-
class Adapter
|
5
|
-
class EMSynchrony < Faraday::Adapter
|
6
|
-
# A parallel manager for EMSynchrony.
|
7
|
-
class ParallelManager
|
8
|
-
# Add requests to queue.
|
9
|
-
#
|
10
|
-
# @param request [EM::HttpRequest]
|
11
|
-
# @param method [Symbol, String] HTTP method
|
12
|
-
# @param args [Array] the rest of the positional arguments
|
13
|
-
def add(request, method, *args, &block)
|
14
|
-
queue << {
|
15
|
-
request: request,
|
16
|
-
method: method,
|
17
|
-
args: args,
|
18
|
-
block: block
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
# Run all requests on queue with `EM::Synchrony::Multi`, wrapping
|
23
|
-
# it in a reactor and fiber if needed.
|
24
|
-
def run
|
25
|
-
result = nil
|
26
|
-
if !EM.reactor_running?
|
27
|
-
EM.run do
|
28
|
-
Fiber.new do
|
29
|
-
result = perform
|
30
|
-
EM.stop
|
31
|
-
end.resume
|
32
|
-
end
|
33
|
-
else
|
34
|
-
result = perform
|
35
|
-
end
|
36
|
-
result
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
# The request queue.
|
42
|
-
def queue
|
43
|
-
@queue ||= []
|
44
|
-
end
|
45
|
-
|
46
|
-
# Main `EM::Synchrony::Multi` performer.
|
47
|
-
def perform
|
48
|
-
multi = ::EM::Synchrony::Multi.new
|
49
|
-
|
50
|
-
queue.each do |item|
|
51
|
-
method = "a#{item[:method]}".to_sym
|
52
|
-
|
53
|
-
req = item[:request].send(method, *item[:args])
|
54
|
-
req.callback(&item[:block])
|
55
|
-
|
56
|
-
req_name = "req_#{multi.requests.size}".to_sym
|
57
|
-
multi.add(req_name, req)
|
58
|
-
end
|
59
|
-
|
60
|
-
# Clear the queue, so parallel manager objects can be reused.
|
61
|
-
@queue = []
|
62
|
-
|
63
|
-
# Block fiber until all requests have returned.
|
64
|
-
multi.perform
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|