httpi 2.4.4 → 2.4.5
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/.travis.yml +3 -12
- data/CHANGELOG.md +7 -0
- data/README.md +4 -4
- data/httpi.gemspec +0 -1
- data/lib/httpi/adapter/curb.rb +3 -0
- data/lib/httpi/adapter/excon.rb +3 -0
- data/lib/httpi/adapter/http.rb +2 -0
- data/lib/httpi/adapter/httpclient.rb +3 -0
- data/lib/httpi/adapter/net_http.rb +2 -0
- data/lib/httpi/adapter/net_http_persistent.rb +9 -1
- data/lib/httpi/auth/ssl.rb +33 -0
- data/lib/httpi/version.rb +1 -1
- data/spec/httpi/adapter/curb_spec.rb +10 -0
- data/spec/httpi/adapter/excon_spec.rb +6 -0
- data/spec/httpi/adapter/httpclient_spec.rb +11 -0
- data/spec/httpi/auth/ssl_spec.rb +31 -0
- data/spec/integration/excon_spec.rb +10 -0
- data/spec/integration/http_spec.rb +10 -0
- data/spec/integration/net_http_spec.rb +10 -0
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4ef171693207d4179542cd91eb6de5c8a1dc4b30458fcb5e255098e60a6297e
|
4
|
+
data.tar.gz: fb6977168d9ad78ab44fdfcbce528145fbe4c43f433a195cd6cd1ca5e33f1f54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb1092a0fb53a39f2d7f327b0f7c02b914f8f1e1f80f20e64178592d81b98d414016a62310a532931c3ba0da969f9fde269da22ea62fb594220f111a351e64ba
|
7
|
+
data.tar.gz: 5ce7bd00cb3ed67cace0e21ca2a4b459f6da89d618da1857b641a37413a0da98b5619b617dd86fab0a68ba280713a24d4ab54ae6b44362b91c3bc04df43a9e3a
|
data/.travis.yml
CHANGED
@@ -1,15 +1,6 @@
|
|
1
1
|
language: "ruby"
|
2
2
|
script: "bundle exec rake ci"
|
3
|
-
sudo: false
|
4
3
|
rvm:
|
5
|
-
- 2.
|
6
|
-
- 2.
|
7
|
-
- 2.
|
8
|
-
- 2.3.0
|
9
|
-
- 2.5.0
|
10
|
-
- jruby-9.1.9.0
|
11
|
-
env:
|
12
|
-
global:
|
13
|
-
- JRUBY_OPTS="--2.0"
|
14
|
-
before_install:
|
15
|
-
- "travis_retry gem install bundler"
|
4
|
+
- 2.5.8
|
5
|
+
- 2.6.6
|
6
|
+
- 2.7.1
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
### 2.4.5
|
2
|
+
|
3
|
+
* Improvement: [#209](https://github.com/savonrb/httpi/pull/209) Drop Travis CI support for Ruby < 2.3.0 and jruby.
|
4
|
+
* Feature: [#208](https://github.com/savonrb/httpi/pull/208) Add SSL min/max_version configuration for supporting adapters
|
5
|
+
* Improvement: [#206](https://github.com/savonrb/httpi/pull/206) Support for net-http-persistent v3
|
6
|
+
* Improvement: [#204](https://github.com/savonrb/httpi/pull/204) Avoid excon warning
|
7
|
+
|
1
8
|
### 2.4.4
|
2
9
|
|
3
10
|
* Improvement: [#197](https://github.com/savonrb/httpi/pull/197) Add support for new write timeout option to all adapters
|
data/README.md
CHANGED
@@ -5,10 +5,10 @@ A common interface for Ruby's HTTP libraries.
|
|
5
5
|
[Documentation](https://www.rubydoc.info/gems/httpi) |
|
6
6
|
[Mailing list](https://groups.google.com/forum/#!forum/httpirb)
|
7
7
|
|
8
|
-
[](http://travis-ci.org/savonrb/httpi)
|
9
|
+
[](http://badge.fury.io/rb/httpi)
|
10
|
+
[](https://codeclimate.com/github/savonrb/httpi)
|
11
|
+
[](https://coveralls.io/r/savonrb/httpi)
|
12
12
|
|
13
13
|
|
14
14
|
## Installation
|
data/httpi.gemspec
CHANGED
data/lib/httpi/adapter/curb.rb
CHANGED
@@ -128,6 +128,9 @@ module HTTPI
|
|
128
128
|
when :SSLv23 then 2
|
129
129
|
when :SSLv3 then 3
|
130
130
|
end
|
131
|
+
if ssl.min_version || ssl.max_version
|
132
|
+
raise NotSupportedError, 'Curb adapter does not support #min_version or #max_version. Please, use #ssl_version instead.'
|
133
|
+
end
|
131
134
|
end
|
132
135
|
|
133
136
|
def respond_with(client)
|
data/lib/httpi/adapter/excon.rb
CHANGED
@@ -41,6 +41,7 @@ module HTTPI
|
|
41
41
|
|
42
42
|
opts = {
|
43
43
|
:host => url.host,
|
44
|
+
:hostname => url.hostname,
|
44
45
|
:path => url.path,
|
45
46
|
:port => url.port,
|
46
47
|
:query => url.query,
|
@@ -73,6 +74,8 @@ module HTTPI
|
|
73
74
|
end
|
74
75
|
|
75
76
|
opts[:ssl_version] = ssl.ssl_version if ssl.ssl_version
|
77
|
+
opts[:ssl_min_version] = ssl.min_version if ssl.min_version
|
78
|
+
opts[:ssl_max_version] = ssl.max_version if ssl.max_version
|
76
79
|
|
77
80
|
opts
|
78
81
|
end
|
data/lib/httpi/adapter/http.rb
CHANGED
@@ -58,6 +58,8 @@ module HTTPI
|
|
58
58
|
context.cert = @request.auth.ssl.cert
|
59
59
|
context.key = @request.auth.ssl.cert_key
|
60
60
|
context.ssl_version = @request.auth.ssl.ssl_version if @request.auth.ssl.ssl_version != nil
|
61
|
+
context.min_version = @request.auth.ssl.min_version if @request.auth.ssl.min_version != nil
|
62
|
+
context.max_version = @request.auth.ssl.max_version if @request.auth.ssl.max_version != nil
|
61
63
|
context.verify_mode = @request.auth.ssl.openssl_verify_mode
|
62
64
|
|
63
65
|
client = ::HTTP::Client.new(:ssl_context => context)
|
@@ -78,6 +78,9 @@ module HTTPI
|
|
78
78
|
end
|
79
79
|
|
80
80
|
@client.ssl_config.ssl_version = ssl.ssl_version.to_s if ssl.ssl_version
|
81
|
+
if ssl.min_version || ssl.max_version
|
82
|
+
raise NotSupportedError, 'Httpclient adapter does not support #min_version or #max_version. Please, use #ssl_version instead'
|
83
|
+
end
|
81
84
|
end
|
82
85
|
|
83
86
|
def respond_with(response)
|
@@ -12,7 +12,11 @@ module HTTPI
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def create_client
|
15
|
-
|
15
|
+
if is_v3
|
16
|
+
Net::HTTP::Persistent.new name: thread_key
|
17
|
+
else
|
18
|
+
Net::HTTP::Persistent.new thread_key
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
def perform(http, http_request, &on_body)
|
@@ -39,6 +43,10 @@ module HTTPI
|
|
39
43
|
@request.url.host.split(/\W/).reject{|p|p == ""}.join('-')
|
40
44
|
end
|
41
45
|
|
46
|
+
def is_v3
|
47
|
+
Net::HTTP::Persistent::VERSION.start_with? "3."
|
48
|
+
end
|
49
|
+
|
42
50
|
end
|
43
51
|
end
|
44
52
|
end
|
data/lib/httpi/auth/ssl.rb
CHANGED
@@ -20,6 +20,9 @@ module HTTPI
|
|
20
20
|
ssl_context::METHODS.reject { |method| method.match(/server|client/) }
|
21
21
|
end.sort.reverse
|
22
22
|
|
23
|
+
# Returns OpenSSL::SSL::*_VERSION values for min_version and max_version
|
24
|
+
MIN_MAX_VERSIONS = OpenSSL::SSL.constants.select{|constant| constant =~/_VERSION$/}.map{|version| version.to_s.gsub(/_VERSION$/,'').to_sym}.reverse
|
25
|
+
|
23
26
|
# Returns whether SSL configuration is present.
|
24
27
|
def present?
|
25
28
|
(verify_mode == :none) || (cert && cert_key) || ca_cert_file
|
@@ -90,6 +93,36 @@ module HTTPI
|
|
90
93
|
@ssl_version = version
|
91
94
|
end
|
92
95
|
|
96
|
+
# Returns the SSL min_version number. Defaults to <tt>nil</tt> (auto-negotiate).
|
97
|
+
def min_version
|
98
|
+
@min_version ||= nil
|
99
|
+
end
|
100
|
+
|
101
|
+
# Sets the SSL min_version number. Expects one of <tt>HTTPI::Auth::SSL::MIN_MAX_VERSIONS</tt>.
|
102
|
+
def min_version=(version)
|
103
|
+
unless MIN_MAX_VERSIONS.include? version
|
104
|
+
raise ArgumentError, "Invalid SSL min_version #{version.inspect}\n" +
|
105
|
+
"Please specify one of #{MIN_MAX_VERSIONS.inspect}"
|
106
|
+
end
|
107
|
+
|
108
|
+
@min_version = version
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns the SSL min_version number. Defaults to <tt>nil</tt> (auto-negotiate).
|
112
|
+
def max_version
|
113
|
+
@max_version ||= nil
|
114
|
+
end
|
115
|
+
|
116
|
+
# Sets the SSL min_version number. Expects one of <tt>HTTPI::Auth::SSL::MIN_MAX_VERSIONS</tt>.
|
117
|
+
def max_version=(version)
|
118
|
+
unless MIN_MAX_VERSIONS.include? version
|
119
|
+
raise ArgumentError, "Invalid SSL max_version #{version.inspect}\n" +
|
120
|
+
"Please specify one of #{MIN_MAX_VERSIONS.inspect}"
|
121
|
+
end
|
122
|
+
|
123
|
+
@max_version = version
|
124
|
+
end
|
125
|
+
|
93
126
|
# Returns an <tt>OpenSSL::X509::Certificate</tt> for the +cert_file+.
|
94
127
|
def cert
|
95
128
|
@cert ||= (OpenSSL::X509::Certificate.new File.read(cert_file) if cert_file)
|
data/lib/httpi/version.rb
CHANGED
@@ -278,6 +278,16 @@ unless RUBY_PLATFORM =~ /java/
|
|
278
278
|
adapter.request(:get)
|
279
279
|
end
|
280
280
|
end
|
281
|
+
it 'raises error when min_version not nil' do
|
282
|
+
request.auth.ssl.min_version = :TLS1_2
|
283
|
+
expect{ adapter.request(:get) }.
|
284
|
+
to raise_error(HTTPI::NotSupportedError, 'Curb adapter does not support #min_version or #max_version. Please, use #ssl_version instead.')
|
285
|
+
end
|
286
|
+
it 'raises error when max_version not nil' do
|
287
|
+
request.auth.ssl.max_version = :TLS1_2
|
288
|
+
expect{ adapter.request(:get) }.
|
289
|
+
to raise_error(HTTPI::NotSupportedError, 'Curb adapter does not support #min_version or #max_version. Please, use #ssl_version instead.')
|
290
|
+
end
|
281
291
|
end
|
282
292
|
|
283
293
|
context "(for SSL client auth)" do
|
@@ -178,6 +178,17 @@ describe HTTPI::Adapter::HTTPClient do
|
|
178
178
|
|
179
179
|
adapter.request(:get)
|
180
180
|
end
|
181
|
+
|
182
|
+
it 'raises error when min_version not nil' do
|
183
|
+
request.auth.ssl.min_version = :TLS1_2
|
184
|
+
expect{ adapter.request(:get) }.
|
185
|
+
to raise_error(HTTPI::NotSupportedError, 'Httpclient adapter does not support #min_version or #max_version. Please, use #ssl_version instead')
|
186
|
+
end
|
187
|
+
it 'raises error when max_version not nil' do
|
188
|
+
request.auth.ssl.max_version = :TLS1_2
|
189
|
+
expect{ adapter.request(:get) }.
|
190
|
+
to raise_error(HTTPI::NotSupportedError, 'Httpclient adapter does not support #min_version or #max_version. Please, use #ssl_version instead')
|
191
|
+
end
|
181
192
|
end
|
182
193
|
|
183
194
|
context "(for SSL client auth with a verify mode of :none with no certs provided)" do
|
data/spec/httpi/auth/ssl_spec.rb
CHANGED
@@ -4,6 +4,7 @@ require "httpi/auth/ssl"
|
|
4
4
|
describe HTTPI::Auth::SSL do
|
5
5
|
before(:all) do
|
6
6
|
@ssl_versions = HTTPI::Auth::SSL::SSL_VERSIONS
|
7
|
+
@min_max_versions = HTTPI::Auth::SSL::MIN_MAX_VERSIONS
|
7
8
|
end
|
8
9
|
|
9
10
|
describe "VERIFY_MODES" do
|
@@ -158,6 +159,36 @@ describe HTTPI::Auth::SSL do
|
|
158
159
|
end
|
159
160
|
end
|
160
161
|
|
162
|
+
describe "#min_version" do
|
163
|
+
subject { HTTPI::Auth::SSL.new }
|
164
|
+
|
165
|
+
it "returns the min_version" do
|
166
|
+
subject.min_version = @min_max_versions.first
|
167
|
+
expect(subject.min_version).to eq(@min_max_versions.first)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'raises ArgumentError if the version is unsupported' do
|
171
|
+
expect { ssl.min_version = :ssl_fail }.
|
172
|
+
to raise_error(ArgumentError, "Invalid SSL min_version :ssl_fail\n" +
|
173
|
+
"Please specify one of #{@min_max_versions}")
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "#max_version" do
|
178
|
+
subject { HTTPI::Auth::SSL.new }
|
179
|
+
|
180
|
+
it "returns the SSL version" do
|
181
|
+
subject.max_version = @min_max_versions.first
|
182
|
+
expect(subject.max_version).to eq(@min_max_versions.first)
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'raises ArgumentError if the version is unsupported' do
|
186
|
+
expect { ssl.max_version = :ssl_fail }.
|
187
|
+
to raise_error(ArgumentError, "Invalid SSL max_version :ssl_fail\n" +
|
188
|
+
"Please specify one of #{@min_max_versions}")
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
161
192
|
def ssl
|
162
193
|
ssl = HTTPI::Auth::SSL.new
|
163
194
|
ssl.cert_key_file = "spec/fixtures/client_key.pem"
|
@@ -129,6 +129,16 @@ describe HTTPI::Adapter::HTTPClient do
|
|
129
129
|
expect(response.body).to eq("get")
|
130
130
|
end
|
131
131
|
|
132
|
+
it "works with min_version/max_version" do
|
133
|
+
request = HTTPI::Request.new(@server.url)
|
134
|
+
request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
|
135
|
+
request.auth.ssl.min_version = :TLS1_2
|
136
|
+
request.auth.ssl.max_version = :TLS1_2
|
137
|
+
|
138
|
+
response = HTTPI.get(request, adapter)
|
139
|
+
expect(response.body).to eq("get")
|
140
|
+
end
|
141
|
+
|
132
142
|
it "works with client cert and key provided as file path" do
|
133
143
|
request = HTTPI::Request.new(@server.url)
|
134
144
|
request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
|
@@ -131,6 +131,16 @@ describe HTTPI::Adapter::HTTP do
|
|
131
131
|
response = HTTPI.get(request, adapter)
|
132
132
|
expect(response.body).to eq("get")
|
133
133
|
end
|
134
|
+
|
135
|
+
it "works with min_version/max_version" do
|
136
|
+
request = HTTPI::Request.new(@server.url)
|
137
|
+
request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
|
138
|
+
request.auth.ssl.min_version = :TLS1_2
|
139
|
+
request.auth.ssl.max_version = :TLS1_2
|
140
|
+
|
141
|
+
response = HTTPI.get(request, adapter)
|
142
|
+
expect(response.body).to eq("get")
|
143
|
+
end
|
134
144
|
end
|
135
145
|
end
|
136
146
|
|
@@ -217,6 +217,16 @@ describe HTTPI::Adapter::NetHTTP do
|
|
217
217
|
response = HTTPI.get(request, adapter)
|
218
218
|
expect(response.body).to eq("get")
|
219
219
|
end
|
220
|
+
|
221
|
+
it "works with min_version/max_version" do
|
222
|
+
request = HTTPI::Request.new(@server.url)
|
223
|
+
request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
|
224
|
+
request.auth.ssl.min_version = :TLS1_2
|
225
|
+
request.auth.ssl.max_version = :TLS1_2
|
226
|
+
|
227
|
+
response = HTTPI.get(request, adapter)
|
228
|
+
expect(response.body).to eq("get")
|
229
|
+
end
|
220
230
|
end
|
221
231
|
end
|
222
232
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: httpi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.4.
|
4
|
+
version: 2.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Harrington
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-07-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -219,8 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
219
|
- !ruby/object:Gem::Version
|
220
220
|
version: '0'
|
221
221
|
requirements: []
|
222
|
-
|
223
|
-
rubygems_version: 2.7.6
|
222
|
+
rubygems_version: 3.0.3
|
224
223
|
signing_key:
|
225
224
|
specification_version: 4
|
226
225
|
summary: Common interface for Ruby's HTTP libraries
|