httpi 2.4.3 → 3.0.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/development.yml +48 -0
  3. data/CHANGELOG.md +23 -0
  4. data/Gemfile +8 -6
  5. data/README.md +20 -16
  6. data/UPDATING.md +7 -0
  7. data/httpi.gemspec +5 -8
  8. data/lib/httpi/adapter/curb.rb +7 -2
  9. data/lib/httpi/adapter/em_http.rb +5 -4
  10. data/lib/httpi/adapter/excon.rb +6 -1
  11. data/lib/httpi/adapter/http.rb +9 -0
  12. data/lib/httpi/adapter/httpclient.rb +5 -0
  13. data/lib/httpi/adapter/net_http.rb +10 -2
  14. data/lib/httpi/adapter/net_http_persistent.rb +6 -2
  15. data/lib/httpi/auth/ssl.rb +53 -2
  16. data/lib/httpi/request.rb +2 -2
  17. data/lib/httpi/version.rb +1 -1
  18. data/spec/fixtures/client_cert.pem +18 -14
  19. data/spec/fixtures/client_key.pem +25 -13
  20. data/spec/httpi/adapter/curb_spec.rb +31 -7
  21. data/spec/httpi/adapter/em_http_spec.rb +23 -21
  22. data/spec/httpi/adapter/excon_spec.rb +28 -118
  23. data/spec/httpi/adapter/http_spec.rb +23 -96
  24. data/spec/httpi/adapter/httpclient_spec.rb +32 -0
  25. data/spec/httpi/adapter/net_http_persistent_spec.rb +31 -81
  26. data/spec/httpi/adapter/net_http_spec.rb +37 -181
  27. data/spec/httpi/auth/ssl_spec.rb +48 -0
  28. data/spec/httpi/httpi_spec.rb +2 -4
  29. data/spec/integration/curb_spec.rb +20 -0
  30. data/spec/integration/em_http_spec.rb +19 -2
  31. data/spec/integration/excon_spec.rb +67 -1
  32. data/spec/integration/fixtures/ca_all.pem +17 -42
  33. data/spec/integration/fixtures/server.cert +17 -17
  34. data/spec/integration/fixtures/server.key +25 -13
  35. data/spec/integration/http_spec.rb +47 -0
  36. data/spec/integration/httpclient_spec.rb +20 -0
  37. data/spec/integration/net_http_persistent_spec.rb +33 -3
  38. data/spec/integration/net_http_spec.rb +144 -1
  39. data/spec/integration/support/application.rb +3 -2
  40. data/spec/integration/support/server.rb +1 -2
  41. data/spec/spec_helper.rb +0 -2
  42. metadata +15 -43
  43. data/.travis.yml +0 -15
@@ -1,198 +1,54 @@
1
1
  require "spec_helper"
2
- require "integration/support/server"
2
+ require "httpi/adapter/net_http"
3
+ require "httpi/request"
3
4
 
4
- describe HTTPI::Adapter::NetHTTP do
5
+ begin
6
+ HTTPI::Adapter.load_adapter(:net_http)
5
7
 
6
- subject(:adapter) { :net_http }
8
+ describe HTTPI::Adapter::NetHTTP do
9
+ let(:adapter) { HTTPI::Adapter::NetHTTP.new(request) }
10
+ let(:request) { HTTPI::Request.new("http://example.com") }
7
11
 
8
- context "http requests" do
9
- before :all do
10
- @server = IntegrationServer.run
11
- end
12
-
13
- after :all do
14
- @server.stop
15
- end
16
-
17
- context 'when socks is specified' do
18
-
19
- let(:socks_client) { mock('socks_client') }
20
- let(:request){HTTPI::Request.new(@server.url)}
21
-
22
- it 'uses Net::HTTP.SOCKSProxy as client' do
23
- socks_client.expects(:new).with(URI(@server.url).host, URI(@server.url).port).returns(:socks_client_instance)
24
- Net::HTTP.expects(:SOCKSProxy).with('localhost', 8080).returns socks_client
25
-
26
- request.proxy = 'socks://localhost:8080'
27
- adapter = HTTPI::Adapter::NetHTTP.new(request)
28
-
29
- expect(adapter.client).to eq(:socks_client_instance)
12
+ let(:response) {
13
+ Object.new.tap do |r|
14
+ r.stubs(:code).returns(200)
15
+ r.stubs(:body).returns("abc")
16
+ r.stubs(:to_hash).returns({"Content-Length" => "3"})
30
17
  end
31
- end
32
-
33
- it "sends and receives HTTP headers" do
34
- request = HTTPI::Request.new(@server.url + "x-header")
35
- request.headers["X-Header"] = "HTTPI"
36
-
37
- response = HTTPI.get(request, adapter)
38
- expect(response.body).to include("HTTPI")
39
- end
18
+ }
40
19
 
