faraday-net_http_persistent 1.1.0 → 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.
- checksums.yaml +4 -4
- data/README.md +11 -18
- data/lib/faraday/adapter/net_http_persistent.rb +180 -37
- data/lib/faraday/net_http_persistent/version.rb +1 -1
- data/lib/faraday/net_http_persistent.rb +3 -2
- metadata +17 -109
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0b25e05ab410cbcbabe4c2ffef6bdebbf17b816ab0585299ccfc2ab6e84a6f2
|
4
|
+
data.tar.gz: 633f9198253455e34c773e4fc9c1bd0de5f19c464b57fe49181ea422c8e77cad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de8e7458abed9d8503ba67b4241d64a4b02baa528b316e0e10394dbfe40cfdb0a8a9ba9b71c5dd204c2a8a7c89aed6a529013aa52ee158335962fb46cadb3b01
|
7
|
+
data.tar.gz: bed233f50fd228cac2044a5a57892f368d76f779c29b41514abbd3190a10d89ccc08968aa85a9c7b40f8cf44bb014cb1ef7a83a1c1d018b0479538d7307731be
|
data/README.md
CHANGED
@@ -7,36 +7,29 @@ This gem is a [Faraday][faraday] adapter for the [Net::HTTP::Persistent gem][net
|
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
10
|
-
Add
|
10
|
+
Add this to your application's Gemfile:
|
11
11
|
|
12
12
|
```ruby
|
13
|
-
gem 'faraday-net_http_persistent'
|
14
|
-
gem 'net-http-persistent', '>= 3.1'
|
13
|
+
gem 'faraday-net_http_persistent', '~> 2.0'
|
15
14
|
```
|
16
15
|
|
17
16
|
And then execute:
|
18
17
|
|
19
18
|
$ bundle
|
20
19
|
|
21
|
-
Or install them yourself as:
|
22
|
-
|
23
|
-
$ gem install net_http_persistent -v '>= 3.1'
|
24
|
-
$ gem install faraday-net_http_persistent
|
25
|
-
|
26
20
|
## Usage
|
27
21
|
|
28
|
-
Configure your Faraday connection to use this adapter instead of the default one:
|
29
|
-
|
30
22
|
```ruby
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
require 'faraday/net_http_persistent'
|
24
|
+
|
25
|
+
conn = Faraday.new(...) do |f|
|
26
|
+
f.adapter :net_http_persistent, pool_size: 5 do |http|
|
27
|
+
# yields Net::HTTP::Persistent
|
28
|
+
http.idle_timeout = 100
|
29
|
+
end
|
34
30
|
end
|
35
31
|
```
|
36
32
|
|
37
|
-
For more information on how to setup your Faraday connection and adapters usage,
|
38
|
-
please refer to the [Faraday Website][faraday-website].
|
39
|
-
|
40
33
|
## Development
|
41
34
|
|
42
35
|
After checking out the repo, run `bin/setup` to install dependencies.
|
@@ -62,9 +55,9 @@ The gem is available as open source under the terms of the [MIT License][mit-lic
|
|
62
55
|
|
63
56
|
This project is intended to be a safe, welcoming space for collaboration.
|
64
57
|
Everyone interacting in the Faraday::Http project’s codebases, issue trackers,
|
65
|
-
chat rooms and mailing lists is expected to follow the [code of conduct].
|
58
|
+
chat rooms and mailing lists is expected to follow the [code of conduct][code-of-conduct].
|
66
59
|
|
67
|
-
[code-of-conduct]: https://github.com/lostisland/faraday-http/blob/
|
60
|
+
[code-of-conduct]: https://github.com/lostisland/faraday-http/blob/main/CODE_OF_CONDUCT.md
|
68
61
|
[covenant]: http://contributor-covenant.org
|
69
62
|
[faraday]: https://github.com/lostisland/faraday
|
70
63
|
[faraday-website]: https://lostisland.github.io/faraday
|
@@ -1,33 +1,143 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "net/http/persistent"
|
4
|
+
|
3
5
|
module Faraday
|
4
6
|
class Adapter
|
5
7
|
# Net::HTTP::Persistent adapter.
|
6
|
-
class NetHttpPersistent <
|
7
|
-
|
8
|
+
class NetHttpPersistent < Faraday::Adapter
|
9
|
+
exceptions = [
|
10
|
+
IOError,
|
11
|
+
Errno::EADDRNOTAVAIL,
|
12
|
+
Errno::EALREADY,
|
13
|
+
Errno::ECONNABORTED,
|
14
|
+
Errno::ECONNREFUSED,
|
15
|
+
Errno::ECONNRESET,
|
16
|
+
Errno::EHOSTUNREACH,
|
17
|
+
Errno::EINVAL,
|
18
|
+
Errno::ENETUNREACH,
|
19
|
+
Errno::EPIPE,
|
20
|
+
Net::HTTPBadResponse,
|
21
|
+
Net::HTTPHeaderSyntaxError,
|
22
|
+
Net::ProtocolError,
|
23
|
+
SocketError,
|
24
|
+
Zlib::GzipFile::Error
|
25
|
+
]
|
26
|
+
|
27
|
+
exceptions << ::OpenSSL::SSL::SSLError if defined?(::OpenSSL::SSL::SSLError)
|
28
|
+
# TODO (breaking): Enable this to make it consistent with net_http adapter.
|
29
|
+
# See https://github.com/lostisland/faraday/issues/718#issuecomment-344549382
|
30
|
+
# exceptions << ::Net::OpenTimeout if defined?(::Net::OpenTimeout)
|
31
|
+
|
32
|
+
NET_HTTP_EXCEPTIONS = exceptions.freeze
|
33
|
+
|
34
|
+
def initialize(app = nil, opts = {}, &block)
|
35
|
+
@ssl_cert_store = nil
|
36
|
+
super(app, opts, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def call(env)
|
40
|
+
super
|
41
|
+
connection(env) do |http|
|
42
|
+
perform_request(http, env)
|
43
|
+
rescue Net::HTTP::Persistent::Error => e
|
44
|
+
raise Faraday::TimeoutError, e if e.message.include?("Timeout")
|
45
|
+
|
46
|
+
raise Faraday::ConnectionFailed, e if e.message.include?("connection refused")
|
47
|
+
|
48
|
+
raise
|
49
|
+
rescue *NET_HTTP_EXCEPTIONS => e
|
50
|
+
raise Faraday::SSLError, e if defined?(OpenSSL) && e.is_a?(OpenSSL::SSL::SSLError)
|
51
|
+
|
52
|
+
raise Faraday::ConnectionFailed, e
|
53
|
+
end
|
54
|
+
@app.call env
|
55
|
+
rescue Timeout::Error, Errno::ETIMEDOUT => e
|
56
|
+
raise Faraday::TimeoutError, e
|
57
|
+
end
|
58
|
+
|
59
|
+
def close
|
60
|
+
@cached_connection&.shutdown
|
61
|
+
end
|
8
62
|
|
9
63
|
private
|
10
64
|
|
11
|
-
def
|
12
|
-
|
13
|
-
if
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
65
|
+
def build_connection(env)
|
66
|
+
net_http_connection(env).tap do |http|
|
67
|
+
http.use_ssl = env[:url].scheme == "https" if http.respond_to?(:use_ssl=)
|
68
|
+
configure_ssl(http, env[:ssl])
|
69
|
+
configure_request(http, env[:request])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_request(env)
|
74
|
+
request = Net::HTTPGenericRequest.new \
|
75
|
+
env[:method].to_s.upcase, # request method
|
76
|
+
!!env[:body], # is there request body
|
77
|
+
env[:method] != :head, # is there response body
|
78
|
+
env[:url].request_uri, # request uri path
|
79
|
+
env[:request_headers] # request headers
|
80
|
+
|
81
|
+
if env[:body].respond_to?(:read)
|
82
|
+
request.body_stream = env[:body]
|
83
|
+
else
|
84
|
+
request.body = env[:body]
|
85
|
+
end
|
86
|
+
request
|
87
|
+
end
|
88
|
+
|
89
|
+
def save_http_response(env, http_response)
|
90
|
+
save_response(
|
91
|
+
env, http_response.code.to_i, nil, nil, http_response.message, finished: false
|
92
|
+
) do |response_headers|
|
93
|
+
http_response.each_header do |key, value|
|
94
|
+
response_headers[key] = value
|
22
95
|
end
|
96
|
+
end
|
97
|
+
end
|
23
98
|
|
24
|
-
|
25
|
-
if
|
26
|
-
|
99
|
+
def configure_request(http, req)
|
100
|
+
if (sec = request_timeout(:read, req))
|
101
|
+
http.read_timeout = sec
|
102
|
+
end
|
103
|
+
|
104
|
+
if (sec = http.respond_to?(:write_timeout=) &&
|
105
|
+
request_timeout(:write, req))
|
106
|
+
http.write_timeout = sec
|
107
|
+
end
|
108
|
+
|
109
|
+
if (sec = request_timeout(:open, req))
|
110
|
+
http.open_timeout = sec
|
27
111
|
end
|
112
|
+
|
113
|
+
# Only set if Net::Http supports it, since Ruby 2.5.
|
114
|
+
http.max_retries = 0 if http.respond_to?(:max_retries=)
|
115
|
+
|
116
|
+
@config_block&.call(http)
|
117
|
+
end
|
118
|
+
|
119
|
+
def ssl_cert_store(ssl)
|
120
|
+
return ssl[:cert_store] if ssl[:cert_store]
|
121
|
+
|
122
|
+
# Use the default cert store by default, i.e. system ca certs
|
123
|
+
@ssl_cert_store ||= OpenSSL::X509::Store.new.tap(&:set_default_paths)
|
124
|
+
end
|
125
|
+
|
126
|
+
def net_http_connection(env)
|
127
|
+
@cached_connection ||= Net::HTTP::Persistent.new(**init_options)
|
128
|
+
|
129
|
+
proxy_uri = proxy_uri(env)
|
130
|
+
@cached_connection.proxy = proxy_uri if @cached_connection.proxy_uri != proxy_uri
|
28
131
|
@cached_connection
|
29
132
|
end
|
30
133
|
|
134
|
+
def init_options
|
135
|
+
options = {}
|
136
|
+
options[:name] = @connection_options.fetch(:name, "Faraday")
|
137
|
+
options[:pool_size] = @connection_options[:pool_size] if @connection_options.key?(:pool_size)
|
138
|
+
options
|
139
|
+
end
|
140
|
+
|
31
141
|
def proxy_uri(env)
|
32
142
|
proxy_uri = nil
|
33
143
|
if (proxy = env[:request][:proxy])
|
@@ -36,31 +146,36 @@ module Faraday
|
|
36
146
|
else
|
37
147
|
::URI.parse(proxy[:uri].to_s)
|
38
148
|
end
|
39
|
-
proxy_uri.user =
|
40
|
-
|
41
|
-
# not unescaping user/password
|
42
|
-
if proxy[:user]
|
43
|
-
(class << proxy_uri; self; end).class_eval do
|
44
|
-
define_method(:user) { proxy[:user] }
|
45
|
-
define_method(:password) { proxy[:password] }
|
46
|
-
end
|
47
|
-
end
|
149
|
+
proxy_uri.user = proxy[:user] if proxy[:user]
|
150
|
+
proxy_uri.password = proxy[:password] if proxy[:password]
|
48
151
|
end
|
49
152
|
proxy_uri
|
50
153
|
end
|
51
154
|
|
52
155
|
def perform_request(http, env)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
raise Faraday::ConnectionFailed, e
|
156
|
+
if env.stream_response?
|
157
|
+
http_response = env.stream_response do |&on_data|
|
158
|
+
request_with_wrapped_block(http, env, &on_data)
|
159
|
+
end
|
160
|
+
http_response.body = nil
|
161
|
+
else
|
162
|
+
http_response = request_with_wrapped_block(http, env)
|
61
163
|
end
|
164
|
+
env.response_body = encoded_body(http_response)
|
165
|
+
env.response.finish(env)
|
166
|
+
http_response
|
167
|
+
end
|
62
168
|
|
63
|
-
|
169
|
+
def request_with_wrapped_block(http, env)
|
170
|
+
http.request(env[:url], create_request(env)) do |response|
|
171
|
+
save_http_response(env, response)
|
172
|
+
|
173
|
+
if block_given?
|
174
|
+
response.read_body do |chunk|
|
175
|
+
yield(chunk)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
64
179
|
end
|
65
180
|
|
66
181
|
SSL_CONFIGURATIONS = {
|
@@ -69,8 +184,15 @@ module Faraday
|
|
69
184
|
ca_file: :ca_file,
|
70
185
|
ssl_version: :version,
|
71
186
|
min_version: :min_version,
|
72
|
-
max_version: :max_version
|
73
|
-
|
187
|
+
max_version: :max_version,
|
188
|
+
verify_hostname: :verify_hostname
|
189
|
+
}
|
190
|
+
|
191
|
+
if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new("2.11.0")
|
192
|
+
SSL_CONFIGURATIONS[:ciphers] = :ciphers
|
193
|
+
end
|
194
|
+
|
195
|
+
SSL_CONFIGURATIONS.freeze
|
74
196
|
|
75
197
|
def configure_ssl(http, ssl)
|
76
198
|
return unless ssl
|
@@ -79,13 +201,34 @@ module Faraday
|
|
79
201
|
http_set(http, :cert_store, ssl_cert_store(ssl))
|
80
202
|
|
81
203
|
SSL_CONFIGURATIONS
|
82
|
-
.select { |_, key| ssl[key] }
|
204
|
+
.select { |_, key| !ssl[key].nil? }
|
83
205
|
.each { |target, key| http_set(http, target, ssl[key]) }
|
84
206
|
end
|
85
207
|
|
86
208
|
def http_set(http, attr, value)
|
87
209
|
http.send("#{attr}=", value) if http.send(attr) != value
|
88
210
|
end
|
211
|
+
|
212
|
+
def ssl_verify_mode(ssl)
|
213
|
+
ssl[:verify_mode] ||
|
214
|
+
if ssl.fetch(:verify, true)
|
215
|
+
OpenSSL::SSL::VERIFY_PEER
|
216
|
+
else
|
217
|
+
OpenSSL::SSL::VERIFY_NONE
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def encoded_body(http_response)
|
222
|
+
body = http_response.body || +""
|
223
|
+
/\bcharset=\s*(.+?)\s*(;|$)/.match(http_response["Content-Type"]) do |match|
|
224
|
+
content_charset = ::Encoding.find(match.captures.first)
|
225
|
+
body = body.dup if body.frozen?
|
226
|
+
body.force_encoding(content_charset)
|
227
|
+
rescue ArgumentError
|
228
|
+
nil
|
229
|
+
end
|
230
|
+
body
|
231
|
+
end
|
89
232
|
end
|
90
233
|
end
|
91
234
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
require "faraday"
|
4
|
+
require "faraday/adapter/net_http_persistent"
|
5
|
+
require "faraday/net_http_persistent/version"
|
5
6
|
|
6
7
|
module Faraday
|
7
8
|
module NetHttpPersistent
|
metadata
CHANGED
@@ -1,141 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday-net_http_persistent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Rogers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: net-http-persistent
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '3.1'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '3.1'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bundler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '2.0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '2.0'
|
41
13
|
- !ruby/object:Gem::Dependency
|
42
14
|
name: faraday
|
43
15
|
requirement: !ruby/object:Gem::Requirement
|
44
16
|
requirements:
|
45
17
|
- - "~>"
|
46
18
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
48
|
-
type: :
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rake
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '13.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '13.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '3.0'
|
76
|
-
type: :development
|
19
|
+
version: '2.5'
|
20
|
+
type: :runtime
|
77
21
|
prerelease: false
|
78
22
|
version_requirements: !ruby/object:Gem::Requirement
|
79
23
|
requirements:
|
80
24
|
- - "~>"
|
81
25
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
26
|
+
version: '2.5'
|
83
27
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 0.19.0
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 0.19.0
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: standardrb
|
28
|
+
name: net-http-persistent
|
99
29
|
requirement: !ruby/object:Gem::Requirement
|
100
30
|
requirements:
|
101
|
-
- - "
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '1.0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
31
|
+
- - ">="
|
109
32
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
111
|
-
-
|
112
|
-
name: multipart-parser
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
33
|
+
version: 4.0.4
|
34
|
+
- - "<"
|
116
35
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
118
|
-
type: :
|
36
|
+
version: '5'
|
37
|
+
type: :runtime
|
119
38
|
prerelease: false
|
120
39
|
version_requirements: !ruby/object:Gem::Requirement
|
121
40
|
requirements:
|
122
|
-
- - "
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: 0.1.1
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: webmock
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
41
|
+
- - ">="
|
130
42
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
132
|
-
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
43
|
+
version: 4.0.4
|
44
|
+
- - "<"
|
137
45
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
46
|
+
version: '5'
|
139
47
|
description: Faraday adapter for NetHttpPersistent
|
140
48
|
email:
|
141
49
|
- me@mikerogers.io
|
@@ -154,7 +62,7 @@ licenses:
|
|
154
62
|
metadata:
|
155
63
|
homepage_uri: https://github.com/lostisland/faraday-net_http_persistent
|
156
64
|
source_code_uri: https://github.com/lostisland/faraday-net_http_persistent
|
157
|
-
changelog_uri: https://github.com/lostisland/faraday-net_http_persistent
|
65
|
+
changelog_uri: https://github.com/lostisland/faraday-net_http_persistent/releases/tag/v2.3.0
|
158
66
|
post_install_message:
|
159
67
|
rdoc_options: []
|
160
68
|
require_paths:
|
@@ -163,7 +71,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
163
71
|
requirements:
|
164
72
|
- - ">="
|
165
73
|
- !ruby/object:Gem::Version
|
166
|
-
version: 2.
|
74
|
+
version: 2.6.0
|
167
75
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
76
|
requirements:
|
169
77
|
- - ">="
|