faraday-net_http_persistent 2.0.2 → 2.1.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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffe757e1437110d467bf12e5b02dfb9c645148637fda7dbd819960bc606a083f
|
4
|
+
data.tar.gz: ea0f218c8a5cc9fff614d7642148059e98c3664fb66a8c9a82b520c19aa4f74a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 704efa657b1583d555b29a6cc71d75e936dc2dab9ac419d09d92a0a433eba72470f48b7dede5a005c8604a7a36dae62b86c53249be1090819df472a3bee55542
|
7
|
+
data.tar.gz: ec494b194dbbf5dd42c91166a2cd17de25d57d7cf0155cabaf4c9dda60d906592cd8fa8558b7a6d34b523e3bedaeeaffa39b03beedfc56459bdc6bc454a6a8f0
|
@@ -1,30 +1,138 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "faraday/net_http"
|
4
3
|
require "net/http/persistent"
|
5
4
|
|
6
5
|
module Faraday
|
7
6
|
class Adapter
|
8
7
|
# Net::HTTP::Persistent adapter.
|
9
|
-
class NetHttpPersistent <
|
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
|
+
|
10
59
|
private
|
11
60
|
|
12
|
-
def
|
13
|
-
|
14
|
-
if
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
61
|
+
def build_connection(env)
|
62
|
+
net_http_connection(env).tap do |http|
|
63
|
+
http.use_ssl = env[:url].scheme == "https" if http.respond_to?(:use_ssl=)
|
64
|
+
configure_ssl(http, env[:ssl])
|
65
|
+
configure_request(http, env[:request])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_request(env)
|
70
|
+
request = Net::HTTPGenericRequest.new \
|
71
|
+
env[:method].to_s.upcase, # request method
|
72
|
+
!!env[:body], # is there request body
|
73
|
+
env[:method] != :head, # is there response body
|
74
|
+
env[:url].request_uri, # request uri path
|
75
|
+
env[:request_headers] # request headers
|
76
|
+
|
77
|
+
if env[:body].respond_to?(:read)
|
78
|
+
request.body_stream = env[:body]
|
79
|
+
else
|
80
|
+
request.body = env[:body]
|
81
|
+
end
|
82
|
+
request
|
83
|
+
end
|
84
|
+
|
85
|
+
def save_http_response(env, http_response)
|
86
|
+
save_response(
|
87
|
+
env, http_response.code.to_i, nil, nil, http_response.message, finished: false
|
88
|
+
) do |response_headers|
|
89
|
+
http_response.each_header do |key, value|
|
90
|
+
response_headers[key] = value
|
21
91
|
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def configure_request(http, req)
|
96
|
+
if (sec = request_timeout(:read, req))
|
97
|
+
http.read_timeout = sec
|
98
|
+
end
|
99
|
+
|
100
|
+
if (sec = http.respond_to?(:write_timeout=) &&
|
101
|
+
request_timeout(:write, req))
|
102
|
+
http.write_timeout = sec
|
103
|
+
end
|
104
|
+
|
105
|
+
if (sec = request_timeout(:open, req))
|
106
|
+
http.open_timeout = sec
|
107
|
+
end
|
108
|
+
|
109
|
+
# Only set if Net::Http supports it, since Ruby 2.5.
|
110
|
+
http.max_retries = 0 if http.respond_to?(:max_retries=)
|
111
|
+
|
112
|
+
@config_block&.call(http)
|
113
|
+
end
|
114
|
+
|
115
|
+
def ssl_cert_store(ssl)
|
116
|
+
return ssl[:cert_store] if ssl[:cert_store]
|
117
|
+
|
118
|
+
# Use the default cert store by default, i.e. system ca certs
|
119
|
+
@ssl_cert_store ||= OpenSSL::X509::Store.new.tap(&:set_default_paths)
|
120
|
+
end
|
121
|
+
|
122
|
+
def net_http_connection(env)
|
123
|
+
@cached_connection ||= Net::HTTP::Persistent.new(**init_options)
|
22
124
|
|
23
125
|
proxy_uri = proxy_uri(env)
|
24
126
|
@cached_connection.proxy = proxy_uri if @cached_connection.proxy_uri != proxy_uri
|
25
127
|
@cached_connection
|
26
128
|
end
|
27
129
|
|
130
|
+
def init_options
|
131
|
+
options = {name: "Faraday"}
|
132
|
+
options[:pool_size] = @connection_options[:pool_size] if @connection_options.key?(:pool_size)
|
133
|
+
options
|
134
|
+
end
|
135
|
+
|
28
136
|
def proxy_uri(env)
|
29
137
|
proxy_uri = nil
|
30
138
|
if (proxy = env[:request][:proxy])
|
@@ -33,48 +141,36 @@ module Faraday
|
|
33
141
|
else
|
34
142
|
::URI.parse(proxy[:uri].to_s)
|
35
143
|
end
|
36
|
-
proxy_uri.user =
|
37
|
-
|
38
|
-
# not unescaping user/password
|
39
|
-
if proxy[:user]
|
40
|
-
(class << proxy_uri; self; end).class_eval do
|
41
|
-
define_method(:user) { proxy[:user] }
|
42
|
-
define_method(:password) { proxy[:password] }
|
43
|
-
end
|
44
|
-
end
|
144
|
+
proxy_uri.user = proxy[:user] if proxy[:user]
|
145
|
+
proxy_uri.password = proxy[:password] if proxy[:password]
|
45
146
|
end
|
46
147
|
proxy_uri
|
47
148
|
end
|
48
149
|
|
49
150
|
def perform_request(http, env)
|
50
|
-
if env
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
http_response = http.request(env[:url], create_request(env)) do |response|
|
55
|
-
response.read_body do |chunk|
|
56
|
-
if chunk.bytesize.positive? || size.positive?
|
57
|
-
yielded = true
|
58
|
-
size += chunk.bytesize
|
59
|
-
env[:request].on_data.call(chunk, size)
|
60
|
-
end
|
61
|
-
end
|
151
|
+
if env.stream_response?
|
152
|
+
http_response = env.stream_response do |&on_data|
|
153
|
+
request_with_wrapped_block(http, env, &on_data)
|
62
154
|
end
|
63
|
-
|
64
|
-
env[:request].on_data.call(+"", 0) unless yielded
|
65
155
|
http_response.body = nil
|
66
|
-
http_response
|
67
156
|
else
|
68
|
-
http
|
157
|
+
http_response = request_with_wrapped_block(http, env)
|
69
158
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
159
|
+
env.response_body = encoded_body(http_response)
|
160
|
+
env.response.finish(env)
|
161
|
+
http_response
|
162
|
+
end
|
74
163
|
|
75
|
-
|
164
|
+
def request_with_wrapped_block(http, env)
|
165
|
+
http.request(env[:url], create_request(env)) do |response|
|
166
|
+
save_http_response(env, response)
|
76
167
|
|
77
|
-
|
168
|
+
if block_given?
|
169
|
+
response.read_body do |chunk|
|
170
|
+
yield(chunk)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
78
174
|
end
|
79
175
|
|
80
176
|
SSL_CONFIGURATIONS = {
|
@@ -100,6 +196,27 @@ module Faraday
|
|
100
196
|
def http_set(http, attr, value)
|
101
197
|
http.send("#{attr}=", value) if http.send(attr) != value
|
102
198
|
end
|
199
|
+
|
200
|
+
def ssl_verify_mode(ssl)
|
201
|
+
ssl[:verify_mode] ||
|
202
|
+
if ssl.fetch(:verify, true)
|
203
|
+
OpenSSL::SSL::VERIFY_PEER
|
204
|
+
else
|
205
|
+
OpenSSL::SSL::VERIFY_NONE
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def encoded_body(http_response)
|
210
|
+
body = http_response.body || +""
|
211
|
+
/\bcharset=\s*(.+?)\s*(;|$)/.match(http_response["Content-Type"]) do |match|
|
212
|
+
content_charset = ::Encoding.find(match.captures.first)
|
213
|
+
body = body.dup if body.frozen?
|
214
|
+
body.force_encoding(content_charset)
|
215
|
+
rescue ArgumentError
|
216
|
+
nil
|
217
|
+
end
|
218
|
+
body
|
219
|
+
end
|
103
220
|
end
|
104
221
|
end
|
105
222
|
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,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday-net_http_persistent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.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: 2022-08-
|
11
|
+
date: 2022-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: faraday
|
14
|
+
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '2.5'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '2.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: net-http-persistent
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,7 +56,7 @@ licenses:
|
|
56
56
|
metadata:
|
57
57
|
homepage_uri: https://github.com/lostisland/faraday-net_http_persistent
|
58
58
|
source_code_uri: https://github.com/lostisland/faraday-net_http_persistent
|
59
|
-
changelog_uri: https://github.com/lostisland/faraday-net_http_persistent/releases/tag/v2.0
|
59
|
+
changelog_uri: https://github.com/lostisland/faraday-net_http_persistent/releases/tag/v2.1.0
|
60
60
|
post_install_message:
|
61
61
|
rdoc_options: []
|
62
62
|
require_paths:
|