[DRE-commits] [ruby-excon] 01/02: Imported Upstream version 0.49.0
Abhijith PA
abhijithpa-guest at moszumanska.debian.org
Mon May 30 13:26:50 UTC 2016
This is an automated email from the git hooks/post-receive script.
abhijithpa-guest pushed a commit to branch master
in repository ruby-excon.
commit 31db01a46848baf36a003b83e8dc5daa9f9f1e1c
Author: Abhijith PA <abhijith at openmailbox.org>
Date: Mon May 30 18:54:52 2016 +0530
Imported Upstream version 0.49.0
---
CONTRIBUTORS.md | 4 +-
Gemfile.lock | 16 +-
README.md | 23 +-
Rakefile | 2 +-
changelog.txt | 56 +++
data/cacert.pem | 633 +++++++++++++++--------------
excon.gemspec | 9 +-
lib/excon.rb | 8 +-
lib/excon/connection.rb | 39 +-
lib/excon/constants.rb | 4 +-
lib/excon/errors.rb | 23 +-
lib/excon/middlewares/capture_cookies.rb | 31 ++
lib/excon/middlewares/decompress.rb | 7 +-
lib/excon/middlewares/instrumentor.rb | 14 +-
lib/excon/middlewares/redirect_follower.rb | 13 +-
lib/excon/response.rb | 55 ++-
lib/excon/socket.rb | 131 +++---
lib/excon/ssl_socket.rb | 11 +-
lib/excon/utils.rb | 5 +-
metadata.yml | 272 -------------
tests/basic_tests.rb | 19 +-
tests/complete_responses.rb | 31 ++
tests/middlewares/capture_cookies_tests.rb | 34 ++
tests/middlewares/decompress_tests.rb | 5 +
tests/middlewares/instrumentation_tests.rb | 27 +-
tests/middlewares/mock_tests.rb | 37 ++
tests/proxy_tests.rb | 7 +
tests/query_string_tests.rb | 65 ++-
tests/rackups/basic.rb | 6 +
tests/rackups/redirecting_with_cookie.ru | 40 ++
tests/response_tests.rb | 9 +
tests/servers/good.rb | 18 +-
tests/test_helper.rb | 6 +-
33 files changed, 924 insertions(+), 736 deletions(-)
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 6ff37d2..d0dfdb6 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -12,6 +12,7 @@
* Carl Hörberg <carl.hoerberg at gmail.com>
* Carlos Sanchez <csanchez at maestrodev.com>
* Claudio Poli <masterkain at gmail.com>
+* Colin Dean <colindean at us.ibm.com>
* Damien Mathieu <damien at heroku.com>
* Dan Hensgen <dan at methodhead.com>
* Dan Peterson <dpiddy at gmail.com>
@@ -44,6 +45,7 @@
* Joshua Mckinney <joshmckin at gmail.com>
* Joshua Napoli <jnapoli at swipely-napoli.home>
* Joshua Napoli <jnapoli at swipely-napoli.local>
+* Joshua Smith <kognate at gmail.com>
* Kensuke Nagae <kyanny at gmail.com>
* Konstantin Shabanov <etehtsea at gmail.com>
* Kyle Rames <kyle.rames at rackspace.com>
@@ -105,4 +107,4 @@
* rkyrychuk <ruslan.kyrychuk at gmail.com>
* sshaw <skye.shaw at gmail.com>
* twrodriguez <tw.rodriguez at gmail.com>
-* zimbatm <zimbatm at zimbatm.com>
\ No newline at end of file
+* zimbatm <zimbatm at zimbatm.com>
diff --git a/Gemfile.lock b/Gemfile.lock
index 5657051..9cb0620 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
- excon (0.45.1)
+ excon (0.49.0)
GEM
remote: http://rubygems.org/
@@ -9,6 +9,7 @@ GEM
activesupport (3.2.6)
i18n (~> 0.6)
multi_json (~> 1.0)
+ backports (3.6.4)
bouncy-castle-java (1.5.0147)
chronic (0.6.7)
delorean (2.0.0)
@@ -29,6 +30,8 @@ GEM
rack (1.6.0)
rack-protection (1.2.0)
rack
+ rack-test (0.6.3)
+ rack (>= 1.0)
raindrops (0.13.0)
rake (0.9.2.2)
rdoc (3.12)
@@ -244,6 +247,13 @@ GEM
rack (~> 1.3, >= 1.3.6)
rack-protection (~> 1.2)
tilt (~> 1.3, >= 1.3.3)
+ sinatra-contrib (1.3.2)
+ backports (>= 2.0)
+ eventmachine
+ rack-protection
+ rack-test
+ sinatra (~> 1.3.0)
+ tilt (~> 1.3)
tilt (1.3.3)
unicorn (4.8.3)
kgio (~> 2.6)
@@ -268,4 +278,8 @@ DEPENDENCIES
rubysl (~> 2.0)
shindo
sinatra
+ sinatra-contrib
unicorn
+
+BUNDLED WITH
+ 1.11.2
diff --git a/README.md b/README.md
index 5a64395..60f70a0 100644
--- a/README.md
+++ b/README.md
@@ -86,7 +86,7 @@ Here are a few common examples:
```ruby
# Output debug info, similar to ENV['EXCON_DEBUG']
-connection = Excon.new('http://geemus.com/', :debug => true)
+connection = Excon.new('http://geemus.com/', :debug_request => true, :debug_response => true)
# Custom headers
Excon.get('http://geemus.com', :headers => {'Authorization' => 'Basic 0123456789ABCDEF'})
@@ -132,9 +132,6 @@ connection.request(:write_timeout => 360)
#
connection = Excon.new('http://geemus.com/', :tcp_nodelay => true)
-# opt-in to omitting port from http:80 and https:443
-connection = Excon.new('http://geemus.com/', :omit_default_port => true)
-
# set longer connect_timeout (default is 60 seconds)
connection = Excon.new('http://geemus.com/', :connect_timeout => 360)
@@ -151,6 +148,20 @@ require 'addressable/uri'
connection = Excon.new('http://geemus.com/', uri_parser: Addressable::URI)
```
+Compared to web browsers and other http client libraries, e.g. curl, Excon is a bit more low-level and doesn't assume much by default. If you are seeing different results compared to other clients, the following options might help:
+
+```ruby
+# opt-in to omitting port from http:80 and https:443
+connection = Excon.new('http://geemus.com/', :omit_default_port => true)
+
+# accept gzip encoding
+connection = Excon.new('http://geemus.com/', :headers => { "Accept" => "gzip" })
+
+# turn off peer verification (less secure)
+Excon.defaults[:ssl_verify_peer] = false
+connection = Excon.new('https://...')
+```
+
## Chunked Requests
You can make `Transfer-Encoding: chunked` requests by passing a block that will deliver chunks, delivering an empty chunk to signal completion.
@@ -297,6 +308,8 @@ config.before(:all) do
end
```
+By default stubs are shared globally, to make stubs unique to each thread, use `Excon.defaults[:stubs] = :local`.
+
## Instrumentation
Excon calls can be timed using the [ActiveSupport::Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html) API.
@@ -379,7 +392,7 @@ connection = Excon.new('https://example.com',
## HTTPS/SSL Issues
-By default excon will try to verify peer certificates when using SSL for HTTPS. Unfortunately on some operating systems the defaults will not work. This will likely manifest itself as something like `Excon::Errors::SocketError: SSL_connect returned=1 ...`
+By default excon will try to verify peer certificates when using HTTPS. Unfortunately on some operating systems the defaults will not work. This will likely manifest itself as something like `Excon::Errors::CertificateError: SSL_connect returned=1 ...`
If you have the misfortune of running into this problem you have a couple options. If you have certificates but they aren't being auto-discovered, you can specify the path to your certificates:
diff --git a/Rakefile b/Rakefile
index 3391e6d..4d9f772 100644
--- a/Rakefile
+++ b/Rakefile
@@ -138,7 +138,7 @@ desc "update bundled certs"
task :update_certs do
require File.join(File.dirname(__FILE__), 'lib', 'excon')
File.open(File.join(File.dirname(__FILE__), 'data', 'cacert.pem'), 'w') do |file|
- data = Excon.get("http://curl.haxx.se/ca/cacert.pem").body
+ data = Excon.get("https://curl.haxx.se/ca/cacert.pem").body
file.write(data)
end
end
diff --git a/changelog.txt b/changelog.txt
index 5c10da5..ef45978 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,59 @@
+0.49.0 03/28/2016
+=================
+
+fix nonblock ssl socket connect timeout handling
+fix README debug example
+make unique class for certificate errors
+connection logic cleanup
+change stubs back to global (with local option via defaults)
+specific handling for set-cookie header exceptions
+
+0.48.0 03/07/2016
+=================
+
+optimize by writing part of body with headers when it fits in a chunk
+
+0.47.0 02/29/2016
+=================
+
+fix bundled certs
+fix instrumentors to allow recording timings
+
+0.46.0 02/26/2016
+=================
+
+empty host header for unix sockets
+raise EOFError on unexpectedly read nil
+add host/path/port to response
+keep cookies through redirects
+fix to skip decompressing empty bodies
+fix escaping for query string
+README improvements
+fix SocketError initializer
+fix incorrect error class usage
+
+0.45.4 07/13/2015
+=================
+
+fix undefined errors in error handling
+ignore empty proxy values
+
+0.45.3 04/21/2015
+=================
+
+guard warning about openssl versions in case constant undefined
+ensure rackup listens properly, fixes local tests
+
+0.45.2 04/16/2015
+=================
+
+add raw_status reader
+improved tests around response/status
+rescue IO::WaitWritable for SSL sockets also
+indentation fixes
+tighten rescue in ssl socket connect to better report non-timeouts
+rescue EAGAIN and EWOULDBLOCK for non-blocking connects
+
0.45.1 03/27/2015
=================
diff --git a/data/cacert.pem b/data/cacert.pem
index b7cd57c..76adf83 100644
--- a/data/cacert.pem
+++ b/data/cacert.pem
@@ -1,7 +1,7 @@
##
## Bundle of CA Root Certificates
##
-## Certificate data from Mozilla as of: Wed Feb 25 04:12:04 2015
+## Certificate data from Mozilla as of: Wed Jan 20 04:12:04 2016
##
## This is a bundle of X.509 certificates of public Certificate Authorities
## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,30 +14,10 @@
## Just configure this file as the SSLCACertificateFile.
##
## Conversion done with mk-ca-bundle.pl version 1.25.
-## SHA1: f9bc9fa76145720d94124527f82a7185d921975e
+## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e
##
-Equifax Secure CA
-=================
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
-ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
-B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
-fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
-8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
-A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
-CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
-A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
-spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
-Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
-zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
-BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
-70+sB3c4
------END CERTIFICATE-----
-
GlobalSign Root CA
==================
-----BEGIN CERTIFICATE-----
@@ -105,30 +85,6 @@ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
-----END CERTIFICATE-----
-Verisign Class 4 Public Primary Certification Authority - G3
-============================================================
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
-CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
-cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
-Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
-tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
-8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
-Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
-Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
-j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
-fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
-RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
-UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
-
Entrust.net Premium 2048 Secure Server CA
=========================================
-----BEGIN CERTIFICATE-----
@@ -174,23 +130,6 @@ Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
-----END CERTIFICATE-----
-Equifax Secure Global eBusiness CA
-==================================
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
-RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
-bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
-b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
-PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
-qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
-hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
-BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
-MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
-I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
-NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
-
AddTrust Low-Value Services Root
================================
-----BEGIN CERTIFICATE-----
@@ -712,31 +651,6 @@ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
-----END CERTIFICATE-----
-UTN DATACorp SGC Root CA
-========================
------BEGIN CERTIFICATE-----
-MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
-BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
-IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
-BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
-MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
-HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
-dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
-raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
-wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
-9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
-33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
-DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
-BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
-LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
-DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
-Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
-I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
-EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
-DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
------END CERTIFICATE-----
-
UTN USERFirst Hardware Root CA
==============================
-----BEGIN CERTIFICATE-----
@@ -1159,54 +1073,6 @@ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
oKfN5XozNmr6mis=
-----END CERTIFICATE-----
-TURKTRUST Certificate Services Provider Root 1
-==============================================
------BEGIN CERTIFICATE-----
-MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
-MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
-acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
-MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
-U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
-TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
-aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
-yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
-Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
-8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
-W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
-BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
-sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
-q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
-B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
-nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
------END CERTIFICATE-----
-
-TURKTRUST Certificate Services Provider Root 2
-==============================================
------BEGIN CERTIFICATE-----
-MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
-bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
-MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
-QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
-MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
-dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
-A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
-acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
-LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
-x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
-QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
-5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
-AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
-Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
-Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
-hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
-9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
-UrbnBEI=
------END CERTIFICATE-----
-
SwissSign Gold CA - G2
======================
-----BEGIN CERTIFICATE-----
@@ -1606,83 +1472,6 @@ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
-----END CERTIFICATE-----
-TC TrustCenter Class 2 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
-MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
-IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
-xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
-Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
-SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
-dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
-KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
-TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
-JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
-vQ==
------END CERTIFICATE-----
-
-TC TrustCenter Class 3 CA II
-============================
------BEGIN CERTIFICATE-----
-MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
-IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
-MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
-c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
-AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
-yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
-6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
-uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
-2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
-7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
-Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
-cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
-SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
-TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
-O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
-yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
-IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
-092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
-5A==
------END CERTIFICATE-----
-
-TC TrustCenter Universal CA I
-=============================
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
-REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
-IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
-MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
-VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
-JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
-qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
-xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
-ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
-gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
-BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
-1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
-vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
-ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
-ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
-7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
------END CERTIFICATE-----
-
Deutsche Telekom Root CA 2
==========================
-----BEGIN CERTIFICATE-----
@@ -1705,28 +1494,6 @@ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
Cm26OWMohpLzGITY+9HPBVZkVw==
-----END CERTIFICATE-----
-ComSign Secured CA
-==================
------BEGIN CERTIFICATE-----
-MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
-AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
-NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
-QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
-ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
-49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
-7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
-kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
-9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
-AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
-U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
-j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
-AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
-BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
-FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
-51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
-OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
------END CERTIFICATE-----
-
Cybertrust Global Root
======================
-----BEGIN CERTIFICATE-----
@@ -1828,26 +1595,6 @@ fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
-----END CERTIFICATE-----
-Buypass Class 3 CA 1
-====================
------BEGIN CERTIFICATE-----
-MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
-QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
-MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
-c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
-ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
-n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
-AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
-1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
-AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
-pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
-EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
-htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
-el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
------END CERTIFICATE-----
-
EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
==========================================================================
-----BEGIN CERTIFICATE-----
@@ -2277,28 +2024,6 @@ yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
LXpUq3DDfSJlgnCW
-----END CERTIFICATE-----
-E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
-===================================================
------BEGIN CERTIFICATE-----
-MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
-EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
-ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
-MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
-cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
-aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
-8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
-jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
-JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
-9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
-SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
-F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
-D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
-Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
-fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
------END CERTIFICATE-----
-
GlobalSign Root CA - R3
=======================
-----BEGIN CERTIFICATE-----
@@ -2701,29 +2426,6 @@ iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
-----END CERTIFICATE-----
-A-Trust-nQual-03
-================
------BEGIN CERTIFICATE-----
-MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
-Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
-a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
-dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
-RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
-ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
-c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
-zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
-yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
-SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
-iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
-cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
-eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
-ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
-sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
-JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
-mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
-ahq97BvIxYSazQ==
------END CERTIFICATE-----
-
TWCA Root Certification Authority
=================================
-----BEGIN CERTIFICATE-----
@@ -3858,3 +3560,334 @@ BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G3
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
+olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
+x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
+EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
+Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
+mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
+1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
+07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
+FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
+41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
+yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
+KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
+v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
+8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
+8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
+mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
+1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
+JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
+tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden EV Root CA
+================================
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
+MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
+cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
+SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
+O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
+0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
+Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
+XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
+08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
+0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
+74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
+fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
+ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
+c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
+5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
+b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
+f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
+5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
+WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
+DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
+eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
+RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
+ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
+SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
+n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
+ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
+jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
+ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
+9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
+4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
+HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
+hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
+BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
+URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
+lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
+B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
+-----END CERTIFICATE-----
+
+TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
+MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
+BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
+aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
+aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
+2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
+wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
+HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
+9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
+fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
+o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
+hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
+O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
+-----END CERTIFICATE-----
+
+Certinomis - Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
+LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
+EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
+ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
+P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
+d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
+z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
+8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
+RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
+6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
+FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
+PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
+i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
+YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
+6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
+AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
+WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
+Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
+lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
+y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
+Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
+DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
+I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
+cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
+hkIGuUE=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+Certification Authority of WoSign G2
+====================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
+EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
+CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
+XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
+W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
+5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
+v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
+hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
+P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
+TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
+7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
+-----END CERTIFICATE-----
+
+CA WoSign ECC Root
+==================
+-----BEGIN CERTIFICATE-----
+MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
+TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
+dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
+ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
+zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
+t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
+QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
+MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
+Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
+a/GRspBl9JrmkO5K
+-----END CERTIFICATE-----
diff --git a/excon.gemspec b/excon.gemspec
index 9b5e94d..b67aa20 100644
--- a/excon.gemspec
+++ b/excon.gemspec
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
## If your rubyforge_project name is different, then edit it and comment out
## the sub! line in the Rakefile
s.name = 'excon'
- s.version = '0.45.1'
- s.date = '2015-03-27'
+ s.version = '0.49.0'
+ s.date = '2016-03-28'
s.rubyforge_project = 'excon'
## Make sure your summary is short. The description may be as long
@@ -62,6 +62,7 @@ Gem::Specification.new do |s|
s.add_development_dependency('rdoc')
s.add_development_dependency('shindo')
s.add_development_dependency('sinatra')
+ s.add_development_dependency('sinatra-contrib')
s.add_development_dependency('json', '>= 1.8.2')
## Leave this section as-is. It will be automatically generated from the
@@ -104,6 +105,7 @@ Gem::Specification.new do |s|
lib/excon/extensions/uri.rb
lib/excon/headers.rb
lib/excon/middlewares/base.rb
+ lib/excon/middlewares/capture_cookies.rb
lib/excon/middlewares/decompress.rb
lib/excon/middlewares/escape_path.rb
lib/excon/middlewares/expects.rb
@@ -122,6 +124,7 @@ Gem::Specification.new do |s|
tests/authorization_header_tests.rb
tests/bad_tests.rb
tests/basic_tests.rb
+ tests/complete_responses.rb
tests/data/127.0.0.1.cert.crt
tests/data/127.0.0.1.cert.key
tests/data/excon.cert.crt
@@ -130,6 +133,7 @@ Gem::Specification.new do |s|
tests/errors_tests.rb
tests/header_tests.rb
tests/middlewares/canned_response_tests.rb
+ tests/middlewares/capture_cookies_tests.rb
tests/middlewares/decompress_tests.rb
tests/middlewares/escape_path_tests.rb
tests/middlewares/idempotent_tests.rb
@@ -146,6 +150,7 @@ Gem::Specification.new do |s|
tests/rackups/proxy.ru
tests/rackups/query_string.ru
tests/rackups/redirecting.ru
+ tests/rackups/redirecting_with_cookie.ru
tests/rackups/request_headers.ru
tests/rackups/request_methods.ru
tests/rackups/response_header.ru
diff --git a/lib/excon.rb b/lib/excon.rb
index 49d9389..003d549 100644
--- a/lib/excon.rb
+++ b/lib/excon.rb
@@ -30,6 +30,7 @@ require 'excon/response'
require 'excon/middlewares/decompress'
require 'excon/middlewares/escape_path'
require 'excon/middlewares/redirect_follower'
+require 'excon/middlewares/capture_cookies'
require 'excon/pretty_printer'
require 'excon/socket'
require 'excon/ssl_socket'
@@ -211,7 +212,12 @@ module Excon
# get a list of defined stubs
def stubs
- @stubs ||= []
+ case Excon.defaults[:stubs]
+ when :global
+ @stubs ||= []
+ when :local
+ Thread.current[:_excon_stubs] ||= []
+ end
end
# remove first/oldest stub matching request_params
diff --git a/lib/excon/connection.rb b/lib/excon/connection.rb
index 4692cae..36d9db8 100644
--- a/lib/excon/connection.rb
+++ b/lib/excon/connection.rb
@@ -140,9 +140,9 @@ module Excon
# add additional "\r\n" to indicate end of headers
request << CR_NL
- socket.write(request) # write out request + headers
if datum.has_key?(:request_block)
+ socket.write(request) # write out request + headers
while true # write out body with chunked encoding
chunk = datum[:request_block].call
if FORCE_ENC
@@ -155,13 +155,30 @@ module Excon
break
end
end
- elsif !body.nil? # write out body
+ elsif body.nil?
+ socket.write(request) # write out request + headers
+ else # write out body
if body.respond_to?(:binmode)
body.binmode
end
if body.respond_to?(:rewind)
body.rewind rescue nil
end
+
+ # if request + headers is less than chunk size, fill with body
+ if FORCE_ENC
+ request.force_encoding('BINARY')
+ end
+ chunk = body.read([datum[:chunk_size] - request.length, 0].max)
+ if chunk
+ if FORCE_ENC
+ chunk.force_encoding('BINARY')
+ end
+ socket.write(request << chunk)
+ else
+ socket.write(request) # write out request + headers
+ end
+
while chunk = body.read(datum[:chunk_size])
socket.write(chunk)
end
@@ -172,7 +189,7 @@ module Excon
when Excon::Errors::StubNotFound, Excon::Errors::Timeout
raise(error)
else
- raise(Excon::Errors::SocketError.new(error))
+ raise_socket_error(error)
end
end
@@ -207,7 +224,7 @@ module Excon
datum[:headers] = @data[:headers].merge(datum[:headers] || {})
if datum[:scheme] == UNIX
- datum[:headers]['Host'] ||= '' << datum[:socket]
+ datum[:headers]['Host'] = ''
else
datum[:headers]['Host'] ||= '' << datum[:host] << port_string(datum)
end
@@ -375,7 +392,7 @@ module Excon
when Excon::Errors::HTTPStatusError, Excon::Errors::Timeout
raise(error)
else
- raise(Excon::Errors::SocketError.new(error))
+ raise_socket_error(error)
end
end
@@ -383,7 +400,7 @@ module Excon
unix_proxy = @data[:proxy] ? @data[:proxy][:scheme] == UNIX : false
sockets[@socket_key] ||= if @data[:scheme] == UNIX || unix_proxy
Excon::UnixSocket.new(@data)
- elsif @data[:scheme] == HTTPS
+ elsif @data[:ssl_uri_schemes].include?(@data[:scheme])
Excon::SSLSocket.new(@data)
else
Excon::Socket.new(@data)
@@ -398,6 +415,14 @@ module Excon
end
end
+ def raise_socket_error(error)
+ if error.message =~ /certificate verify failed/
+ raise(Excon::Errors::CertificateError.new(error))
+ else
+ raise(Excon::Errors::SocketError.new(error))
+ end
+ end
+
def setup_proxy
if @data[:disable_proxy]
if @data[:proxy]
@@ -422,6 +447,8 @@ module Excon
case @data[:proxy]
when nil
@data.delete(:proxy)
+ when ''
+ @data.delete(:proxy)
when Hash
# no processing needed
when String, URI
diff --git a/lib/excon/constants.rb b/lib/excon/constants.rb
index 22af4bf..f7f47db 100644
--- a/lib/excon/constants.rb
+++ b/lib/excon/constants.rb
@@ -1,6 +1,6 @@
module Excon
- VERSION = '0.45.1'
+ VERSION = '0.49.0'
CR_NL = "\r\n"
@@ -132,6 +132,8 @@ module Excon
:read_timeout => 60,
:retry_limit => DEFAULT_RETRY_LIMIT,
:ssl_verify_peer => true,
+ :ssl_uri_schemes => [HTTPS],
+ :stubs => :global,
:tcp_nodelay => false,
:thread_safe_sockets => true,
:uri_parser => URI,
diff --git a/lib/excon/errors.rb b/lib/excon/errors.rb
index 9eabe13..ad037f9 100644
--- a/lib/excon/errors.rb
+++ b/lib/excon/errors.rb
@@ -8,12 +8,29 @@ module Excon
class SocketError < Error
attr_reader :socket_error
- def initialize(socket_error=Excon::Error.new)
- if socket_error.message =~ /certificate verify failed/
- super("Unable to verify certificate, please set `Excon.defaults[:ssl_ca_path] = path_to_certs`, `ENV['SSL_CERT_DIR'] = path_to_certs`, `Excon.defaults[:ssl_ca_file] = path_to_file`, `ENV['SSL_CERT_FILE'] = path_to_file`, `Excon.defaults[:ssl_verify_callback] = callback` (see OpenSSL::SSL::SSLContext#verify_callback), or `Excon.defaults[:ssl_verify_peer] = false` (less secure).")
+ def initialize(socket_error = Excon::Errors::Error.new)
+ if is_a?(CertificateError)
+ super
else
super("#{socket_error.message} (#{socket_error.class})")
+ set_backtrace(socket_error.backtrace)
+ @socket_error = socket_error
end
+ end
+ end
+
+ class CertificateError < SocketError
+ def initialize(socket_error = Excon::Errors::Error.new)
+ msg = "Unable to verify certificate. This may be an issue with the remote host or with Excon." +
+ "Excon has certificates bundled, but these can be customized." +
+ "`Excon.defaults[:ssl_ca_path] = path_to_certs`, " +
+ "`ENV['SSL_CERT_DIR'] = path_to_certs`, " +
+ "`Excon.defaults[:ssl_ca_file] = path_to_file`, " +
+ "`ENV['SSL_CERT_FILE'] = path_to_file`, " +
+ "`Excon.defaults[:ssl_verify_callback] = callback` (see OpenSSL::SSL::SSLContext#verify_callback), or " +
+ "`Excon.defaults[:ssl_verify_peer] = false` (less secure)."
+ full_message = "#{socket_error.message} (#{socket_error.class})" + ' ' + msg
+ super(full_message)
set_backtrace(socket_error.backtrace)
@socket_error = socket_error
end
diff --git a/lib/excon/middlewares/capture_cookies.rb b/lib/excon/middlewares/capture_cookies.rb
new file mode 100644
index 0000000..879efbf
--- /dev/null
+++ b/lib/excon/middlewares/capture_cookies.rb
@@ -0,0 +1,31 @@
+module Excon
+ module Middleware
+ class CaptureCookies < Excon::Middleware::Base
+
+ def extract_cookies_from_set_cookie(set_cookie)
+ set_cookie.split(',').map { |full| full.split(';').first.strip }.join('; ')
+ end
+
+ def get_header(datum, header)
+ _, header_value = datum[:response][:headers].detect do |key, value|
+ key.casecmp(header) == 0
+ end
+ header_value
+ end
+
+ def response_call(datum)
+ cookie = get_header(datum, 'Set-Cookie')
+ if cookie
+ cookie = extract_cookies_from_set_cookie(cookie)
+ unless datum[:headers].key?("Cookie")
+ datum[:headers]["Cookie"] = cookie
+ else
+ original_cookies = datum[:headers]["Cookie"]
+ datum[:headers]["Cookie"] = original_cookies.empty? ? cookie : [original_cookies,cookie].join('; ')
+ end
+ end
+ super(datum)
+ end
+ end
+ end
+end
diff --git a/lib/excon/middlewares/decompress.rb b/lib/excon/middlewares/decompress.rb
index c8fcb4c..299c910 100644
--- a/lib/excon/middlewares/decompress.rb
+++ b/lib/excon/middlewares/decompress.rb
@@ -12,16 +12,17 @@ module Excon
end
def response_call(datum)
- unless datum.has_key?(:response_block)
+ body = datum[:response][:body]
+ unless datum.has_key?(:response_block) || body.nil? || body.empty?
if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Content-Encoding') == 0 }
encodings = Utils.split_header_value(datum[:response][:headers][key])
if encoding = encodings.last
if encoding.casecmp('deflate') == 0
# assume inflate omits header
- datum[:response][:body] = Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(datum[:response][:body])
+ datum[:response][:body] = Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(body)
encodings.pop
elsif encoding.casecmp('gzip') == 0 || encoding.casecmp('x-gzip') == 0
- datum[:response][:body] = Zlib::GzipReader.new(StringIO.new(datum[:response][:body])).read
+ datum[:response][:body] = Zlib::GzipReader.new(StringIO.new(body)).read
encodings.pop
end
datum[:response][:headers][key] = encodings.join(', ')
diff --git a/lib/excon/middlewares/instrumentor.rb b/lib/excon/middlewares/instrumentor.rb
index bf615a2..0a4bb6a 100644
--- a/lib/excon/middlewares/instrumentor.rb
+++ b/lib/excon/middlewares/instrumentor.rb
@@ -3,9 +3,12 @@ module Excon
class Instrumentor < Excon::Middleware::Base
def error_call(datum)
if datum.has_key?(:instrumentor)
- datum[:instrumentor].instrument("#{datum[:instrumentor_name]}.error", :error => datum[:error])
+ datum[:instrumentor].instrument("#{datum[:instrumentor_name]}.error", :error => datum[:error]) do
+ @stack.error_call(datum)
+ end
+ else
+ @stack.error_call(datum)
end
- @stack.error_call(datum)
end
def request_call(datum)
@@ -25,9 +28,12 @@ module Excon
def response_call(datum)
if datum.has_key?(:instrumentor)
- datum[:instrumentor].instrument("#{datum[:instrumentor_name]}.response", datum[:response])
+ datum[:instrumentor].instrument("#{datum[:instrumentor_name]}.response", datum[:response]) do
+ @stack.response_call(datum)
+ end
+ else
+ @stack.response_call(datum)
end
- @stack.response_call(datum)
end
end
end
diff --git a/lib/excon/middlewares/redirect_follower.rb b/lib/excon/middlewares/redirect_follower.rb
index 9552a08..689e0e8 100644
--- a/lib/excon/middlewares/redirect_follower.rb
+++ b/lib/excon/middlewares/redirect_follower.rb
@@ -1,14 +1,21 @@
module Excon
module Middleware
class RedirectFollower < Excon::Middleware::Base
+
+ def get_header(datum, header)
+ _, header_value = datum[:response][:headers].detect do |key, value|
+ key.casecmp(header) == 0
+ end
+ header_value
+ end
+
def response_call(datum)
if datum.has_key?(:response)
case datum[:response][:status]
when 301, 302, 303, 307, 308
uri_parser = datum[:uri_parser] || Excon.defaults[:uri_parser]
- _, location = datum[:response][:headers].detect do |key, value|
- key.casecmp('Location') == 0
- end
+
+ location = get_header(datum, 'Location')
uri = uri_parser.parse(location)
# delete old/redirect response
diff --git a/lib/excon/response.rb b/lib/excon/response.rb
index 98651e7..556aeb7 100644
--- a/lib/excon/response.rb
+++ b/lib/excon/response.rb
@@ -16,11 +16,20 @@ module Excon
def headers
@data[:headers]
end
- def status=(new_status)
- @data[:status] = new_status
+ def host
+ @data[:host]
end
- def status
- @data[:status]
+ def local_address
+ @data[:local_address]
+ end
+ def local_port
+ @data[:local_port]
+ end
+ def path
+ @data[:path]
+ end
+ def port
+ @data[:port]
end
def reason_phrase=(new_reason_phrase)
@data[:reason_phrase] = new_reason_phrase
@@ -34,11 +43,17 @@ module Excon
def remote_ip
@data[:remote_ip]
end
- def local_port
- @data[:local_port]
+ def status=(new_status)
+ @data[:status] = new_status
end
- def local_address
- @data[:local_address]
+ def status
+ @data[:status]
+ end
+ def status_line
+ @data[:status_line]
+ end
+ def status_line=(new_status_line)
+ @data[:status_line] = new_status_line
end
def self.parse(socket, datum)
@@ -51,8 +66,13 @@ module Excon
datum[:response] = {
:body => '',
+ :cookies => [],
+ :host => datum[:host],
:headers => Excon::Headers.new,
+ :path => datum[:path],
+ :port => datum[:port],
:status => status,
+ :status_line => line,
:reason_phrase => reason_phrase
}
@@ -93,25 +113,27 @@ module Excon
if response_block
while (chunk_size = socket.readline.chomp!.to_i(16)) > 0
while chunk_size > 0
- chunk = socket.read(chunk_size)
+ chunk = socket.read(chunk_size) || raise(EOFError)
chunk_size -= chunk.bytesize
response_block.call(chunk, nil, nil)
end
new_line_size = 2 # 2 == "\r\n".length
while new_line_size > 0
- new_line_size -= socket.read(new_line_size).length
+ chunk = socket.read(new_line_size) || raise(EOFError)
+ new_line_size -= chunk.length
end
end
else
while (chunk_size = socket.readline.chomp!.to_i(16)) > 0
while chunk_size > 0
- chunk = socket.read(chunk_size)
+ chunk = socket.read(chunk_size) || raise(EOFError)
chunk_size -= chunk.bytesize
datum[:response][:body] << chunk
end
new_line_size = 2 # 2 == "\r\n".length
while new_line_size > 0
- new_line_size -= socket.read(new_line_size).length
+ chunk = socket.read(new_line_size) || raise(EOFError)
+ new_line_size -= chunk.length
end
end
end
@@ -124,13 +146,13 @@ module Excon
if remaining = content_length
if response_block
while remaining > 0
- chunk = socket.read([datum[:chunk_size], remaining].min)
+ chunk = socket.read([datum[:chunk_size], remaining].min) || raise(EOFError)
response_block.call(chunk, [remaining - chunk.bytesize, 0].max, content_length)
remaining -= chunk.bytesize
end
else
while remaining > 0
- chunk = socket.read([datum[:chunk_size], remaining].min)
+ chunk = socket.read([datum[:chunk_size], remaining].min) || raise(EOFError)
datum[:response][:body] << chunk
remaining -= chunk.bytesize
end
@@ -153,7 +175,7 @@ module Excon
def self.parse_headers(socket, datum)
last_key = nil
- until (data = socket.readline.chomp!).empty?
+ until (data = socket.readline.chomp).empty?
if !data.lstrip!.nil?
raise Excon::Errors::ResponseParseError, 'malformed header' unless last_key
# append to last_key's last value
@@ -163,6 +185,9 @@ module Excon
raise Excon::Errors::ResponseParseError, 'malformed header' unless value
# add key/value or append value to existing values
datum[:response][:headers][key] = ([datum[:response][:headers][key]] << value.strip).compact.join(', ')
+ if key.casecmp('Set-Cookie') == 0
+ datum[:response][:cookies] << value.strip
+ end
last_key = key
end
end
diff --git a/lib/excon/socket.rb b/lib/excon/socket.rb
index 6f13015..87af2da 100644
--- a/lib/excon/socket.rb
+++ b/lib/excon/socket.rb
@@ -44,19 +44,11 @@ module Excon
begin
buffer << @socket.read_nonblock(1) while buffer[-1] != "\n"
buffer
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
- if timeout_reached('read')
- raise_timeout_error('read')
- else
- retry
- end
- rescue OpenSSL::SSL::SSLError => e
- if e.message == 'read would block'
- if timeout_reached('read')
- raise_timeout_error('read')
- else
- retry
- end
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
+ select_with_timeout(@socket, :read) && retry
+ rescue OpenSSL::SSL::SSLError => error
+ if error.message == 'read would block'
+ select_with_timeout(@socket, :read) && retry
else
raise(error)
end
@@ -64,12 +56,12 @@ module Excon
end
def legacy_readline
- begin
+ begin
Timeout.timeout(@data[:read_timeout]) do
@socket.readline
- end
+ end
rescue Timeout::Error
- raise Excon::Errors::Timeout.new('read timeout reached')
+ raise Excon::Errors::Timeout.new('read timeout reached')
end
end
@@ -135,9 +127,7 @@ module Excon
end
@socket = socket
rescue Errno::EINPROGRESS
- unless IO.select(nil, [socket], nil, @data[:connect_timeout])
- raise(Excon::Errors::Timeout.new('connect timeout reached'))
- end
+ select_with_timeout(socket, :connect_write)
begin
socket.connect_nonblock(sockaddr)
@socket = socket
@@ -163,37 +153,29 @@ module Excon
def read_nonblock(max_length)
begin
- if max_length
- until @read_buffer.length >= max_length
- @read_buffer << @socket.read_nonblock(max_length - @read_buffer.length)
- end
- else
- loop do
- @read_buffer << @socket.read_nonblock(@data[:chunk_size])
- end
- end
- rescue OpenSSL::SSL::SSLError => error
- if error.message == 'read would block'
- if timeout_reached('read')
- raise_timeout_error('read')
- else
- retry
- end
- else
- raise(error)
- end
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
- if @read_buffer.empty?
- # if we didn't read anything, try again...
- if timeout_reached('read')
- raise_timeout_error('read')
- else
- retry
- end
- end
- rescue EOFError
- @eof = true
+ if max_length
+ until @read_buffer.length >= max_length
+ @read_buffer << @socket.read_nonblock(max_length - @read_buffer.length)
+ end
+ else
+ loop do
+ @read_buffer << @socket.read_nonblock(@data[:chunk_size])
end
+ end
+ rescue OpenSSL::SSL::SSLError => error
+ if error.message == 'read would block'
+ select_with_timeout(@socket, :read) && retry
+ else
+ raise(error)
+ end
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
+ if @read_buffer.empty?
+ # if we didn't read anything, try again...
+ select_with_timeout(@socket, :read) && retry
+ end
+ rescue EOFError
+ @eof = true
+ end
if max_length
if @read_buffer.empty?
@@ -211,21 +193,13 @@ module Excon
@socket.read(max_length)
rescue OpenSSL::SSL::SSLError => error
if error.message == 'read would block'
- if timeout_reached('read')
- raise_timeout_error('read')
- else
- retry
- end
+ select_with_timeout(@socket, :read) && retry
else
raise(error)
end
rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
if @read_buffer.empty?
- if timeout_reached('read')
- raise_timeout_error('read')
- else
- retry
- end
+ select_with_timeout(@socket, :read) && retry
end
rescue EOFError
@eof = true
@@ -234,15 +208,15 @@ module Excon
def write_nonblock(data)
if FORCE_ENC
data.force_encoding('BINARY')
- end
+ end
loop do
written = nil
begin
# I wish that this API accepted a start position, then we wouldn't
# have to slice data when there is a short write.
written = @socket.write_nonblock(data)
- rescue Errno::EFAULT
- if OpenSSL::OPENSSL_LIBRARY_VERSION.split(' ')[1] == '1.0.2'
+ rescue Errno::EFAULT => error
+ if OpenSSL.const_defined?(:OPENSSL_LIBRARY_VERSION) && OpenSSL::OPENSSL_LIBRARY_VERSION.split(' ')[1] == '1.0.2'
msg = "The version of OpenSSL this ruby is built against (1.0.2) has a vulnerability
which causes a fault. For more, see https://github.com/excon/excon/issues/467"
raise SecurityError.new(msg)
@@ -253,11 +227,7 @@ module Excon
if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
raise error
else
- if timeout_reached('write')
- raise_timeout_error('write')
- else
- retry
- end
+ select_with_timeout(@socket, :write) && retry
end
end
@@ -278,25 +248,22 @@ module Excon
if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
raise error
else
- if timeout_reached('write')
- raise_timeout_error('write')
- else
- retry
- end
+ select_with_timeout(@socket, :write) && retry
end
end
- def timeout_reached(type)
- if type == 'read'
- args = [[@socket], nil, nil, @data[:read_timeout]]
- else
- args = [nil, [@socket], nil, @data[:write_timeout]]
+ def select_with_timeout(socket, type)
+ select = case type
+ when :connect_read
+ IO.select([socket], nil, nil, @data[:connect_timeout])
+ when :connect_write
+ IO.select(nil, [socket], nil, @data[:connect_timeout])
+ when :read
+ IO.select([socket], nil, nil, @data[:read_timeout])
+ when :write
+ IO.select(nil, [socket], nil, @data[:write_timeout])
end
- IO.select(*args) ? nil : true
- end
-
- def raise_timeout_error(type)
- fail Excon::Errors::Timeout.new("#{type} timeout reached")
+ select || raise(Excon::Errors::Timeout.new("#{type} timeout reached"))
end
def unpacked_sockaddr
diff --git a/lib/excon/ssl_socket.rb b/lib/excon/ssl_socket.rb
index 7c57373..e652bc9 100644
--- a/lib/excon/ssl_socket.rb
+++ b/lib/excon/ssl_socket.rb
@@ -118,16 +118,15 @@ module Excon
if @nonblock
begin
@socket.connect_nonblock
- rescue IO::WaitReadable
- IO.select([@socket])
- retry
+ rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
+ select_with_timeout(@socket, :connect_read) && retry
+ rescue IO::WaitWritable
+ select_with_timeout(@socket, :connect_write) && retry
end
else
@socket.connect
end
- rescue OpenSSL::SSL::SSLError
- raise
- rescue
+ rescue Errno::ETIMEDOUT, Timeout::Error
raise Excon::Errors::Timeout.new('connect timeout reached')
end
diff --git a/lib/excon/utils.rb b/lib/excon/utils.rb
index e345977..07e0598 100644
--- a/lib/excon/utils.rb
+++ b/lib/excon/utils.rb
@@ -40,11 +40,12 @@ module Excon
when Hash
str << '?'
datum[:query].sort_by {|k,_| k.to_s }.each do |key, values|
+ key = CGI.escape(key.to_s)
if values.nil?
- str << key.to_s << '&'
+ str << key << '&'
else
[values].flatten.each do |value|
- str << key.to_s << '=' << CGI.escape(value.to_s) << '&'
+ str << key << '=' << CGI.escape(value.to_s) << '&'
end
end
end
diff --git a/metadata.yml b/metadata.yml
deleted file mode 100644
index 3057426..0000000
--- a/metadata.yml
+++ /dev/null
@@ -1,272 +0,0 @@
---- !ruby/object:Gem::Specification
-name: excon
-version: !ruby/object:Gem::Version
- version: 0.45.1
-platform: ruby
-authors:
-- dpiddy (Dan Peterson)
-- geemus (Wesley Beary)
-- nextmat (Matt Sanders)
-autorequire:
-bindir: bin
-cert_chain: []
-date: 2015-03-27 00:00:00.000000000 Z
-dependencies:
-- !ruby/object:Gem::Dependency
- name: activesupport
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: delorean
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: eventmachine
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 1.0.4
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 1.0.4
-- !ruby/object:Gem::Dependency
- name: open4
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: rake
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: rdoc
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: shindo
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: sinatra
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-- !ruby/object:Gem::Dependency
- name: json
- requirement: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 1.8.2
- type: :development
- prerelease: false
- version_requirements: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: 1.8.2
-description: EXtended http(s) CONnections
-email: geemus at gmail.com
-executables: []
-extensions: []
-extra_rdoc_files:
-- README.md
-files:
-- CONTRIBUTING.md
-- CONTRIBUTORS.md
-- Gemfile
-- Gemfile.lock
-- LICENSE.md
-- README.md
-- Rakefile
-- benchmarks/class_vs_lambda.rb
-- benchmarks/concat_vs_insert.rb
-- benchmarks/concat_vs_interpolate.rb
-- benchmarks/cr_lf.rb
-- benchmarks/downcase-eq-eq_vs_casecmp.rb
-- benchmarks/excon.rb
-- benchmarks/excon_vs.rb
-- benchmarks/for_vs_array_each.rb
-- benchmarks/for_vs_hash_each.rb
-- benchmarks/has_key-vs-lookup.rb
-- benchmarks/headers_case_sensitivity.rb
-- benchmarks/headers_split_vs_match.rb
-- benchmarks/implicit_block-vs-explicit_block.rb
-- benchmarks/merging.rb
-- benchmarks/single_vs_double_quotes.rb
-- benchmarks/string_ranged_index.rb
-- benchmarks/strip_newline.rb
-- benchmarks/vs_stdlib.rb
-- changelog.txt
-- data/cacert.pem
-- excon.gemspec
-- lib/excon.rb
-- lib/excon/connection.rb
-- lib/excon/constants.rb
-- lib/excon/errors.rb
-- lib/excon/extensions/uri.rb
-- lib/excon/headers.rb
-- lib/excon/middlewares/base.rb
-- lib/excon/middlewares/decompress.rb
-- lib/excon/middlewares/escape_path.rb
-- lib/excon/middlewares/expects.rb
-- lib/excon/middlewares/idempotent.rb
-- lib/excon/middlewares/instrumentor.rb
-- lib/excon/middlewares/mock.rb
-- lib/excon/middlewares/redirect_follower.rb
-- lib/excon/middlewares/response_parser.rb
-- lib/excon/pretty_printer.rb
-- lib/excon/response.rb
-- lib/excon/socket.rb
-- lib/excon/ssl_socket.rb
-- lib/excon/standard_instrumentor.rb
-- lib/excon/unix_socket.rb
-- lib/excon/utils.rb
-- tests/authorization_header_tests.rb
-- tests/bad_tests.rb
-- tests/basic_tests.rb
-- tests/data/127.0.0.1.cert.crt
-- tests/data/127.0.0.1.cert.key
-- tests/data/excon.cert.crt
-- tests/data/excon.cert.key
-- tests/data/xs
-- tests/errors_tests.rb
-- tests/header_tests.rb
-- tests/middlewares/canned_response_tests.rb
-- tests/middlewares/decompress_tests.rb
-- tests/middlewares/escape_path_tests.rb
-- tests/middlewares/idempotent_tests.rb
-- tests/middlewares/instrumentation_tests.rb
-- tests/middlewares/mock_tests.rb
-- tests/middlewares/redirect_follower_tests.rb
-- tests/pipeline_tests.rb
-- tests/proxy_tests.rb
-- tests/query_string_tests.rb
-- tests/rackups/basic.rb
-- tests/rackups/basic.ru
-- tests/rackups/basic_auth.ru
-- tests/rackups/deflater.ru
-- tests/rackups/proxy.ru
-- tests/rackups/query_string.ru
-- tests/rackups/redirecting.ru
-- tests/rackups/request_headers.ru
-- tests/rackups/request_methods.ru
-- tests/rackups/response_header.ru
-- tests/rackups/ssl.ru
-- tests/rackups/ssl_mismatched_cn.ru
-- tests/rackups/ssl_verify_peer.ru
-- tests/rackups/streaming.ru
-- tests/rackups/thread_safety.ru
-- tests/rackups/timeout.ru
-- tests/rackups/webrick_patch.rb
-- tests/request_headers_tests.rb
-- tests/request_method_tests.rb
-- tests/request_tests.rb
-- tests/response_tests.rb
-- tests/servers/bad.rb
-- tests/servers/eof.rb
-- tests/servers/error.rb
-- tests/servers/good.rb
-- tests/test_helper.rb
-- tests/thread_safety_tests.rb
-- tests/timeout_tests.rb
-- tests/utils_tests.rb
-homepage: https://github.com/excon/excon
-licenses:
-- MIT
-metadata: {}
-post_install_message:
-rdoc_options:
-- "--charset=UTF-8"
-require_paths:
-- lib
-required_ruby_version: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-required_rubygems_version: !ruby/object:Gem::Requirement
- requirements:
- - - ">="
- - !ruby/object:Gem::Version
- version: '0'
-requirements: []
-rubyforge_project: excon
-rubygems_version: 2.2.2
-signing_key:
-specification_version: 2
-summary: speed, persistence, http(s)
-test_files: []
diff --git a/tests/basic_tests.rb b/tests/basic_tests.rb
index 9c05ae1..1b1fe8a 100644
--- a/tests/basic_tests.rb
+++ b/tests/basic_tests.rb
@@ -1,3 +1,5 @@
+require 'json'
+
Shindo.tests('Excon basics') do
with_rackup('basic.ru') do
basic_tests
@@ -94,7 +96,7 @@ Shindo.tests('Excon basics (Basic Auth Pass)') do
connection = Excon.new(uri, :user => user, :password => pass )
response = connection.request(:method => :get, :path => '/content-length/100')
response.status
- end
+ end
end
end
@@ -246,6 +248,19 @@ Shindo.tests('Excon basics (Unix socket)') do
response[:status]
end
end
+
+ tests('http Host header is empty') do
+ tests('GET /headers').returns("") do
+ connection = Excon::Connection.new({
+ :socket => file_name,
+ :nonblock => false,
+ :scheme => 'unix',
+ :ssl_verify_peer => false
+ })
+ response = connection.request(:method => :get, :path => '/headers')
+ JSON.parse(response.body)['HTTP_HOST']
+ end
+ end
end
end
@@ -285,7 +300,7 @@ Shindo.tests('Excon basics (reusable local port)') do
end
end
- with_rackup('basic.ru') do
+ with_rackup('basic.ru', '0.0.0.0') do
connection = Excon.new("http://127.0.0.1:9292/echo",
:reuseaddr => true, # enable address and port reuse
:persistent => true # keep the socket open
diff --git a/tests/complete_responses.rb b/tests/complete_responses.rb
new file mode 100644
index 0000000..1dc79f7
--- /dev/null
+++ b/tests/complete_responses.rb
@@ -0,0 +1,31 @@
+Shindo.tests('Excon Response Validation') do
+ env_init
+
+ with_server('good') do
+ tests('good responses with complete headers') do
+ 100.times do
+ res = Excon.get('http://127.0.0.1:9292/chunked/simple')
+ returns(true) { res.body == "hello world" }
+ returns(true) { res.status_line == "HTTP/1.1 200 OK\r\n" }
+ returns(true) { res.status == 200}
+ returns(true) { res.reason_phrase == "OK" }
+ returns(true) { res.remote_ip == "127.0.0.1" }
+ end
+ end
+ end
+
+ with_server('error') do
+ tests('error responses with complete headers') do
+ 100.times do
+ res = Excon.get('http://127.0.0.1:9292/error/not_found')
+ returns(true) { res.body == "server says not found" }
+ returns(true) { res.status_line == "HTTP/1.1 404 Not Found\r\n" }
+ returns(true) { res.status == 404}
+ returns(true) { res.reason_phrase == "Not Found" }
+ returns(true) { res.remote_ip == "127.0.0.1" }
+ end
+ end
+ end
+
+ env_restore
+end
diff --git a/tests/middlewares/capture_cookies_tests.rb b/tests/middlewares/capture_cookies_tests.rb
new file mode 100644
index 0000000..0e681ce
--- /dev/null
+++ b/tests/middlewares/capture_cookies_tests.rb
@@ -0,0 +1,34 @@
+Shindo.tests("Excon redirecting with cookie preserved") do
+ env_init
+
+ with_rackup('redirecting_with_cookie.ru') do
+ tests('second request will send cookies set by the first').returns('ok') do
+ Excon.get(
+ 'http://127.0.0.1:9292',
+ :path => '/sets_cookie',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::CaptureCookies, Excon::Middleware::RedirectFollower]
+ ).body
+ end
+
+ tests('second request will send multiple cookies set by the first').returns('ok') do
+ Excon.get(
+ 'http://127.0.0.1:9292',
+ :path => '/sets_multi_cookie',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::CaptureCookies, Excon::Middleware::RedirectFollower]
+ ).body
+ end
+ end
+
+ with_rackup('redirecting.ru') do
+ tests("runs normally when there are no cookies set").returns('ok') do
+ Excon.post(
+ 'http://127.0.0.1:9292',
+ :path => '/first',
+ :middlewares => Excon.defaults[:middlewares] + [Excon::Middleware::CaptureCookies, Excon::Middleware::RedirectFollower],
+ :body => "a=Some_content"
+ ).body
+ end
+ end
+
+ env_restore
+end
diff --git a/tests/middlewares/decompress_tests.rb b/tests/middlewares/decompress_tests.rb
index f4a885f..aebba34 100644
--- a/tests/middlewares/decompress_tests.rb
+++ b/tests/middlewares/decompress_tests.rb
@@ -29,6 +29,11 @@ Shindo.tests('Excon Decompress Middleware') do
tests('removes processed encoding from header').returns('') do
resp[:headers]['Content-Encoding']
end
+
+ tests('empty response body').returns('') do
+ resp = @connection.request(:body => '')
+ resp[:body]
+ end
end
tests('deflate') do
diff --git a/tests/middlewares/instrumentation_tests.rb b/tests/middlewares/instrumentation_tests.rb
index d225ec1..43e05ec 100644
--- a/tests/middlewares/instrumentation_tests.rb
+++ b/tests/middlewares/instrumentation_tests.rb
@@ -3,13 +3,19 @@ require 'securerandom'
class SimpleInstrumentor
class << self
- attr_accessor :events
+ attr_accessor :events, :blocks
def instrument(name, params = {}, &block)
- @events ||= []
@events << name
+ @blocks << name if block_given?
+
yield if block_given?
end
+
+ def reset!
+ @events = []
+ @blocks = []
+ end
end
end
@@ -26,6 +32,10 @@ Shindo.tests('Excon instrumentation') do
Excon.stubs.clear
end
+ before do
+ SimpleInstrumentor.reset!
+ end
+
def subscribe(match)
@events = []
ActiveSupport::Notifications.subscribe(match) do |*args|
@@ -238,6 +248,19 @@ Shindo.tests('Excon instrumentation') do
SimpleInstrumentor.events
end
+ tests('always passes the block').returns(
+ ['excon.request', 'excon.response']) do
+ stub_success
+ connection = Excon.new(
+ 'http://127.0.0.1:9292',
+ :instrumentor => SimpleInstrumentor,
+ :mock => true
+ )
+ connection.get(:idempotent => true)
+
+ SimpleInstrumentor.blocks
+ end
+
tests('does not generate events when not provided').returns(0) do
subscribe(/excon/)
stub_success
diff --git a/tests/middlewares/mock_tests.rb b/tests/middlewares/mock_tests.rb
index a7057c2..62ba771 100644
--- a/tests/middlewares/mock_tests.rb
+++ b/tests/middlewares/mock_tests.rb
@@ -252,5 +252,42 @@ Shindo.tests('Excon stubs') do
Excon.stubs.clear
end
+ tests("global stubs") do
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {:body => '1'})
+ t = Thread.new do
+ Excon.stub({}, {:body => '2'})
+ connection.request(:method => :get).body
+ end
+ tests("get on a different thread").returns('2') do
+ t.join.value
+ end
+ tests("get on main thread").returns('2') do
+ connection.request(:method => :get).body
+ end
+ Excon.stubs.clear
+ end
+
+ tests("thread-local stubs") do
+ original_stubs_value = Excon.defaults[:stubs]
+ Excon.defaults[:stubs] = :local
+
+ connection = Excon.new('http://127.0.0.1:9292', :mock => true)
+ Excon.stub({}, {:body => '1'})
+ t = Thread.new do
+ Excon.stub({}, {:body => '2'})
+ connection.request(:method => :get).body
+ end
+ tests("get on a different thread").returns('2') do
+ t.join.value
+ end
+ tests("get on main thread").returns('1') do
+ connection.request(:method => :get).body
+ end
+ Excon.stubs.clear
+
+ Excon.defaults[:stubs] = original_stubs_value
+ end
+
env_restore
end
diff --git a/tests/proxy_tests.rb b/tests/proxy_tests.rb
index f5d1f2a..b1a5e2f 100644
--- a/tests/proxy_tests.rb
+++ b/tests/proxy_tests.rb
@@ -10,6 +10,13 @@ Shindo.tests('Excon proxy support') do
end
end
+ tests('empty proxy') do
+ tests('connection.data[:proxy]').returns(nil) do
+ connection = Excon.new('http://foo.com', :proxy => '')
+ connection.data[:proxy]
+ end
+ end
+
tests('with fully-specified proxy: https://myproxy.net:8080') do
connection = nil
diff --git a/tests/query_string_tests.rb b/tests/query_string_tests.rb
index d4ec378..0304250 100644
--- a/tests/query_string_tests.rb
+++ b/tests/query_string_tests.rb
@@ -1,57 +1,86 @@
Shindo.tests('Excon query string variants') do
with_rackup('query_string.ru') do
- connection = nil
+ connection = Excon.new('http://127.0.0.1:9292')
tests(":query => {:foo => 'bar'}") do
- tests("query string sent").returns('foo=bar') do
- connection = Excon.new('http://127.0.0.1:9292')
-
- response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar'})
- query_string = response.body[7..-1] # query string sent
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar'})
+ query_string = response.body[7..-1] # query string sent
+ tests("query string sent").returns('foo=bar') do
query_string
end
end
tests(":query => {:foo => nil}") do
- tests("query string sent").returns('foo') do
- response = connection.request(:method => :get, :path => '/query', :query => {:foo => nil})
- query_string = response.body[7..-1] # query string sent
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => nil})
+ query_string = response.body[7..-1] # query string sent
+ tests("query string sent").returns('foo') do
query_string
end
end
tests(":query => {:foo => 'bar', :me => nil}") do
- query_string = nil
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar', :me => nil})
+ query_string = response.body[7..-1] # query string sent
test("query string sent includes 'foo=bar'") do
- response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar', :me => nil})
- query_string = response.body[7..-1] # query string sent
-
query_string.split('&').include?('foo=bar')
end
test("query string sent includes 'me'") do
query_string.split('&').include?('me')
end
-
end
tests(":query => {:foo => 'bar', :me => 'too'}") do
- query_string = nil
+ response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar', :me => 'too'})
+ query_string = response.body[7..-1] # query string sent
test("query string sent includes 'foo=bar'") do
- response = connection.request(:method => :get, :path => '/query', :query => {:foo => 'bar', :me => 'too'})
- query_string = response.body[7..-1] # query string sent
-
query_string.split('&').include?('foo=bar')
end
test("query string sent includes 'me=too'") do
query_string.split('&').include?('me=too')
end
+ end
+
+ # You can use an atom or a string for the hash keys, what is shown here is emulating
+ # the Rails and PHP style of serializing a query array with a square brackets suffix.
+ tests(":query => {'foo[]' => ['bar', 'baz'], :me => 'too'}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {'foo[]' => ['bar', 'baz'], :me => 'too'})
+ query_string = response.body[7..-1] # query string sent
+
+ test("query string sent includes 'foo%5B%5D=bar'") do
+ query_string.split('&').include?('foo%5B%5D=bar')
+ end
+
+ test("query string sent includes 'foo%5B%5D=baz'") do
+ query_string.split('&').include?('foo%5B%5D=baz')
+ end
+ test("query string sent includes 'me=too'") do
+ query_string.split('&').include?('me=too')
+ end
+ end
+
+ tests(":query => {'foo%=#' => 'bar%=#'}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {'foo%=#' => 'bar%=#'})
+ query_string = response.body[7..-1] # query string sent
+
+ tests("query string sent").returns('foo%25%3D%23=bar%25%3D%23') do
+ query_string
+ end
+ end
+
+ tests(":query => {'foo%=#' => nil}") do
+ response = connection.request(:method => :get, :path => '/query', :query => {'foo%=#' => nil})
+ query_string = response.body[7..-1] # query string sent
+
+ tests("query string sent").returns('foo%25%3D%23') do
+ query_string
+ end
end
end
diff --git a/tests/rackups/basic.rb b/tests/rackups/basic.rb
index e04375c..0bddd9a 100644
--- a/tests/rackups/basic.rb
+++ b/tests/rackups/basic.rb
@@ -1,4 +1,5 @@
require 'sinatra'
+require 'json'
require File.join(File.dirname(__FILE__), 'webrick_patch')
class Basic < Sinatra::Base
@@ -10,6 +11,11 @@ class Basic < Sinatra::Base
'x' * value.to_i
end
+ get('/headers') do
+ content_type :json
+ request.env.select{|key, _| key.start_with? 'HTTP_'}.to_json
+ end
+
post('/body-sink') do
request.body.read.size.to_s
end
diff --git a/tests/rackups/redirecting_with_cookie.ru b/tests/rackups/redirecting_with_cookie.ru
new file mode 100644
index 0000000..f0401f8
--- /dev/null
+++ b/tests/rackups/redirecting_with_cookie.ru
@@ -0,0 +1,40 @@
+require 'sinatra'
+require 'sinatra/cookies'
+require 'json'
+require File.join(File.dirname(__FILE__), 'webrick_patch')
+
+class App < Sinatra::Base
+ helpers Sinatra::Cookies
+ set :environment, :production
+ enable :dump_errors
+
+ get('/sets_cookie') do
+ cookies[:chocolatechip] = "chunky"
+ redirect "/requires_cookie"
+ end
+
+ get('/requires_cookie') do
+ cookie = cookies[:chocolatechip]
+ unless cookie.nil? || cookie != "chunky"
+ "ok"
+ else
+ JSON.pretty_generate(headers)
+ end
+ end
+
+ get('/sets_multi_cookie') do
+ cookies[:chocolatechip] = "chunky"
+ cookies[:thinmints] = "minty"
+ redirect "/requires_cookie"
+ end
+
+ get('/requires_cookie') do
+ if cookies[:chocolatechip] == "chunky" && cookies[:thinmints] == "minty"
+ "ok"
+ else
+ JSON.pretty_generate(headers)
+ end
+ end
+end
+
+run App
diff --git a/tests/response_tests.rb b/tests/response_tests.rb
index e5fd518..2a989dd 100644
--- a/tests/response_tests.rb
+++ b/tests/response_tests.rb
@@ -151,6 +151,15 @@ Shindo.tests('Excon Response Parsing') do
end
+ tests('cookies') do
+
+ tests('parses cookies into array').returns(['one, two', 'three, four']) do
+ resp = Excon.get('http://127.0.0.1:9292/unknown/cookies')
+ resp[:cookies]
+ end
+
+ end
+
tests('header continuation') do
tests('proper continuation').returns('one, two, three, four, five, six') do
diff --git a/tests/servers/good.rb b/tests/servers/good.rb
index 73d29dd..1cb6d7f 100755
--- a/tests/servers/good.rb
+++ b/tests/servers/good.rb
@@ -55,9 +55,14 @@ module GoodServer
case encoding
when 'gzip'
- io = (Zlib::GzipWriter.new(StringIO.new) << request[:body]).finish
- io.rewind
- body = io.read
+ body = request[:body]
+ if(body.nil? || body.empty?)
+ body = ''
+ else
+ io = (Zlib::GzipWriter.new(StringIO.new) << request[:body]).finish
+ io.rewind
+ body = io.read
+ end
when 'deflate'
# drops the zlib header
deflator = Zlib::Deflate.new(nil, -Zlib::MAX_WBITS)
@@ -134,6 +139,13 @@ module GoodServer
when 'unknown'
case path
+ when 'cookies'
+ start_response(:persistent => false)
+ send_data "Set-Cookie: one, two\r\n"
+ send_data "Set-Cookie: three, four\r\n"
+ send_data "\r\n"
+ send_data "hello world"
+
when 'simple'
start_response(:persistent => false)
send_data "\r\n"
diff --git a/tests/test_helper.rb b/tests/test_helper.rb
index 028f143..726e69e 100644
--- a/tests/test_helper.rb
+++ b/tests/test_helper.rb
@@ -231,12 +231,12 @@ def rackup_path(*parts)
File.expand_path(File.join(File.dirname(__FILE__), 'rackups', *parts))
end
-def with_rackup(name)
+def with_rackup(name, host="127.0.0.1")
unless RUBY_PLATFORM == 'java'
GC.disable if RUBY_VERSION < '1.9'
- pid, w, r, e = Open4.popen4("rackup", rackup_path(name))
+ pid, w, r, e = Open4.popen4("rackup", "--host", host, rackup_path(name))
else
- pid, w, r, e = IO.popen4("rackup", rackup_path(name))
+ pid, w, r, e = IO.popen4("rackup", "--host", host, rackup_path(name))
end
until e.gets =~ /HTTPServer#start:/; end
yield
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-excon.git
More information about the Pkg-ruby-extras-commits
mailing list