41
- it "executes GET requests" do
42
- response = HTTPI.get(@server.url, adapter)
43
- expect(response.body).to eq("get")
44
- expect(response.headers["Content-Type"]).to eq("text/plain")
20
+ before do
21
+ Net::HTTP.any_instance.stubs(:start).returns(response)
45
22
  end
46
23
 
47
- it "executes POST requests" do
48
- response = HTTPI.post(@server.url, "<some>xml</some>", adapter)
49
- expect(response.body).to eq("post")
50
- expect(response.headers["Content-Type"]).to eq("text/plain")
51
- end
52
-
53
- it "executes HEAD requests" do
54
- response = HTTPI.head(@server.url, adapter)
55
- expect(response.code).to eq(200)
56
- expect(response.headers["Content-Type"]).to eq("text/plain")
57
- end
24
+ describe "settings" do
25
+ describe "open_timeout, read_timeout" do
26
+ it "are being set on the client" do
27
+ request.open_timeout = 30
28
+ request.read_timeout = 40
58
29
 
59
- it "executes PUT requests" do
60
- response = HTTPI.put(@server.url, "<some>xml</some>", adapter)
61
- expect(response.body).to eq("put")
62
- expect(response.headers["Content-Type"]).to eq("text/plain")
63
- end
30
+ adapter.client.expects(:open_timeout=).with(30)
31
+ adapter.client.expects(:read_timeout=).with(40)
64
32
 
65
- it "executes DELETE requests" do
66
- response = HTTPI.delete(@server.url, adapter)
67
- expect(response.body).to eq("delete")
68
- expect(response.headers["Content-Type"]).to eq("text/plain")
69
- end
70
-
71
- context "supports custom methods supported by Net::HTTP" do
72
- let(:request) do
73
- HTTPI::Request.new(@server.url).tap do|r|
74
- r.body = request_body if request_body
33
+ adapter.request(:get)
75
34
  end
76
35
  end
77
36
 
78
- let(:request_body) { nil }
79
-
80
- let(:response) { HTTPI.request(http_method, request, adapter) }
81
-
82
- shared_examples_for 'any supported custom method' do
83
- specify { response.body.should eq http_method.to_s }
84
- specify { response.headers["Content-Type"].should eq('text/plain') }
85
- end
86
-
87
- context 'PATCH' do
88
- let(:http_method) { :patch }
89
- let(:request_body) { "<some>xml</some>" }
90
-
91
- it_behaves_like 'any supported custom method'
92
- end
93
-
94
- context 'UNSUPPORTED method' do
95
- let(:http_method) { :unsupported }
96
-
97
- specify { expect { response }.to raise_error HTTPI::NotSupportedError }
98
- end
99
- end
100
-
101
- it "supports basic authentication" do
102
- request = HTTPI::Request.new(@server.url + "basic-auth")
103
- request.auth.basic("admin", "secret")
104
-
105
- response = HTTPI.get(request, adapter)
106
- expect(response.body).to eq("basic-auth")
107
- end
108
-
109
- it "does not support digest authentication" do
110
- request = HTTPI::Request.new(@server.url + "digest-auth")
111
- request.auth.digest("admin", "secret")
112
-
113
- expect { HTTPI.get(request, adapter) }.
114
- to raise_error(HTTPI::NotSupportedError, /does not support HTTP digest authentication/)
115
- end
116
-
117
- it "supports ntlm authentication" do
118
- request = HTTPI::Request.new(@server.url + "ntlm-auth")
119
- request.auth.ntlm("tester", "vReqSoafRe5O")
120
-
121
- response = HTTPI.get(request, adapter)
122
- expect(response.body).to eq("ntlm-auth")
123
- end
124
-
125
- it 'does not support ntlm authentication when Net::NTLM is not available' do
126
- Net.expects(:const_defined?).with(:NTLM).returns false
127
-
128
- request = HTTPI::Request.new(@server.url + 'ntlm-auth')
129
- request.auth.ntlm("testing", "failures")
130
-
131
- expect { HTTPI.get(request, adapter) }.
132
- to raise_error(HTTPI::NotSupportedError, /Net::NTLM is not available/)
133
- end
134
-
135
- it 'does not require ntlm when ntlm authenication is not requested' do
136
- HTTPI::Adapter::NetHTTP.any_instance.stubs(:check_net_ntlm_version!).raises(RuntimeError)
137
- request = HTTPI::Request.new(@server.url)
138
- expect(request.auth.ntlm?).to be false
139
-
140
- # make sure a request doesn't call ntlm check if we don't ask for it.
141
- expect { HTTPI.get(request, adapter) }.not_to raise_error
142
- HTTPI::Adapter::NetHTTP.any_instance.unstub(:check_net_ntlm_version!)
143
- end
144
-
145
- it 'does check ntlm when ntlm authentication is requested' do
146
- request = HTTPI::Request.new(@server.url + "ntlm-auth")
147
- request.auth.ntlm("tester", "vReqSoafRe5O")
148
-
149
- expect { HTTPI.get(request, adapter) }.not_to raise_error
150
-
151
- # the check should also verify that the version of ntlm is supported and still fail if it isn't
152
- HTTPI::Adapter::NetHTTP.any_instance.stubs(:ntlm_version).returns("0.1.1")
153
-
154
- request = HTTPI::Request.new(@server.url + "ntlm-auth")
155
- request.auth.ntlm("tester", "vReqSoafRe5O")
156
-
157
- expect { HTTPI.get(request, adapter) }.to raise_error(ArgumentError, /Invalid version/)
158
-
159
- HTTPI::Adapter::NetHTTP.any_instance.unstub(:ntlm_version)
160
- end
161
-
162
- it "does not crash when authenticate header is missing (on second request)" do
163
- request = HTTPI::Request.new(@server.url + 'ntlm-auth')
164
- request.auth.ntlm("tester", "vReqSoafRe5O")
165
-
166
- expect { HTTPI.get(request, adapter) }.
167
- to_not raise_error
168
-
169
- expect { HTTPI.get(request, adapter) }.
170
- to_not raise_error
171
- end
172
- end
173
-
174
- # it does not support digest auth
175
-
176
- if RUBY_PLATFORM =~ /java/
177
- pending "Puma Server complains: SSL not supported on JRuby"
178
- else
179
- context "https requests" do
180
- before :all do
181
- @server = IntegrationServer.run(:ssl => true)
182
- end
183
- after :all do
184
- @server.stop
185
- end
186
-
187
- # it does not raise when no certificate was set up
188
- it "works when set up properly" do
189
- request = HTTPI::Request.new(@server.url)
190
- request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
191
-
192
- response = HTTPI.get(request, adapter)
193
- expect(response.body).to eq("get")
37
+ describe "write_timeout" do
38
+ if Net::HTTP.method_defined?(:write_timeout=)
39
+ it "is being set on the client" do
40
+ request.write_timeout = 50
41
+ adapter.client.expects(:write_timeout=).with(50)
42
+ adapter.request(:get)
43
+ end
44
+ else
45
+ it "can not be set on the client" do
46
+ request.write_timeout = 50
47
+ expect { adapter.request(:get) }
48
+ .to raise_error(HTTPI::NotSupportedError, /write_timeout/)
49
+ end
50
+ end
194
51
  end
195
52
  end
196
53
  end
197
-
198
54
  end
