faraday-net_http_persistent 1.2.0 → 2.3.1
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 +9 -16
- data/lib/faraday/adapter/net_http_persistent.rb +176 -52
- data/lib/faraday/net_http_persistent/version.rb +1 -1
- data/lib/faraday/net_http_persistent.rb +3 -2
- metadata +18 -113
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0a30d1b7f951736304ef576b56e823fd2890558fd37958f165b20b7a2062898
|
4
|
+
data.tar.gz: c13f2ae91f08c494edbbf0da037e871b899232033816e0fb94e97256d0cb302b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86e56512f0345a2987dcd3d35df59e755890c6e7d96fb00295f15a02f97ade28d46555c1211163d7d8a565214cb024f8fe12add1cd60d4bb51fd8ba41bb997f8
|
7
|
+
data.tar.gz: fb29b818366aba5ce542eef1193c709d37635a6eee329a7730cd16670deb51ee1244255f8513022a18796f12d970ca2a8b373665f3382ff726fab114d20b163c
|
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.
|
@@ -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
|
27
107
|
end
|
108
|
+
|
109
|
+
if (sec = request_timeout(:open, req))
|
110
|
+
http.open_timeout = sec
|
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,50 +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
|
-
if env
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
http_response = http.request(env[:url], create_request(env)) do |response|
|
58
|
-
response.read_body do |chunk|
|
59
|
-
if chunk.bytesize.positive? || size.positive?
|
60
|
-
yielded = true
|
61
|
-
size += chunk.bytesize
|
62
|
-
env[:request].on_data.call(chunk, size)
|
63
|
-
end
|
64
|
-
end
|
156
|
+
if env.stream_response?
|
157
|
+
http_response = env.stream_response do |&on_data|
|
158
|
+
request_with_wrapped_block(http, env, &on_data)
|
65
159
|
end
|
66
|
-
|
67
|
-
env[:request].on_data.call(+"", 0) unless yielded
|
68
160
|
http_response.body = nil
|
69
|
-
http_response
|
70
161
|
else
|
71
|
-
http
|
162
|
+
http_response = request_with_wrapped_block(http, env)
|
72
163
|
end
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
164
|
+
env.response_body = encoded_body(http_response)
|
165
|
+
env.response.finish(env)
|
166
|
+
http_response
|
167
|
+
end
|
77
168
|
|
78
|
-
|
79
|
-
|
80
|
-
|
169
|
+
def request_with_wrapped_block(http, env)
|
170
|
+
http.request(env[:url], create_request(env)) do |response|
|
171
|
+
save_http_response(env, response)
|
81
172
|
|
82
|
-
|
173
|
+
if block_given?
|
174
|
+
response.read_body do |chunk|
|
175
|
+
yield(chunk)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
83
179
|
end
|
84
180
|
|
85
181
|
SSL_CONFIGURATIONS = {
|
@@ -88,8 +184,15 @@ module Faraday
|
|
88
184
|
ca_file: :ca_file,
|
89
185
|
ssl_version: :version,
|
90
186
|
min_version: :min_version,
|
91
|
-
max_version: :max_version
|
92
|
-
|
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
|
93
196
|
|
94
197
|
def configure_ssl(http, ssl)
|
95
198
|
return unless ssl
|
@@ -98,13 +201,34 @@ module Faraday
|
|
98
201
|
http_set(http, :cert_store, ssl_cert_store(ssl))
|
99
202
|
|
100
203
|
SSL_CONFIGURATIONS
|
101
|
-
.select { |_, key| ssl[key] }
|
204
|
+
.select { |_, key| !ssl[key].nil? }
|
102
205
|
.each { |target, key| http_set(http, target, ssl[key]) }
|
103
206
|
end
|
104
207
|
|
105
208
|
def http_set(http, attr, value)
|
106
209
|
http.send("#{attr}=", value) if http.send(attr) != value
|
107
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
|
108
232
|
end
|
109
233
|
end
|
110
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,48 @@
|
|
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.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Rogers
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
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
12
|
- !ruby/object:Gem::Dependency
|
42
13
|
name: faraday
|
43
14
|
requirement: !ruby/object:Gem::Requirement
|
44
15
|
requirements:
|
45
16
|
- - "~>"
|
46
17
|
- !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
|
18
|
+
version: '2.5'
|
19
|
+
type: :runtime
|
77
20
|
prerelease: false
|
78
21
|
version_requirements: !ruby/object:Gem::Requirement
|
79
22
|
requirements:
|
80
23
|
- - "~>"
|
81
24
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
25
|
+
version: '2.5'
|
83
26
|
- !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
|
27
|
+
name: net-http-persistent
|
99
28
|
requirement: !ruby/object:Gem::Requirement
|
100
29
|
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
|
-
- - "~>"
|
30
|
+
- - ">="
|
109
31
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
111
|
-
-
|
112
|
-
name: multipart-parser
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
32
|
+
version: 4.0.4
|
33
|
+
- - "<"
|
116
34
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
118
|
-
type: :
|
35
|
+
version: '5'
|
36
|
+
type: :runtime
|
119
37
|
prerelease: false
|
120
38
|
version_requirements: !ruby/object:Gem::Requirement
|
121
39
|
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
|
-
- - "~>"
|
40
|
+
- - ">="
|
130
41
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
132
|
-
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
42
|
+
version: 4.0.4
|
43
|
+
- - "<"
|
137
44
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
45
|
+
version: '5'
|
139
46
|
description: Faraday adapter for NetHttpPersistent
|
140
47
|
email:
|
141
48
|
- me@mikerogers.io
|
@@ -154,8 +61,7 @@ licenses:
|
|
154
61
|
metadata:
|
155
62
|
homepage_uri: https://github.com/lostisland/faraday-net_http_persistent
|
156
63
|
source_code_uri: https://github.com/lostisland/faraday-net_http_persistent
|
157
|
-
changelog_uri: https://github.com/lostisland/faraday-net_http_persistent
|
158
|
-
post_install_message:
|
64
|
+
changelog_uri: https://github.com/lostisland/faraday-net_http_persistent/releases/tag/v2.3.1
|
159
65
|
rdoc_options: []
|
160
66
|
require_paths:
|
161
67
|
- lib
|
@@ -163,15 +69,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
163
69
|
requirements:
|
164
70
|
- - ">="
|
165
71
|
- !ruby/object:Gem::Version
|
166
|
-
version: 2.
|
72
|
+
version: 2.6.0
|
167
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
74
|
requirements:
|
169
75
|
- - ">="
|
170
76
|
- !ruby/object:Gem::Version
|
171
77
|
version: '0'
|
172
78
|
requirements: []
|
173
|
-
rubygems_version: 3.
|
174
|
-
signing_key:
|
79
|
+
rubygems_version: 3.6.7
|
175
80
|
specification_version: 4
|
176
81
|
summary: Faraday adapter for NetHttpPersistent
|
177
82
|
test_files: []
|