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: 0dd625c45c96455b07b3ea4a2345006c6bf18ace0e91e1d29d8760c32a851880
4
- data.tar.gz: 6413a859583e2dc5d94916c32873899096b7c7cd44ea47bb64f19623e4e5cec5
3
+ metadata.gz: ffe757e1437110d467bf12e5b02dfb9c645148637fda7dbd819960bc606a083f
4
+ data.tar.gz: ea0f218c8a5cc9fff614d7642148059e98c3664fb66a8c9a82b520c19aa4f74a
5
5
  SHA512:
6
- metadata.gz: 5a847b8b8bf9131ee264b9878d3aca9748f358cd01ef432954e42a97847c9981e482cfc8914925c18680617c2016b8b28df5e593c28c4b5c9cc23a00b9337f47
7
- data.tar.gz: 9487254402d21fe7be681a15a7212586fbf84995f2ac0ff764cb7de4a306e70bd87a8dd70ab915920a716c22b2021c83dc4bf89664294cd5f072941b57379bd2
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 < NetHttp
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 net_http_connection(env)
13
- @cached_connection ||=
14
- if Net::HTTP::Persistent.instance_method(:initialize)
15
- .parameters.first == %i[key name]
16
- options = {name: "Faraday"}
17
- options[:pool_size] = @connection_options[:pool_size] if @connection_options.key?(:pool_size)
18
- Net::HTTP::Persistent.new(**options)
19
- else
20
- Net::HTTP::Persistent.new("Faraday")
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 = proxy_uri.password = nil
37
- # awful patch for net-http-persistent 2.8
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[:request].stream_response?
51
- size = 0
52
- yielded = false
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.request(env[:url], create_request(env))
157
+ http_response = request_with_wrapped_block(http, env)
69
158
  end
70
- rescue Errno::ETIMEDOUT, Net::OpenTimeout => e
71
- raise Faraday::TimeoutError, e
72
- rescue Net::HTTP::Persistent::Error => e
73
- raise Faraday::TimeoutError, e if e.message.include? "Timeout"
159
+ env.response_body = encoded_body(http_response)
160
+ env.response.finish(env)
161
+ http_response
162
+ end
74
163
 
75
- raise Faraday::ConnectionFailed, e if e.message.include? "connection refused"
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
- raise
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Faraday
4
4
  module NetHttpPersistent
5
- VERSION = "2.0.2"
5
+ VERSION = "2.1.0"
6
6
  end
7
7
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "adapter/net_http_persistent"
4
- require_relative "net_http_persistent/version"
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.2
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-09 00:00:00.000000000 Z
11
+ date: 2022-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: faraday-net_http
14
+ name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "<"
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3'
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: '3'
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.2
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: