faraday-net_http_persistent 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: