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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1bc1f8930b55722004909277859a02d2b792fb7efdd09381a852c06085eeb7f
4
- data.tar.gz: 7ad77ee2a562d6479e57c361366ab3753e5f32e179839c00bff89232dce4d3f8
3
+ metadata.gz: e0a30d1b7f951736304ef576b56e823fd2890558fd37958f165b20b7a2062898
4
+ data.tar.gz: c13f2ae91f08c494edbbf0da037e871b899232033816e0fb94e97256d0cb302b
5
5
  SHA512:
6
- metadata.gz: 62fd182c8b193d450544f3d655b87f01a552fe6845e3f67094b1d0f5b94904713ed0f11ea185af40a7bd170c4cef69adad69e1cf4982e7a5b2eedb23de7e12bf
7
- data.tar.gz: d6c37fe53505c0bf528b4451b9494d4265f2e37e23e38967e18c7c65d92b5c6c9bbc8fe9c2a8606e555a356085b543750f8c72449e9344acb3feebbb903a7d78
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 these lines to your application's Gemfile:
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
- connection = Faraday.new(url, conn_options) do |conn|
32
- # Your other middleware goes here...
33
- conn.adapter :net_http_persistent
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 < NetHttp
7
- dependency "net/http/persistent"
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 net_http_connection(env)
12
- @cached_connection ||=
13
- if Net::HTTP::Persistent.instance_method(:initialize)
14
- .parameters.first == %i[key name]
15
- options = {name: "Faraday"}
16
- if @connection_options.key?(:pool_size)
17
- options[:pool_size] = @connection_options[:pool_size]
18
- end
19
- Net::HTTP::Persistent.new(**options)
20
- else
21
- Net::HTTP::Persistent.new("Faraday")
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
- proxy_uri = proxy_uri(env)
25
- if @cached_connection.proxy_uri != proxy_uri
26
- @cached_connection.proxy = proxy_uri
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 = proxy_uri.password = nil
40
- # awful patch for net-http-persistent 2.8
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[:request].stream_response?
54
- size = 0
55
- yielded = false
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.request(env[:url], create_request(env))
162
+ http_response = request_with_wrapped_block(http, env)
72
163
  end
73
- rescue Errno::ETIMEDOUT, Net::OpenTimeout => e
74
- raise Faraday::TimeoutError, e
75
- rescue Net::HTTP::Persistent::Error => e
76
- raise Faraday::TimeoutError, e if e.message.include? "Timeout"
164
+ env.response_body = encoded_body(http_response)
165
+ env.response.finish(env)
166
+ http_response
167
+ end
77
168
 
78
- if e.message.include? "connection refused"
79
- raise Faraday::ConnectionFailed, e
80
- end
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
- raise
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
- }.freeze
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Faraday
4
4
  module NetHttpPersistent
5
- VERSION = "1.2.0"
5
+ VERSION = "2.3.1"
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,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: 1.2.0
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: 2021-07-12 00:00:00.000000000 Z
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: '1.0'
48
- type: :development
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: '3.0'
25
+ version: '2.5'
83
26
  - !ruby/object:Gem::Dependency
84
- name: simplecov
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: '1.0'
111
- - !ruby/object:Gem::Dependency
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: 0.1.1
118
- type: :development
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: '3.4'
132
- type: :development
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: '3.4'
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.4.0
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.1.6
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: []