@@ -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,53 @@ 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
+
192
+ describe '#ciphers' do
193
+ subject { ssl.ciphers }
194
+ let(:ssl) { HTTPI::Auth::SSL.new }
195
+
196
+ context 'without ciphers' do
197
+ before { ssl.ciphers = nil }
198
+
199
+ it { is_expected.to eq(nil) }
200
+ end
201
+
202
+ context 'with ciphers' do
203
+ before { ssl.ciphers = OpenSSL::SSL::SSLContext.new.ciphers }
204
+
205
+ it { is_expected.to be_any.and(all(be_an_instance_of(String))) }
206
+ end
207
+ end
208
+
161
209
  def ssl
162
210
  ssl = HTTPI::Auth::SSL.new
163
211
  ssl.cert_key_file = "spec/fixtures/client_key.pem"
@@ -6,11 +6,9 @@ require "excon"
6
6
  require "net/http/persistent"
7
7
  require "http"
8
8
 
9
- unless RUBY_VERSION < "1.9"
9
+ unless RUBY_PLATFORM =~ /java/
10
10
  require "em-synchrony"
11
11
  require "em-http-request"
12
- end
13
- unless RUBY_PLATFORM =~ /java/
14
12
  require "curb"
15
13
  end
16
14
 
@@ -294,7 +292,7 @@ describe HTTPI do
294
292
  end
295
293
 
296
294
  HTTPI::Adapter::ADAPTERS.each do |adapter, opts|
