[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