297
- unless (adapter == :em_http && RUBY_VERSION =~ /1\.8/) || (adapter == :curb && RUBY_PLATFORM =~ /java/)
295
+ unless (adapter == :em_http || adapter == :curb) && RUBY_PLATFORM =~ /java/
298
296
  client_class = {
299
297
  :httpclient => lambda { HTTPClient },
300
298
  :curb => lambda { Curl::Easy },
@@ -33,6 +33,17 @@ describe HTTPI::Adapter::Curb do
33
33
  expect(response.headers["Set-Cookie"]).to eq(cookies)
34
34
  end
35
35
 
36
+ it "it supports read timeout" do
37
+ require "curb"
38
+
39
+ request = HTTPI::Request.new(@server.url + "timeout")
40
+ request.read_timeout = 0.5 # seconds
41
+
42
+ expect do
43
+ HTTPI.get(request, adapter)
44
+ end.to raise_exception(Curl::Err::TimeoutError)
45
+ end
46
+
36
47
  it "executes GET requests" do
37
48
  response = HTTPI.get(@server.url, adapter)
38
49
  expect(response.body).to eq("get")
@@ -112,6 +123,15 @@ describe HTTPI::Adapter::Curb do
112
123
  response = HTTPI.get(request, adapter)
113
124
  expect(response.body).to eq("get")
114
125
  end
126
+
127
+ it "works with ciphers" do
128
+ request = HTTPI::Request.new(@server.url)
129
+ request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
130
+ request.auth.ssl.ciphers = OpenSSL::SSL::SSLContext.new.ciphers
131
+
132
+ response = HTTPI.get(request, adapter)
133
+ expect(response.body).to eq("get")
134
+ end
115
135
  end
116
136
 
117
137
  end
@@ -3,8 +3,8 @@ require "integration/support/server"
3
3
 
4
4
  describe HTTPI::Adapter::EmHttpRequest do
5
5
 
6
- # em_http is not supported on ruby 1.8
7
- unless RUBY_VERSION =~ /1\.8/
6
+ # em_http is not supported on java
7
+ unless RUBY_PLATFORM =~ /java/
8
8
  require "em-synchrony"
9
9
 
10
10
  subject(:adapter) { :em_http }
@@ -42,6 +42,23 @@ describe HTTPI::Adapter::EmHttpRequest do
42
42
  expect(response.headers["Set-Cookie"]).to eq(cookies)
43
43
  end
44
44
 
45
+ if RUBY_PLATFORM =~ /java/
46
+ pending <<-MSG
47
+ It seems like JRuby is missing support for inactivity timeout! See related issues on GitHub:
48
+ - https://github.com/eventmachine/eventmachine/issues/155
49
+ - https://github.com/eventmachine/eventmachine/pull/312
50
+ MSG
51
+ else
52
+ it "it supports read timeout" do
53
+ request = HTTPI::Request.new(@server.url + "timeout")
54
+ request.read_timeout = 0.5 # seconds
55
+
56
+ expect do
57
+ HTTPI.get(request, adapter)
58
+ end.to raise_exception(HTTPI::TimeoutError)
59
+ end
60
+ end
61
+
45
62
  it "executes GET requests" do
46
63
  response = HTTPI.get(@server.url, adapter)
47
64
  expect(response.body).to eq("get")
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
  require "integration/support/server"
3
3
 
4
- describe HTTPI::Adapter::HTTPClient do
4
+ describe HTTPI::Adapter::Excon do
5
5
 
6
6
  subject(:adapter) { :excon }
7
7
 
@@ -30,6 +30,17 @@ describe HTTPI::Adapter::HTTPClient do
30
30
  expect(response.headers["Set-Cookie"]).to eq(cookies)
31
31
  end
32
32
 
33
+ it "it supports read timeout" do
34
+ require "excon"
35
+
36
+ request = HTTPI::Request.new(@server.url + "timeout")
37
+ request.read_timeout = 0.5 # seconds
38
+
39
+ expect do
40
+ HTTPI.get(request, adapter)
41
+ end.to raise_exception(Excon::Error::Timeout)
42
+ end
43
+
33
44
  it "executes GET requests" do
34
45
  response = HTTPI.get(@server.url, adapter)
35
46
  expect(response.body).to eq("get")
@@ -68,6 +79,21 @@ describe HTTPI::Adapter::HTTPClient do
68
79
  expect(response.body).to eq("basic-auth")
69
80
  end
70
81
 
82
+ it "does not support ntlm authentication" do
83
+ request = HTTPI::Request.new(@server.url + "ntlm-auth")
84
+ request.auth.ntlm("tester", "vReqSoafRe5O")
85
+
86
+ expect { HTTPI.get(request, adapter) }.
87
+ to raise_error(HTTPI::NotSupportedError, /does not support NTLM authentication/)
88
+ end
89
+
90
+ it "supports disabling verify mode" do
91
+ request = HTTPI::Request.new(@server.url)
92
+ request.auth.ssl.verify_mode = :none
93
+ adapter_class = HTTPI::Adapter.load(adapter).new(request)
94
+ expect(adapter_class.client.data[:ssl_verify_peer]).to eq(false)
95
+ end
96
+
71
97
  it "supports chunked response" do
72
98
  request = HTTPI::Request.new(@server.url)
73
99
  res = ""
@@ -102,6 +128,46 @@ describe HTTPI::Adapter::HTTPClient do
102
128
  response = HTTPI.get(request, adapter)
103
129
  expect(response.body).to eq("get")
104
130
  end
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
+
142
+ it "works with client cert and key provided as file path" do
143
+ request = HTTPI::Request.new(@server.url)
144
+ request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
145
+ request.auth.ssl.cert_file = "spec/fixtures/client_cert.pem"
146
+ request.auth.ssl.cert_key_file = "spec/fixtures/client_key.pem"
147
+
148
+ response = HTTPI.get(request, adapter)
149
+ expect(response.body).to eq("get")
150
+ end
151
+
152
+ it "works with client cert and key set directly" do
153
+ request = HTTPI::Request.new(@server.url)
154
+
155
+ request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
156
+ request.auth.ssl.cert = OpenSSL::X509::Certificate.new File.open("spec/fixtures/client_cert.pem").read
157
+ request.auth.ssl.cert_key = OpenSSL::PKey.read File.open("spec/fixtures/client_key.pem").read
158
+
159
+ response = HTTPI.get(request, adapter)
160
+ expect(response.body).to eq("get")
161
+ end
162
+
163
+ it "works with ciphers" do
164
+ request = HTTPI::Request.new(@server.url)
165
+ request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
166
+ request.auth.ssl.ciphers = OpenSSL::SSL::SSLContext.new.ciphers
167
+
168
+ response = HTTPI.get(request, adapter)
169
+ expect(response.body).to eq("get")
170
+ end
105
171
  end
106
172
  end
107
173
 
@@ -1,44 +1,19 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
3
- MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
4
- DTA0MDEzMDAwNDIzMloXDTM2MDEyMjAwNDIzMlowPDELMAkGA1UEBgwCSlAxEjAQ
5
- BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQswCQYDVQQDDAJDQTCCASIw
6
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANbv0x42BTKFEQOE+KJ2XmiSdZpR
7
- wjzQLAkPLRnLB98tlzs4xo+y4RyY/rd5TT9UzBJTIhP8CJi5GbS1oXEerQXB3P0d
8
- L5oSSMwGGyuIzgZe5+vZ1kgzQxMEKMMKlzA73rbMd4Jx3u5+jdbP0EDrPYfXSvLY
9
- bS04n2aX7zrN3x5KdDrNBfwBio2/qeaaj4+9OxnwRvYP3WOvqdW0h329eMfHw0pi
10
- JI0drIVdsEqClUV4pebT/F+CPUPkEh/weySgo9wANockkYu5ujw2GbLFcO5LXxxm
11
- dEfcVr3r6t6zOA4bJwL0W/e6LBcrwiG/qPDFErhwtgTLYf6Er67SzLyA66UCAwEA
12
- AaOB3DCB2TAPBgNVHRMBAf8EBTADAQH/MDEGCWCGSAGG+EIBDQQkFiJSdWJ5L09w
13
- ZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRJ7Xd380KzBV7f
14
- USKIQ+O/vKbhDzAOBgNVHQ8BAf8EBAMCAQYwZAYDVR0jBF0wW4AUSe13d/NCswVe
15
- 31EiiEPjv7ym4Q+hQKQ+MDwxCzAJBgNVBAYMAkpQMRIwEAYDVQQKDAlKSU4uR1Iu
16
- SlAxDDAKBgNVBAsMA1JSUjELMAkGA1UEAwwCQ0GCAQAwDQYJKoZIhvcNAQEFBQAD
17
- ggEBAIu/mfiez5XN5tn2jScgShPgHEFJBR0BTJBZF6xCk0jyqNx/g9HMj2ELCuK+
18
- r/Y7KFW5c5M3AQ+xWW0ZSc4kvzyTcV7yTVIwj2jZ9ddYMN3nupZFgBK1GB4Y05GY
19
- MJJFRkSu6d/Ph5ypzBVw2YMT/nsOo5VwMUGLgS7YVjU+u/HNWz80J3oO17mNZllj
20
- PvORJcnjwlroDnS58KoJ7GDgejv3ESWADvX1OHLE4cRkiQGeLoEU4pxdCxXRqX0U
21
- PbwIkZN9mXVcrmPHq8MWi4eC/V7hnbZETMHuWhUoiNdOEfsAXr3iP4KjyyRdwc7a
22
- d/xgcK06UVQRL/HbEYGiQL056mc=
23
- -----END CERTIFICATE-----
24
- -----BEGIN CERTIFICATE-----
25
- MIIDaDCCAlCgAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQswCQYDVQQGDAJKUDES
26
- MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxCzAJBgNVBAMMAkNBMB4X
27
- DTA0MDEzMDAwNDMyN1oXDTM1MDEyMjAwNDMyN1owPzELMAkGA1UEBgwCSlAxEjAQ
28
- BgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMQ4wDAYDVQQDDAVTdWJDQTCC
29
- ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0Ou7AyRcRXnB/kVHv/6kwe
30
- ANzgg/DyJfsAUqW90m7Lu1nqyug8gK0RBd77yU0w5HOAMHTVSdpjZK0g2sgx4Mb1
31
- d/213eL9TTl5MRVEChTvQr8q5DVG/8fxPPE7fMI8eOAzd98/NOAChk+80r4Sx7fC
32
- kGVEE1bKwY1MrUsUNjOY2d6t3M4HHV3HX1V8ShuKfsHxgCmLzdI8U+5CnQedFgkm
33
- 3e+8tr8IX5RR1wA1Ifw9VadF7OdI/bGMzog/Q8XCLf+WPFjnK7Gcx6JFtzF6Gi4x
34
- 4dp1Xl45JYiVvi9zQ132wu8A1pDHhiNgQviyzbP+UjcB/tsOpzBQF8abYzgEkWEC
35
- AwEAAaNyMHAwDwYDVR0TAQH/BAUwAwEB/zAxBglghkgBhvhCAQ0EJBYiUnVieS9P
36
- cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUlCjXWLsReYzH
37
- LzsxwVnCXmKoB/owCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQCJ/OyN
38
- rT8Cq2Y+G2yA/L1EMRvvxwFBqxavqaqHl/6rwsIBFlB3zbqGA/0oec6MAVnYynq4
39
- c4AcHTjx3bQ/S4r2sNTZq0DH4SYbQzIobx/YW8PjQUJt8KQdKMcwwi7arHP7A/Ha
40
- LKu8eIC2nsUBnP4NhkYSGhbmpJK+PFD0FVtD0ZIRlY/wsnaZNjWWcnWF1/FNuQ4H
41
- ySjIblqVQkPuzebv3Ror6ZnVDukn96Mg7kP4u6zgxOeqlJGRe1M949SS9Vudjl8X
42
- SF4aZUUB9pQGhsqQJVqaz2OlhGOp9D0q54xko/rekjAIcuDjl1mdX4F2WRrzpUmZ
43
- uY/bPeOBYiVsOYVe
2
+ MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
3
+ GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
4
+ ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
5
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
6
+ DQEBAQUAA4IBDwAwggEKAoIBAQDIHxrFcS2JkRQbXLFosb32unVkVuwHSPSt6Dpl
7
+ 2jUQHP/bceAx/d9waHYf8rlbCFAIoduZDOc7XCJUidgcG5NfLJyQpkkWOU8CGWH+
8
+ Ipl4AE8auYCcy/0T7BQqaRC41HPmrJG1CC40rqcY47lUO2haI+vj5TZFHNhAbRat
9
+ rR1iD1veis2gBZtrMzd4IlpvEHGv6ghfnSc20za4exmapjp/uAAIOXpeFX8QHumA
10
+ bty4dd+iHpKjDzUrhG9Qa5v28ii2K1AcbczUQ7FzSp2/GoRSjF+WY6i86N9Z1M97
11
+ 2PEgy0IG5l6JHu1P0/rd00hN0h0Owzv3V5ldMLZap7+pVFQTAgMBAAGjIzAhMA8G
12
+ A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
13
+ AQA3GWpy4bYLOHLENDTUBeclF6cDdYiautD6gxd1SDLMWOhAUF7ywwT87OAJdr1I
14
+ +W1TUv5BRG21rNm1QsZfLbStdKA1mpiET/9nYN7m1YauL5hI3yD49TGuO9/sxcE5
15
+ zNW7D3VBVNq+pyT21/TvLAgxCNvjjm7byzyIOcoRUyZx8WhCf8nUT6cEShXqEg4Q
16
+ iUBSLI38tiQoZneuVzDRlXBY0PqoB19l2Kg9yThHjPTVhw5EAQSDKXCCvaxAbVw6
17
+ ZPLNnOdK6DvqEZ3GC5WlaHQdmLxmN4OfV6AEtpgqgGY9u8K1ylTr3ET7xLK7bhcA
18
+ oZsggEVZr1Ifx9BWIazRNwlw
44
19
  -----END CERTIFICATE-----
@@ -1,19 +1,19 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIC/zCCAeegAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQGDAJKUDES
3
- MBAGA1UECgwJSklOLkdSLkpQMQwwCgYDVQQLDANSUlIxDjAMBgNVBAMMBVN1YkNB
4
- MB4XDTA0MDEzMTAzMTMxNloXDTMzMDEyMzAzMTMxNlowQzELMAkGA1UEBgwCSlAx
5
- EjAQBgNVBAoMCUpJTi5HUi5KUDEMMAoGA1UECwwDUlJSMRIwEAYDVQQDDAlsb2Nh
6
- bGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANFJTxWqup3nV9dsJAku
7
- p+WaXnPNIzcpAA3qMGZDJTJsfa8Du7ZxTP0XJK5mETttBrn711cJxAuP3KjqnW9S
8
- vtZ9lY2sXJ6Zj62sN5LwG3VVe25dI28yR1EsbHjJ5Zjf9tmggMC6am52dxuHbt5/
9
- vHo4ngJuKE/U+eeGRivMn6gFAgMBAAGjgYUwgYIwDAYDVR0TAQH/BAIwADAxBglg
10
- hkgBhvhCAQ0EJBYiUnVieS9PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd
11
- BgNVHQ4EFgQUpZIyygD9JxFYHHOTEuWOLbCKfckwCwYDVR0PBAQDAgWgMBMGA1Ud
12
- JQQMMAoGCCsGAQUFBwMBMA0GCSqGSIb3DQEBBQUAA4IBAQBwAIj5SaBHaA5X31IP
13
- CFCJiep96awfp7RANO0cuUj+ZpGoFn9d6FXY0g+Eg5wAkCNIzZU5NHN9xsdOpnUo
14
- zIBbyTfQEPrge1CMWMvL6uGaoEXytq84VTitF/xBTky4KtTn6+es4/e7jrrzeUXQ
15
- RC46gkHObmDT91RkOEGjHLyld2328jo3DIN/VTHIryDeVHDWjY5dENwpwdkhhm60
16
- DR9IrNBbXWEe9emtguNXeN0iu1ux0lG1Hc6pWGQxMlRKNvGh0yZB9u5EVe38tOV0
17
- jQaoNyL7qzcQoXD3Dmbi1p0iRmg/+HngISsz8K7k7MBNVsSclztwgCzTZOBiVtkM
18
- rRlQ
2
+ MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
3
+ GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
4
+ ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
5
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
6
+ BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXOg3gTrGJfVft9cSrfGRnEZezDB
7
+ L93fcLwJAoaXGxbEg1RW/fOrSpSNemuqOvbzczV7m5eYTf1lHPBJsndbYyijIR1+
8
+ Fp4tjFDp76SC3hxCIc3uYXIz0qQwSOAi1z15zobS4xF29jlsXWtfBl9fivjzdj/f
9
+ pbZ+JPYOrlcJAf6Xmr3xh//13rOI0ytBMlWf51z/iAZBLm2wvbt+nR7B6koAdTgM
10
+ Coe+gOtcLWYY5ApJ4qB9knGdxWoF5p7guHHw2aGTM0jyhgBowfVkFRiE2JUmODae
11
+ g+dHsd8ogWbqhGyZTredJF/NRrLKU0h+t7ldKHvXEZy4qyqQlvKoTpODqQIDAQAB
12
+ oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAI/bcQP4Hu9O
13
+ OtaaIjVxN8+9jXUOrMpSogmZ4bRKImispt9SA+sbxec7iOMM2pG3Py2yi0hWGzii
14
+ hSebWIsM1JuPj7ks9l8nGRxpGeInJwTkJorG4ZLEypoS2wW3fQZGx3o4da5V+U2Z
15
+ HEY0wQTbPBqqnyeZ16ZFNVCzw8y9l7y7CEFjvUO3sq0pne9r7Z+XVgjGyBdBYkJS
16
+ 0kcqPBXFCMHrWH5UlacYlM5cqgoVztOp2STGmR3XR7a34oueeA10QSP+jzeYvWA1
17
+ wTYA762uU2ReCdujfNbf8V1tZWAH36KldM3hhDNWeveAGxxj1h2R9T/k2kHl/a7D
18
+ I3VdS59vjJY=
19
19
  -----END CERTIFICATE-----
@@ -1,15 +1,27 @@
1
1
  -----BEGIN RSA PRIVATE KEY-----
2
- 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
- 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
- MkdRLGx4yeWY3/bZoIDAumpudncbh27ef7x6OJ4CbihP1PnnhkYrzJ+oBQIDAQAB
5
- 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
- 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
- IPAFn9KHukdqGXkwEMdErsUaPTy9A1V/aROVEaAY+HJgq/eZAkEA/BP1QMV04WEZ
8
- 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
- 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
- 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
- 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
- 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
- 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
- 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
15
27
  -----END RSA PRIVATE KEY-----