puma (6.6.0-4) unstable; urgency=medium
authorAthos Ribeiro <athos@debian.org>
Thu, 17 Jul 2025 10:20:19 +0000 (07:20 -0300)
committerAthos Ribeiro <athos@debian.org>
Thu, 17 Jul 2025 10:20:19 +0000 (07:20 -0300)
  * Team upload.
  * Do not generate example certificates in build time to avoid build
    depending on Java
  * d/p/0019-adapt-test-certs-generation.patch: adjust example certificates
    generation script
  * d/p/0020-update-ex-certs.patch: update example certificates to avoid a
    regression for #1078640
  * debian/README.source: document test certificates generation

[dgit import unpatched puma 6.6.0-4]

32 files changed:
1  2 
debian/README.source
debian/changelog
debian/clean
debian/control
debian/copyright
debian/gbp.conf
debian/patches/0004-puma.gemspec-drop-git-usage.patch
debian/patches/0010-Disable-test-concurrency-without-concurrent_ruby.patch
debian/patches/0011-disable-minitest-extensions.patch
debian/patches/0012-disable-cli-ssl-tests.patch
debian/patches/0013-fix-test-term-not-accepts-new-connections.patch
debian/patches/0014-disable-test-failing-on-amd64.patch
debian/patches/0015-disable-different-output-test.patch
debian/patches/0016-disable-test-failing-on-arm64.patch
debian/patches/0017-disable-test-failing-on-armhf.patch
debian/patches/0018-disable-test-failing-with-ruby3.2.patch
debian/patches/0019-adapt-test-certs-generation.patch
debian/patches/0020-update-ex-certs.patch
debian/patches/series
debian/puma.1
debian/puma.docs
debian/puma.examples
debian/puma.lintian-overrides
debian/puma.manpages
debian/pumactl.1
debian/ruby-tests.rake
debian/rules
debian/salsa-ci.yml
debian/source/format
debian/source/lintian-overrides
debian/upstream/metadata
debian/watch

index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7622ecc902fe67f7a5ecf5a2eb5eeeceacb4ff3d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,31 @@@
++puma (6.6.0-4)
++
++  Added the capability to re-generate test certificates in the examples
++  directory. This should require installing
++  - default-jre, and
++  - ruby-certificate-authority
++  which are currently not listed as dependencies of this package. You can also
++  use faketime to run the upstream tests in a future date to test if the
++  certificates will be valid throughout the Debian release support cycle.
++
++  Note that these certificates are not being re-generated during build time
++  because the examples/generate_all_certs script depends on the keytool binary
++  shipped in the JRE package (we do not want to build depend on Java just for
++  this). It should be possible to re-write the script to use the minijks
++  package instead (written in Go) so we can always generate these certificates
++  during package builds.
++
++puma (4.3.1-1)
++
++  Several tests have been disabled by default:
++
++  - test/test_puma_server_ssl.rb has been disabled because all tests fail
++    randomly. However these tests have never been performed in puma 3.x and
++    they also work randomly. So until someone can look into them and fix them,
++    we decided to not run them (see also #921931).
++
++  - test_control_for_ssl (test/test_cli.rb) and
++    test_control_ssl (test/test_pumactl.rb) show similar issues and don't seem
++    to imply that the package fails to work. So they have been disabled too.
++
++ -- Daniel Leidert <dleidert@debian.org>  Wed, 05 Feb 2020 23:51:51 +0100
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3342f03b054b521f15ef5f5191fd0368ddc41afc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,428 @@@
++puma (6.6.0-4) unstable; urgency=medium
++
++  * Team upload.
++  * Do not generate example certificates in build time to avoid build
++    depending on Java
++  * d/p/0019-adapt-test-certs-generation.patch: adjust example certificates
++    generation script
++  * d/p/0020-update-ex-certs.patch: update example certificates to avoid a
++    regression for #1078640
++  * debian/README.source: document test certificates generation
++
++ -- Athos Ribeiro <athos@debian.org>  Thu, 17 Jul 2025 07:20:19 -0300
++
++puma (6.6.0-3) unstable; urgency=medium
++
++  * Team upload.
++  * Freshly generate example certificates for test suite (Closes: #1078640)
++
++ -- Timo Röhling <roehling@debian.org>  Wed, 16 Jul 2025 21:51:16 +0200
++
++puma (6.6.0-2) unstable; urgency=medium
++
++  * Team upload
++  * Change build-dependency on ruby-rackup to
++    ruby-rackup | ruby-rack (<< 3), to allow migration to testing
++    independently of rackup or rack 3.
++
++ -- Lucas Nussbaum <lucas@debian.org>  Fri, 07 Feb 2025 21:46:17 +0100
++
++puma (6.6.0-1) unstable; urgency=medium
++
++  * Team upload
++  * New upstream version 6.5.0, with fixes for rack 3. Closes: #1094539
++  * Refresh patches for 6.5.0
++  * Drop patches (were upstream backports, so no longer needed):
++      + 0009-CI-update-chain-certs-example-files-3426.patch
++      + 0010-Update-all-certs.patch
++      + 0011-Fix-path-of-certs-useb-by-test_example_cert_expirati.patch
++      + 0014-Give-a-wide-berth-on-the-timeout-as-sometimes-CI-is-.patch
++      + 0018-update-certs-from-upstream.patch
++  * Refresh packaging using dh-make-ruby
++  * Add build-dep on rackup for Rack::Handler
++  * New upstream version 6.6.0
++  * Refresh patches again, for 6.6.0
++  * Add build-dep on ruby-concurrent
++  * Add patch: 0010-Disable-test-concurrency-without-concurrent_ruby.patch
++  * Drop unmatched lintian override
++
++ -- Lucas Nussbaum <lucas@debian.org>  Wed, 05 Feb 2025 14:56:49 +0100
++
++puma (6.4.3-3) unstable; urgency=medium
++
++  * d/p/0014-Give-a-wide-berth-on-the-timeout-as-sometimes-CI-is-.patch:
++    increase timeout to fix FTBFS with ruby 3.3.
++
++ -- Lucas Kanashiro <kanashiro@debian.org>  Wed, 22 Jan 2025 17:06:59 -0300
++
++puma (6.4.3-2) unstable; urgency=medium
++
++  * Team upload.
++  * d/p/0018-disable-test-failing-with-ruby3.2.patch: fix FTBFS
++
++ -- Lucas Kanashiro <kanashiro@debian.org>  Mon, 23 Dec 2024 19:07:19 -0300
++
++puma (6.4.3-1) unstable; urgency=medium
++
++  * Team upload.
++  * New upstream version. Fixes CVE-2024-45614 (Closes: #1082379)
++  * Remove custom ssl autopkgtest.
++    - https://lists.debian.org/debian-ruby/2024/11/msg00006.html
++  * Update certificates for tests.
++
++ -- Abhijith PA <abhijith@debian.org>  Mon, 30 Sep 2024 09:46:18 +0530
++
++puma (6.4.2-6) unstable; urgency=medium
++
++  * Fix FTBFS due to certs expiration (Closes: #1078640)
++    - d/p/0010-Update-all-certs.patch
++    - d/p/0011-Fix-path-of-certs-useb-by-test_example_cert_expirati.patch
++  * Declare compliance with Debian Policy 4.7.0.
++
++ -- Lucas Kanashiro <kanashiro@debian.org>  Thu, 19 Sep 2024 17:56:24 -0300
++
++puma (6.4.2-5) unstable; urgency=medium
++
++  * Backport upstream patch to update certificates in examples.
++    This fixes a test failure.
++
++ -- Lucas Kanashiro <kanashiro@debian.org>  Sat, 20 Jul 2024 12:24:05 -0300
++
++puma (6.4.2-4) unstable; urgency=medium
++
++  * Disable test failing on armhf
++
++ -- Pirate Praveen <praveen@debian.org>  Tue, 06 Feb 2024 18:13:41 +0530
++
++puma (6.4.2-3) unstable; urgency=medium
++
++  * Add Breaks: rails (<< 2:6.1.7.3+dfsg-3~)
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 15:12:00 +0530
++
++puma (6.4.2-2) unstable; urgency=medium
++
++  * Disable test failing on arm64 buildd
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 14:11:14 +0530
++
++puma (6.4.2-1) unstable; urgency=medium
++
++  * Switch to github tags from releases (6.4.2 is only available from tags)
++  * New upstream version 6.4.2 (Fixes: CVE-2024-21647)
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 01:08:22 +0530
++
++puma (6.4.0-4) unstable; urgency=medium
++
++  * Remove minitest/retry as well (copy from 5.x branch and fixes salsa ci)
++  * Export LC_ALL also to C.UTF-8 (hoping this would fix some test failures)
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 05 Feb 2024 00:52:13 +0530
++
++puma (6.4.0-3) unstable; urgency=medium
++
++  * Reupload to unstable
++
++ -- Pirate Praveen <praveen@debian.org>  Sun, 04 Feb 2024 01:16:15 +0530
++
++puma (6.4.0-2) experimental; urgency=medium
++
++  * Set TEST_CASE_TIMEOUT = 300 (one test is timing out on amd64 buildd)
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 04 Dec 2023 23:59:02 +0530
++
++puma (6.4.0-1) experimental; urgency=medium
++
++  * New upstream version 6.4.0
++  * Disable more tests and refresh patches
++  * Add procps to build depends for kill command (used in tests)
++
++ -- Pirate Praveen <praveen@debian.org>  Sun, 03 Dec 2023 13:58:23 +0530
++
++puma (6.0.2-1) experimental; urgency=medium
++
++  * Team upload.
++  * New upstream release.
++  * d/control (Standards-Version): Bump to 4.6.2.
++    (Build-Depends): Add ruby-sd-notify.
++  * d/copyright (Copyright): Update years.
++  * d/ruby-tests.rake: Re-enable multiple tests (closes: #984713).
++  * d/upstream/metadata: Adjust a few URLs.
++
++ -- Daniel Leidert <dleidert@debian.org>  Thu, 09 Feb 2023 16:12:20 +0100
++
++puma (5.6.5-2) unstable; urgency=medium
++
++  * debian/ruby-tests.rake: skip test that fails often (Closes: #1006022)
++  * debian/ruby-tests.rake: exclude tests that fail often but not always
++
++ -- Antonio Terceiro <terceiro@debian.org>  Wed, 02 Nov 2022 09:26:37 -0300
++
++puma (5.6.5-1) unstable; urgency=medium
++
++  * Update watch file for github.com pattern change
++  * New upstream version 5.6.5
++  * Refresh patches
++  * Bump Standards-Version to 4.6.1 (no changes needed)
++
++ -- Pirate Praveen <praveen@debian.org>  Sun, 16 Oct 2022 22:44:46 +0530
++
++puma (5.6.4-1) unstable; urgency=medium
++
++  * New upstream version 5.6.4
++  * Refresh patches
++  * Disable some tests that fail with
++     NameError: uninitialized constant Puma::LogWriter
++  * Remove tmp/restart.txt in clean
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 04 Apr 2022 13:24:10 +0530
++
++puma (5.5.2-2) unstable; urgency=medium
++
++  * Team upload
++  * debian/rules: force an UTF-8 locale
++  * debian/ruby-tests.rake: wrap lines
++  * debian/ruby-tests.rake: run all ssl tests on autopkgtest only
++  * debian/test/control: give ssl test a name
++
++ -- Antonio Terceiro <terceiro@debian.org>  Tue, 02 Nov 2021 16:35:12 -0300
++
++puma (5.5.2-1) unstable; urgency=medium
++
++  * Team upload
++  * New upstream version 5.5.2
++    - Builds and tests fine again (Closes: #998295)
++  * Add build-dependency on ruby-localhost
++  * debian/rules: exclude several unnecessary files from installation
++
++ -- Antonio Terceiro <terceiro@debian.org>  Tue, 02 Nov 2021 14:39:10 -0300
++
++puma (5.3.2-3) unstable; urgency=medium
++
++  * Use --gem-install layout option of dh-ruby
++
++ -- Pirate Praveen <praveen@debian.org>  Tue, 12 Oct 2021 02:24:33 +0530
++
++puma (5.3.2-2) unstable; urgency=medium
++
++  * Reupload to unstable
++  * Bump Standards-Version to 4.6.0 (no changes needed)
++  * Bump debhelper compatibility level to 13
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 11 Oct 2021 03:17:23 +0530
++
++puma (5.3.2-1) experimental; urgency=medium
++
++  * New upstream version 5.3.2 (Closes: #989054) (Fixes: CVE-2021-29509)
++  * Refresh patches
++
++ -- Pirate Praveen <praveen@debian.org>  Fri, 28 May 2021 22:34:53 +0530
++
++puma (4.3.8-1) unstable; urgency=medium
++
++  * New upstream version 4.3.8 (Closes: #989054) (Fixes: CVE-2021-29509)
++
++ -- Pirate Praveen <praveen@debian.org>  Wed, 26 May 2021 10:24:19 +0530
++
++puma (5.2.2-2) experimental; urgency=medium
++
++  * Disable test that failied on amd64 buildd
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 08 Mar 2021 23:03:52 +0530
++
++puma (5.2.2-1) experimental; urgency=medium
++
++  * New upstream version 5.2.2
++  * Bump Standards-Version to 4.5.1 (no changes needed)
++  * Refresh patches for new upstream release
++  * Add ruby-minitest-stub-const as build dependency
++  * Disable failing tests
++
++ -- Pirate Praveen <praveen@debian.org>  Sun, 07 Mar 2021 21:03:52 +0530
++
++puma (4.3.6-1) unstable; urgency=medium
++
++  * Team upload.
++  * New upstream version.
++    - Fixes CVE-2020-11076 and CVE-2020-11077 (closes: #972102).
++  * d/copyright: Minor update.
++  * d/puma.lintian-overrides: Add package override.
++  * d/ruby-tests.rake: Add logic to run SSL test.
++  * d/patches/*.patch: Add missing headers and refresh.
++  * d/source/lintian-overrides: Add source override.
++  * d/tests/control: Set environment variable to run the SSL tests separately
++    (similar to the solution used in the jekyll package).
++  * d/tests/test-puma-server-ssl*: Removed.
++
++ -- Daniel Leidert <dleidert@debian.org>  Thu, 15 Oct 2020 20:57:29 +0200
++
++puma (4.3.3-3) unstable; urgency=medium
++
++  * Include patch from gitlab to improve performance
++
++ -- Pirate Praveen <praveen@debian.org>  Tue, 18 Aug 2020 00:15:20 +0530
++
++puma (4.3.3-2) unstable; urgency=medium
++
++  [ Daniel Leidert ]
++  * debian/tests/test_puma_server_ssl,
++    debian/tests/test_puma_server_ssl.rake: Run test/test_puma_server_ssl.rb
++    in an openssl enviroment not using the Debian defaults.
++  * debian/tests/control: Add new test.
++
++  [ Debian Janitor ]
++  * Set field Upstream-Contact in debian/copyright.
++  * Remove obsolete fields Contact, Name from debian/upstream/metadata
++    (already present in machine-readable debian/copyright).
++
++  [ Pirate Praveen ]
++  * Remove debian-branch option from debian/gbp.conf
++  * Reupload to unstable
++
++ -- Pirate Praveen <praveen@debian.org>  Mon, 03 Aug 2020 15:37:16 +0530
++
++puma (4.3.3-1) experimental; urgency=medium
++
++  * Team upload.
++  * New upstream release.
++    - Fixes CVE-2020-5247 (closes: #952766).
++    - Fixes CVE-2020-5249 (closes: #953122).
++  * d/control (Section): Change to web.
++    (Vcs-Git): Indicate branch name via -b debian/experimental.
++    (Homepage): Use secure URL.
++    (Depends): Use ${ruby:Depends}.
++  * d/copyright (Source): Use secure URL.
++  * d/rules: Add override to install upstream changelog.
++  * d/watch: Use package name for tarball.
++
++ -- Daniel Leidert <dleidert@debian.org>  Thu, 05 Mar 2020 01:34:17 +0100
++
++puma (4.3.1-1) experimental; urgency=medium
++
++  * Team upload.
++  * New upstream release
++    - Fixes CVE-2019-16770 Keepalive thread overload/DoS (closes: #946312).
++  * d/control (Rules-Requires-Root): Set to binary-targets.
++    (Build-Depends, Depends): Add ruby-nio4r.
++    (Build-Depends): Add curl for test/test_integration_single.rb.
++  * d/ruby-tests.rake: Disable test/test_puma_server_ssl.rb.
++  * d/README.source: Add to explain tests which have been disabled.
++  * d/patches/0004-puma.gemspec-drop-git-usage.patch: Refresh patch.
++  * d/patches/0011-disable-minitest-extensions.patch: Add patch.
++    - Disable unavailable minitest extensions (retry and proveit).
++  * d/patches/0012-disable-cli-ssl-tests.patch: Add patch.
++    - Disable CLI SSL tests.
++  * d/patches/0013-fix-test-term-not-accepts-new-connections.patch: Add.
++    - Fix test_term_not_accepts_new_connections to be locale independent.
++  * d/patches/0002-test_integration-disable-test-that-fails-randomly.patch,
++    d/patches/0003-test_cli-disable-test-that-rails-randomly.patch,
++    d/patches/0005-test_puma_server-disable-test-that-fails-randomly.patch,
++    d/patches/0006-test-helper.rb-drop-bundler-usage.patch,
++    d/patches/0007-test-test_cli.rb-disable-test-that-fails-randomly.patch,
++    d/patches/0008-fix-ssl-tests.patch,
++    d/patches/0009-disable-tests-failing-in-single-cpu.patch,
++    d/patches/0010-fix-cluster-exit-for-ruby27.patch: Remove obsolete patches.
++  * d/patches/series: Adjust.
++
++ -- Daniel Leidert <dleidert@debian.org>  Thu, 06 Feb 2020 11:45:11 +0100
++
++puma (3.12.4-1) unstable; urgency=medium
++
++  * Team upload.
++  * New upstream release.
++    - Fixes CVE-2020-5247 (closes: #952766).
++    - Fixes CVE-2020-5249 (closes: #953122).
++  * d/control (Section): Changed to web.
++    (Homepage): Use secure URL.
++    (Depends): Add ${ruby:Depends}.
++  * d/copyright (Source): Use secure URL.
++  * d/ruby-tests.rake: Disable test/test_puma_server_ssl.rb for the moment.
++    These tests fail due to openssl being configured to use SECLEVEL2
++    (https://github.com/puma/puma/issues/2147).
++  * d/rules: Add override to install upstream changelog.
++  * d/watch: Rename downloaded tarball to include package name.
++  * d/patches/0008-fix-ssl-tests.patch: Remove patch. Applied upstream.
++  * d/patches/CVE-2019-16770.patch: Ditto.
++  * d/patches/*.patch: Refresh patches.
++  * d/patches/series: Adjust.
++
++ -- Daniel Leidert <dleidert@debian.org>  Wed, 04 Mar 2020 23:09:16 +0100
++
++puma (3.12.0-4) unstable; urgency=medium
++
++  * Team upload.
++  * d/control (Rules-Requires-Root): Set to binary-targets.
++  * d/patches/0011-disable-minitest-extensions.patch: Add patch.
++    - Disable unavailable minitest retry extension.
++  * d/patches/CVE-2019-16770.patch: Add patch.
++    - Backport fix for CVE-2019-16770 from upstream (closes: #946312).
++  * d/patches/series: Add patch.
++
++ -- Daniel Leidert <dleidert@debian.org>  Thu, 06 Feb 2020 12:54:59 +0100
++
++puma (3.12.0-3) unstable; urgency=medium
++
++  * Team upload.
++  * d/compat: Remove obsolete file.
++  * d/control: Add Rules-Requires-Root field.
++    (Build-Depends): Use debhelper-compat.
++    (Standards-Version): Bump to 4.5.0.
++    (Depends): Drop ruby-interpreter.
++  * d/copyright (Format): Fix insecure-copyright-format-uri and add myself.
++  * d/puma.1, d/pumactl.1: Add manual pages.
++  * d/puma.manpages: Install manual pages.
++  * d/ruby-tests.rake: Set verbose mode.
++  * d/patches/0010-fix-cluster-exit-for-ruby27.patch: Add patch.
++    - Fix hang with Ruby >= 2.6 when shutting down workers.
++  * d/patches/series: Enable new patch.
++  * d/upstream/metadata: Add metadata.
++  * d/upstream/metadata: Add metadata.
++
++ -- Daniel Leidert <dleidert@debian.org>  Wed, 05 Feb 2020 18:20:58 +0100
++
++puma (3.12.0-2) unstable; urgency=medium
++
++  * Disable tests failing in single cpu (Closes: #921931)
++
++ -- Pirate Praveen <praveen@debian.org>  Sun, 10 Feb 2019 18:56:47 +0530
++
++puma (3.12.0-1) unstable; urgency=medium
++
++  [ Balint Reczey ]
++  * New upstream version 3.12.0
++  * Refresh patches
++
++  [ Pirate Praveen ]
++  * Fix OpenSSL 1.1.1 test failures with upstream patch (Closes: #900156)
++  * Bump Standards-Version to 4.3.0 (no changes needed)
++  * Add myself to uploaders
++
++ -- Pirate Praveen <praveen@debian.org>  Sun, 10 Feb 2019 10:56:59 +0530
++
++puma (3.11.3-1) unstable; urgency=medium
++
++  * Team upload
++  * Remove myself from Uploaders:
++  * New upstream version 3.11.3
++  * Build against libssl-dev instead of libssl1.0-dev (Closes: #859542)
++  * Refresh packaging files with `dh-make-ruby -wo .`
++    * Bump debhelper compat to 11
++    * Change Vcs-* to point to salsa.debian.org
++    * Use standard debian/ruby-tests.rake
++      * drop build-dependency on ruby-hoe
++  * Refresh patches
++  * New patches:
++    - 0006-test-helper.rb-drop-bundler-usage.patch
++    - 0007-test-test_cli.rb-disable-test-that-fails-randomly.patch
++  * Replace 0001-test_puma_server_ssl-update-for-newer-versions-of-Op.patch
++    with 0001-test_puma_server_ssl-disable-test-that-takes-too-lon.patch
++
++
++ -- Antonio Terceiro <terceiro@debian.org>  Wed, 28 Mar 2018 18:53:22 -0300
++
++puma (3.6.0-1) unstable; urgency=medium
++
++  * Initial release (Closes: #720336)
++
++ -- Antonio Terceiro <terceiro@debian.org>  Thu, 10 Nov 2016 16:47:06 -0200
diff --cc debian/clean
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..45351253f956527ac039880f7b06f3b88c22d6fd
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++tmp/restart.txt
diff --cc debian/control
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..659a047767ad16c21356f1ae95cd43ede42625dc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,37 @@@
++Source: puma
++Section: web
++Priority: optional
++Maintainer: Debian Ruby Team <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
++Uploaders: Pirate Praveen <praveen@debian.org>,
++           Lucas Kanashiro <kanashiro@debian.org>
++Build-Depends: curl,
++               debhelper-compat (= 13),
++               gem2deb (>= 1.6),
++               libssl-dev,
++               procps,
++               rake,
++               ruby-concurrent,
++               ruby-localhost,
++               ruby-minitest-stub-const,
++               ruby-nio4r (>= 2),
++               ruby-rack,
++               ruby-rackup | ruby-rack (<< 3),
++               ruby-sd-notify
++Standards-Version: 4.7.0
++Vcs-Git: https://salsa.debian.org/ruby-team/puma.git
++Vcs-Browser: https://salsa.debian.org/ruby-team/puma
++Homepage: https://puma.io
++Testsuite: autopkgtest-pkg-ruby
++Rules-Requires-Root: binary-targets
++
++Package: puma
++Architecture: any
++Breaks: rails (<< 2:6.1.7.3+dfsg-3~)
++Depends: ruby,
++         ${misc:Depends},
++         ${ruby:Depends},
++         ${shlibs:Depends}
++Description: threaded HTTP 1.1 server for Ruby/Rack applications
++ Puma is a simple, fast, threaded, and highly concurrent HTTP 1.1 server for
++ Ruby/Rack applications. Puma is intended for use in both development and
++ production environments.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..70590cdcbfb79db560e15466a29125f2d69a5a4d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,42 @@@
++Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
++Upstream-Name: puma
++Upstream-Contact: https://github.com/puma/puma/issues
++Source: https://github.com/puma/puma
++
++Files: *
++Copyright: 2005, Zed Shaw
++           2011, Evan Phoenix
++License: BSD-3-clause
++
++Files: debian/*
++Copyright: 2016 Antonio Terceiro <terceiro@debian.org>
++           2020,2023 Daniel Leidert <dleidert@debian.org>
++           2023 Debian Ruby Extras Maintainers <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
++License: BSD-3-clause
++Comment: The Debian packaging is licensed under the same terms as the source.
++
++License: BSD-3-clause
++ All rights reserved.
++ .
++ Redistribution and use in source and binary forms, with or without
++ modification, are permitted provided that the following conditions are met:
++ .
++ * Redistributions of source code must retain the above copyright notice, this
++   list of conditions and the following disclaimer.
++ * Redistributions in binary form must reproduce the above copyright notice
++   this list of conditions and the following disclaimer in the documentation
++   and/or other materials provided with the distribution.
++ * Neither the name of the Evan Phoenix nor the names of its contributors
++   may be used to endorse or promote products derived from this software
++   without specific prior written permission.
++ .
++ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
++ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
++ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
++ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
++ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
++ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
++ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
++ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --cc debian/gbp.conf
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..da9f191b64d214a20d4b736dca4db7940dade516
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++[DEFAULT]
++pristine-tar = true
++sign-tags = true
++verbose = true
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..45b69adac1a71237b77ab90c9b88ff6e3aeb9b43
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,23 @@@
++From: Antonio Terceiro <terceiro@softwarelivre.org>
++Date: Wed, 5 Feb 2020 21:36:05 +0100
++Subject: Drop git usage from gemspec
++
++Forwarded: not-needed
++---
++ puma.gemspec | 3 +--
++ 1 file changed, 1 insertion(+), 2 deletions(-)
++
++Index: puma/puma.gemspec
++===================================================================
++--- puma.orig/puma.gemspec
+++++ puma/puma.gemspec
++@@ -18,8 +18,7 @@ Gem::Specification.new do |s|
++   if RbConfig::CONFIG['ruby_version'] >= '2.5'
++     s.metadata["msys2_mingw_dependencies"] = "openssl"
++   end
++-  s.files = `git ls-files -- bin docs ext lib tools`.split("\n") +
++-            %w[History.md LICENSE README.md]
+++  s.files = Dir.glob('**/*').reject { |f| f =~ /^debian\//}
++   s.homepage = "https://puma.io"
++ 
++   if s.respond_to?(:metadata=)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..967e60d3baa2f7d31a8f718e076c7994692c6905
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++From: Lucas Nussbaum <lucas@debian.org>
++Date: Wed, 5 Feb 2025 14:17:14 +0100
++Subject: Disable test concurrency without concurrent_ruby
++
++The way this is implemented (moving away the gem in $HOME) looks dangerous and
++doesn't work for non-user-installed packages.
++
++Forwarded: not-needed
++---
++ test/test_web_concurrency_auto.rb | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++diff --git a/test/test_web_concurrency_auto.rb b/test/test_web_concurrency_auto.rb
++index 8afebe6..a2fed7a 100644
++--- a/test/test_web_concurrency_auto.rb
+++++ b/test/test_web_concurrency_auto.rb
++@@ -39,7 +39,7 @@ class TestWebConcurrencyAuto < TestIntegration
++   end
++ 
++   # Rename the processor_counter file, then restore
++-  def test_web_concurrency_with_concurrent_ruby_unavailable
+++  def xxtest_web_concurrency_with_concurrent_ruby_unavailable
++     file_path = nil
++     skip_unless :fork
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6ec39ca84021bf28b259d6ea4a024a012a7524c6
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,43 @@@
++From: Daniel Leidert <daniel.leidert@wgdd.de>
++Date: Wed, 5 Feb 2020 22:20:42 +0100
++Subject: Disable unavailable minitest extensions
++
++Forwarded: not-needed
++---
++ test/helper.rb | 7 +------
++ 1 file changed, 1 insertion(+), 6 deletions(-)
++
++Index: puma/test/helper.rb
++===================================================================
++--- puma.orig/test/helper.rb
+++++ puma/test/helper.rb
++@@ -25,7 +25,6 @@ require_relative "helpers/test_puma/asse
++ require_relative "minitest/verbose"
++ require "minitest/autorun"
++ require "minitest/pride"
++-require "minitest/proveit"
++ require "minitest/stub_const"
++ require "net/http"
++ require_relative "helpers/apps"
++@@ -105,12 +104,9 @@ class TimeoutTestCase < Minitest::Test #
++ end
++ 
++ if ENV['CI']
++-  require 'minitest/retry'
++ 
++   SUMMARY_FILE = ENV['GITHUB_STEP_SUMMARY']
++ 
++-  Minitest::Retry.use!
++-
++   if SUMMARY_FILE && ENV['GITHUB_ACTIONS'] == 'true'
++ 
++     GITHUB_STEP_SUMMARY_MUTEX = Mutex.new
++@@ -210,7 +206,7 @@ class Minitest::Test
++   PROJECT_ROOT = File.dirname(__dir__)
++ 
++   def self.run(reporter, options = {}) # :nodoc:
++-    prove_it!
+++    #prove_it!
++     super
++   end
++ 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e8dcd42e129f8e151609787be10d7a14624f7233
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,28 @@@
++From: Daniel Leidert <daniel.leidert@wgdd.de>
++Date: Wed, 5 Feb 2020 23:18:37 +0100
++Subject: Disable cli ssl tests
++
++Forwarded: not-needed
++---
++ test/test_pumactl.rb | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++Index: puma/test/test_pumactl.rb
++===================================================================
++--- puma.orig/test/test_pumactl.rb
+++++ puma/test/test_pumactl.rb
++@@ -251,12 +251,12 @@ class TestPumaControlCli < TimeoutTestCa
++   end
++ 
++ 
++-  def test_control_ssl_ipv4
+++  def __test_control_ssl_ipv4
++     skip_unless :ssl
++     control_ssl '127.0.0.1'
++   end
++ 
++-  def test_control_ssl_ipv6
+++  def __test_control_ssl_ipv6
++     skip_unless :ssl
++     control_ssl '[::1]'
++   end
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4583cadc1e8ebf8272477c1c3d744f284f38d07c
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,24 @@@
++From: Daniel Leidert <daniel.leidert@wgdd.de>
++Date: Thu, 6 Feb 2020 11:24:24 +0100
++Subject: Fix test to read output locale independent
++
++The test fails if run in a non-English environment.
++
++Forwarded: https://github.com/puma/puma/issues/2149
++---
++ test/test_integration_single.rb | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++Index: puma/test/test_integration_single.rb
++===================================================================
++--- puma.orig/test/test_integration_single.rb
+++++ puma/test/test_integration_single.rb
++@@ -121,7 +121,7 @@ class TestIntegrationSingle < TestIntegr
++     assert wait_for_server_to_include('Gracefully stopping') # wait for server to begin graceful shutdown
++ 
++     # Invoke a request which must be rejected
++-    _stdin, _stdout, rejected_curl_stderr, rejected_curl_wait_thread = Open3.popen3("curl #{HOST}:#{@tcp_port}")
+++    _stdin, _stdout, rejected_curl_stderr, rejected_curl_wait_thread = Open3.popen3({ "LC_ALL" => "C" }, "curl http://#{HOST}:#{@tcp_port}")
++ 
++     assert nil != Process.getpgid(@server.pid) # ensure server is still running
++     assert nil != Process.getpgid(curl_wait_thread[:pid]) # ensure first curl invocation still in progress
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..ce0677d1833322c93ef8b87c9b390b26b00f56ae
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++From: Pirate Praveen <praveen@debian.org>
++Date: Mon, 8 Mar 2021 23:03:21 +0530
++Subject: Disable test that failied on amd64 buildd
++
++This test failed on amd64 buildd
++https://buildd.debian.org/status/fetch.php?pkg=puma&arch=amd64&ver=5.2.2-1&stamp=1615133735&raw=0
++
++Forwarded: not-needed
++---
++ test/test_puma_server.rb | 2 +-
++ 1 file changed, 1 insertion(+), 1 deletion(-)
++
++Index: puma/test/test_puma_server.rb
++===================================================================
++--- puma.orig/test/test_puma_server.rb
+++++ puma/test/test_puma_server.rb
++@@ -1735,7 +1735,7 @@ class TestPumaServer < TimeoutTestCase
++     end
++   end
++ 
++-  def test_command_ignored_before_run
+++  def __test_command_ignored_before_run
++     @server.stop # ignored
++     @server.run
++     @server.halt
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..75c31e4639c69c43b6a0f0a86d5811356d58c762
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,15 @@@
++Output changed from 'OK' to '::Rack::URLMap is loaded'
++
++Index: puma/test/test_url_map.rb
++===================================================================
++--- puma.orig/test/test_url_map.rb
+++++ puma/test/test_url_map.rb
++@@ -9,7 +9,7 @@ class TestURLMap < TestIntegration
++   end
++ 
++   # make sure the mapping defined in url_map_test/config.ru works
++-  def test_basic_url_mapping
+++  def __test_basic_url_mapping
++     skip_if :jruby
++     env = { "BUNDLE_GEMFILE" => "#{__dir__}/url_map_test/Gemfile" }
++     Dir.chdir("#{__dir__}/url_map_test") do
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..6e038dd1d7bc0bed4ec49f2e40326763d26f9c55
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,15 @@@
++this test is failing on arm64 buildd (sometimes on other archs as well)
++
++Index: puma/test/test_plugin_systemd.rb
++===================================================================
++--- puma.orig/test/test_plugin_systemd.rb
+++++ puma/test/test_plugin_systemd.rb
++@@ -31,7 +31,7 @@ class TestPluginSystemd < TestIntegratio
++     super
++   end
++ 
++-  def test_systemd_notify_usr1_phased_restart_cluster
+++  def __test_systemd_notify_usr1_phased_restart_cluster
++     skip_unless :fork
++     assert_restarts_with_systemd :USR1
++   end
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..7e984f22f5ebaf6b13a90c945edf018842d96af0
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,15 @@@
++https://ci.debian.net/packages/p/puma/testing/armhf/42745746/
++
++Index: puma/test/test_integration_ssl_session.rb
++===================================================================
++--- puma.orig/test/test_integration_ssl_session.rb
+++++ puma/test/test_integration_ssl_session.rb
++@@ -122,7 +122,7 @@ class TestIntegrationSSLSession < TestIn
++     assert reused, 'session was not reused'
++   end
++ 
++-  def test_off_tls1_2
+++  def __test_off_tls1_2
++     ssl_vers = Puma::MiniSSL::OPENSSL_LIBRARY_VERSION
++     old_ssl = ssl_vers.include?(' 1.0.') || ssl_vers.match?(/ 1\.1\.1[ a-e]/)
++     skip 'Requires 1.1.1f or later' if old_ssl
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..5749467c18f7b7ee7f6662fe7a937708ce958778
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,179 @@@
++From: Debian Ruby Team <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
++Date: Mon, 23 Dec 2024 19:26:53 -0300
++Subject: Skip tests failing with ruby3.2 in Ubuntu
++
++  1) Error:
++TestRackUp::RackUp#test_bin:
++TimeoutEveryTestCase::TestTookTooLong: execution expired
++    /<<PKGBUILDDIR>>/test/test_rack_handler.rb:318:in `sysread'
++    /<<PKGBUILDDIR>>/test/test_rack_handler.rb:318:in `test_bin'
++    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
++    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
++    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
++    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
++
++Those tests reported the following errors:
++
++  2) Error:
++TestCLI#test_control_clustered:
++TimeoutEveryTestCase::TestTookTooLong: execution expired
++    /<<PKGBUILDDIR>>/test/test_cli.rb:136:in `join'
++    /<<PKGBUILDDIR>>/test/test_cli.rb:136:in `test_control_clustered'
++    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
++    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
++    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
++    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
++
++  3) Error:
++TestPluginSystemd#test_systemd_notify_usr2_hot_restart_cluster:
++Errno::EPIPE: Broken pipe
++    /<<PKGBUILDDIR>>/test/test_plugin_systemd.rb:90:in `write'
++    /<<PKGBUILDDIR>>/test/test_plugin_systemd.rb:90:in `assert_restarts_with_systemd'
++    /<<PKGBUILDDIR>>/test/test_plugin_systemd.rb:42:in `test_systemd_notify_usr2_hot_restart_cluster'
++    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
++    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
++    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
++    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
++
++  4) Error:
++TestIntegrationPumactl#test_halt_unix:
++Errno::ECHILD: No child processes
++    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `wait2'
++    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `ctl_unix'
++    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:42:in `test_halt_unix'
++    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
++    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
++    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
++    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
++
++  5) Error:
++TestIntegrationPumactl#test_stop_unix:
++Errno::ECHILD: No child processes
++    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `wait2'
++    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:55:in `ctl_unix'
++    /<<PKGBUILDDIR>>/test/test_integration_pumactl.rb:38:in `test_stop_unix'
++    /<<PKGBUILDDIR>>/test/helper.rb:90:in `block (4 levels) in run'
++    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
++    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
++    /<<PKGBUILDDIR>>/test/helper.rb:88:in `block (3 levels) in run'
++
++  6) Error:
++TestPumaServer#test_timeout_in_data_phase:
++TimeoutEveryTestCase::TestTookTooLong: execution expired
++    /<<PKGBUILDDIR>>/debian/puma/usr/lib/x86_64-linux-gnu/rubygems-integration/3.2.0/gems/puma-6.4.2/lib/puma/server.rb:627:in `join'
++    /<<PKGBUILDDIR>>/debian/puma/usr/lib/x86_64-linux-gnu/rubygems-integration/3.2.0/gems/puma-6.4.2/lib/puma/server.rb:627:in `stop'
++    /<<PKGBUILDDIR>>/test/test_puma_server.rb:31:in `teardown'
++    /<<PKGBUILDDIR>>/test/helper.rb:96:in `block (5 levels) in run'
++    /<<PKGBUILDDIR>>/test/helper.rb:96:in `each'
++    /<<PKGBUILDDIR>>/test/helper.rb:96:in `block (4 levels) in run'
++    /usr/lib/ruby/3.2.0/timeout.rb:189:in `block in timeout'
++    /usr/lib/ruby/3.2.0/timeout.rb:196:in `timeout'
++    /<<PKGBUILDDIR>>/test/helper.rb:95:in `block (3 levels) in run'
++ .
++ Extra failure in Debian:
++ .
++  1) Error:
++TestIntegrationSingle#test_puma_debug_loaded_exts:
++TimeoutEveryTestCase::TestTookTooLong: execution expired
++    /build/reproducible-path/puma-6.4.3/test/helpers/integration.rb:125:in `wait2'
++    /build/reproducible-path/puma-6.4.3/test/helpers/integration.rb:125:in `stop_server'
++    /build/reproducible-path/puma-6.4.3/test/helpers/integration.rb:39:in `teardown'
++    /build/reproducible-path/puma-6.4.3/test/helper.rb:96:in `block (5 levels) in run'
++    /build/reproducible-path/puma-6.4.3/test/helper.rb:96:in `each'
++    /build/reproducible-path/puma-6.4.3/test/helper.rb:96:in `block (4 levels) in run'
++    /usr/lib/ruby/3.3.0/timeout.rb:186:in `block in timeout'
++    /usr/lib/ruby/3.3.0/timeout.rb:193:in `timeout'
++    /build/reproducible-path/puma-6.4.3/test/helper.rb:95:in `block (3 levels) in run'
++ .
++ They do not seem real regressions, so skipping them for now.
++Author: Lucas Kanashiro <lucas.kanashiro@canonical.com>
++Last-Updated: 2024-12-23
++Forwarded: not-needed
++---
++ test/test_cli.rb                 | 2 +-
++ test/test_integration_pumactl.rb | 4 ++--
++ test/test_integration_single.rb  | 2 +-
++ test/test_plugin_systemd.rb      | 2 +-
++ test/test_puma_server.rb         | 4 ++--
++ test/test_rack_handler.rb        | 2 +-
++ 6 files changed, 8 insertions(+), 8 deletions(-)
++
++Index: puma/test/test_integration_pumactl.rb
++===================================================================
++--- puma.orig/test/test_integration_pumactl.rb
+++++ puma/test/test_integration_pumactl.rb
++@@ -31,11 +31,11 @@ class TestIntegrationPumactl < TestInteg
++     wait_server
++   end
++ 
++-  def test_stop_unix
+++  def __test_stop_unix
++     ctl_unix
++   end
++ 
++-  def test_halt_unix
+++  def __test_halt_unix
++     ctl_unix 'halt'
++   end
++ 
++Index: puma/test/test_integration_single.rb
++===================================================================
++--- puma.orig/test/test_integration_single.rb
+++++ puma/test/test_integration_single.rb
++@@ -247,7 +247,7 @@ class TestIntegrationSingle < TestIntegr
++     assert true
++   end
++ 
++-  def test_puma_debug_loaded_exts
+++  def _test_puma_debug_loaded_exts
++     cli_server "#{set_pumactl_args} test/rackup/hello.ru", puma_debug: true
++ 
++     assert wait_for_server_to_include('Loaded Extensions:')
++Index: puma/test/test_plugin_systemd.rb
++===================================================================
++--- puma.orig/test/test_plugin_systemd.rb
+++++ puma/test/test_plugin_systemd.rb
++@@ -36,7 +36,7 @@ class TestPluginSystemd < TestIntegratio
++     assert_restarts_with_systemd :USR1
++   end
++ 
++-  def test_systemd_notify_usr2_hot_restart_cluster
+++  def __test_systemd_notify_usr2_hot_restart_cluster
++     skip_unless :fork
++     assert_restarts_with_systemd :USR2
++   end
++Index: puma/test/test_puma_server.rb
++===================================================================
++--- puma.orig/test/test_puma_server.rb
+++++ puma/test/test_puma_server.rb
++@@ -602,7 +602,7 @@ class TestPumaServer < TimeoutTestCase
++     assert_equal [:booting, :running, :stop, :done], states
++   end
++ 
++-  def test_timeout_in_data_phase(**options)
+++  def __test_timeout_in_data_phase(**options)
++     server_run(first_data_timeout: 1, **options)
++ 
++     socket = send_http "POST / HTTP/1.1\r\nHost: test.com\r\nContent-Type: text/plain\r\nContent-Length: 5\r\n\r\n"
++@@ -615,7 +615,7 @@ class TestPumaServer < TimeoutTestCase
++     assert_equal "HTTP/1.1 408 #{STATUS_CODES[408]}", response.status
++   end
++ 
++-  def test_timeout_data_no_queue
+++  def __test_timeout_data_no_queue
++     test_timeout_in_data_phase(queue_requests: false)
++   end
++ 
++Index: puma/test/test_rack_handler.rb
++===================================================================
++--- puma.orig/test/test_rack_handler.rb
+++++ puma/test/test_rack_handler.rb
++@@ -345,7 +345,7 @@ module TestRackUp
++       FileUtils.rm 'config.ru'
++     end
++ 
++-    def test_bin
+++    def __test_bin
++       pid = nil
++       # JRuby & TruffleRuby take a long time using IO.popen
++       skip_unless :mri
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b3fac59372059ae7e6b8cbab2218d926d0a1e72e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,80 @@@
++From: Athos Ribeiro <athos@debian.org>
++Date: Thu, 17 Jul 2025 06:35:51 -0300
++Subject: Adapt test certificates generation
++
++Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078640
++Forwarded: not-needed
++Last-Update: 2025-07-15
++
++Adapt the test certificates generation process to Debian. For that, we extend
++the validity of the certificates to 11 years to try to cover the Debian support
++(and hopefully the LTS/eLTS) window as long as a build is performed 1 year
++before a release. We also require certificate_authority from the installed
++package so we can generate this certificates without external packages.
++Last-Update: 2025-07-15
++---
++ examples/generate_chain_test.rb  | 9 ++++-----
++ examples/generate_client_test.rb | 2 +-
++ examples/generate_server_test.rb | 2 +-
++ 3 files changed, 6 insertions(+), 7 deletions(-)
++
++diff --git a/examples/generate_chain_test.rb b/examples/generate_chain_test.rb
++index 2676760..d84c7ae 100644
++--- a/examples/generate_chain_test.rb
+++++ b/examples/generate_chain_test.rb
++@@ -11,10 +11,7 @@ certs before date will be the first of the current month
++ =end
++ 
++ require 'bundler/inline'
++-gemfile(true) do
++-  source 'https://rubygems.org'
++-  gem 'certificate_authority'
++-end
+++require 'certificate_authority'
++ 
++ module GenerateChainCerts
++ 
++@@ -39,7 +36,7 @@ module GenerateChainCerts
++ 
++         {
++           not_before: Time.new(yr, mo, 1, 0, 0, 0, zone),
++-          not_after:  Time.new(yr+4, mo, 1, 0, 0, 0, zone)
+++          not_after:  Time.new(yr+11, mo, 1, 0, 0, 0, zone)
++         }
++       )
++     end
++@@ -83,6 +80,8 @@ module GenerateChainCerts
++       cert.subject.common_name  = common_name
++       cert.serial_number.number = parent.serial_number.number + 100
++       cert.parent               = parent
+++      cert.not_before          = before_after[:not_before]
+++      cert.not_after           = before_after[:not_after]
++ 
++       cert.key_material.generate_key
++       cert.sign!
++diff --git a/examples/generate_client_test.rb b/examples/generate_client_test.rb
++index f875916..e197428 100644
++--- a/examples/generate_client_test.rb
+++++ b/examples/generate_client_test.rb
++@@ -107,7 +107,7 @@ module GenerateClientCerts
++       zone = '+00:00'
++ 
++       @before = Time.new yr  , mo, 1, 0, 0, 0, zone
++-      @after  = Time.new yr+4, mo, 1, 0, 0, 0, zone
+++      @after  = Time.new yr+11, mo, 1, 0, 0, 0, zone
++ 
++       @b_exp  = Time.new yr-1, mo, 1, 0, 0, 0, zone
++       @a_exp  = Time.new yr  , mo, 1, 0, 0, 0, zone
++diff --git a/examples/generate_server_test.rb b/examples/generate_server_test.rb
++index cf9364a..f73e660 100644
++--- a/examples/generate_server_test.rb
+++++ b/examples/generate_server_test.rb
++@@ -33,7 +33,7 @@ module GenerateServerCerts
++       zone = '+00:00'
++ 
++       cert.not_before = Time.new yr  , mo, 1, 0, 0, 0, zone
++-      cert.not_after  = Time.new yr+4, mo, 1, 0, 0, 0, zone
+++      cert.not_after  = Time.new yr+11, mo, 1, 0, 0, 0, zone
++       cert.public_key = key.public_key
++       cert.sign ca_key, SIGN_ALGORITHM.new
++       puts "New:", cert.to_text, ""
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..05c5e47fcb7ac60f06f6df3d068aaea83175218f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1499 @@@
++From: Athos Ribeiro <athos.ribeiro@canonical.com>
++Date: Tue, 15 Jul 2025 10:38:43 -0300
++Subject: Update example certificates
++
++Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078640
++Forwarded: not-needed
++Last-Update: 2025-07-15
++
++Update the example certificates so that the upstream unit tests keep
++passing throughout the next Debian release (trixie) support cycle.  This
++is done by updating the certificates validity to 11 years (possibly
++covering LTS/eLTS).
++Last-Update: 2025-07-15
++---
++ examples/puma/cert_puma.pem                     |  30 ++++----
++ examples/puma/chain_cert/ca.crt                 |  33 ++++----
++ examples/puma/chain_cert/ca.key                 |  50 ++++++------
++ examples/puma/chain_cert/ca_chain.pem           |  65 ++++++++--------
++ examples/puma/chain_cert/cert.crt               |  32 ++++----
++ examples/puma/chain_cert/cert.key               |  50 ++++++------
++ examples/puma/chain_cert/cert_chain.pem         |  97 ++++++++++++------------
++ examples/puma/chain_cert/intermediate.crt       |  32 ++++----
++ examples/puma/chain_cert/intermediate.key       |  50 ++++++------
++ examples/puma/client_certs/ca.crt               |  28 +++----
++ examples/puma/client_certs/ca.key               |  50 ++++++------
++ examples/puma/client_certs/ca_store.jks         | Bin 848 -> 848 bytes
++ examples/puma/client_certs/ca_store.p12         | Bin 2568 -> 2584 bytes
++ examples/puma/client_certs/client.crt           |  30 ++++----
++ examples/puma/client_certs/client.key           |  50 ++++++------
++ examples/puma/client_certs/client_expired.crt   |  30 ++++----
++ examples/puma/client_certs/client_expired.key   |  50 ++++++------
++ examples/puma/client_certs/client_unknown.crt   |  30 ++++----
++ examples/puma/client_certs/client_unknown.key   |  50 ++++++------
++ examples/puma/client_certs/keystore.jks         | Bin 4392 -> 4392 bytes
++ examples/puma/client_certs/server.crt           |  30 ++++----
++ examples/puma/client_certs/server.key           |  50 ++++++------
++ examples/puma/client_certs/server.p12           | Bin 3408 -> 3424 bytes
++ examples/puma/client_certs/unknown_ca.crt       |  28 +++----
++ examples/puma/client_certs/unknown_ca.key       |  50 ++++++------
++ examples/puma/client_certs/unknown_ca_store.p12 | Bin 2592 -> 2608 bytes
++ examples/puma/encrypted_puma_keypair.pem        |  56 +++++++-------
++ examples/puma/keystore.jks                      | Bin 2253 -> 2252 bytes
++ examples/puma/puma_keypair.pem                  |  50 ++++++------
++ examples/puma/server.p12                        | Bin 2700 -> 2716 bytes
++ 30 files changed, 509 insertions(+), 512 deletions(-)
++
++diff --git a/examples/puma/cert_puma.pem b/examples/puma/cert_puma.pem
++index 6cbb9c1..cace838 100644
++--- a/examples/puma/cert_puma.pem
+++++ b/examples/puma/cert_puma.pem
++@@ -1,21 +1,21 @@
++ -----BEGIN CERTIFICATE-----
++ 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
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/chain_cert/ca.crt b/examples/puma/chain_cert/ca.crt
++index 9acfe79..bcc8e26 100644
++--- a/examples/puma/chain_cert/ca.crt
+++++ b/examples/puma/chain_cert/ca.crt
++@@ -1,20 +1,19 @@
++ -----BEGIN CERTIFICATE-----
++-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
+++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
++ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
++-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
++-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
++-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
++-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
++-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
++-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
++-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
++-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
++-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
++-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
++-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
++-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
++-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
++-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
++-8uByucqDNovFjYNMKw==
+++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
+++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
+++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
+++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
+++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
+++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
+++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
+++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
+++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
+++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
+++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
+++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
+++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
+++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/chain_cert/ca.key b/examples/puma/chain_cert/ca.key
++index c884487..8de2968 100644
++--- a/examples/puma/chain_cert/ca.key
+++++ b/examples/puma/chain_cert/ca.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/chain_cert/ca_chain.pem b/examples/puma/chain_cert/ca_chain.pem
++index 7d500ef..7196332 100644
++--- a/examples/puma/chain_cert/ca_chain.pem
+++++ b/examples/puma/chain_cert/ca_chain.pem
++@@ -1,40 +1,39 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
+++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
++ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
++-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
++-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
++-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
++-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
++-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
++-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
++-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
++-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
++-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
++-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
++-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
++-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
++-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
++-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
++-iX6YKGNd
+++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
+++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
+++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
+++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
+++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
+++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
+++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
+++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
+++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
+++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
+++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
+++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
+++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
+++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
+++05PKNc+5
++ -----END CERTIFICATE-----
++ -----BEGIN CERTIFICATE-----
++-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
+++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
++ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
++-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
++-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
++-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
++-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
++-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
++-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
++-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
++-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
++-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
++-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
++-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
++-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
++-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
++-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
++-8uByucqDNovFjYNMKw==
+++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
+++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
+++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
+++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
+++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
+++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
+++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
+++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
+++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
+++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
+++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
+++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
+++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
+++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/chain_cert/cert.crt b/examples/puma/chain_cert/cert.crt
++index 8467b47..89010e8 100644
++--- a/examples/puma/chain_cert/cert.crt
+++++ b/examples/puma/chain_cert/cert.crt
++@@ -1,20 +1,20 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
++-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
+++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjUwNzAxMDAwMDAwWhcNMzYwNzAx
++ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
++-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkH1hQqC0EFwYxi5+Ihqat9Yqebpk0A9x
++-ZzdO68eBSw4glnhh/+8VNB238q3nVD+0oL5oOBFVPAA34jUrrngS3LSl7tx4y1tj
++-jqn2LwKkdjAaaQn7uNKf/Ow6JX8dsaFpEUmabOzQBbhQtUDdbHmX1jgJYy8siSdU
++-ExXtNHAA+kqlif0Hcj1Xx8dlXQlLiDgdO1I5h84rjfdX+TUGwnJO5MkIZ5X5r6tE
++-hk8s/2dvbrU2AKcP+pTY4jw/fyDNd9q8OdW186RlBdS+uyX3D2hh+8aVLONQIJOx
++-wRyQaImYzHPWMDO6MuQ5/5LAxFFYWCGSLvUTdrillB0Snmppe9uGhwIDAQABo28w
++-bTAdBgNVHQ4EFgQUQT/iPOTx/zDEIgWHiraGJdrud74wCwYDVR0PBAQDAgbAMBMG
++-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU1V8CDxIv
++-GpM3njBhaJZ/FWJz6IcwDQYJKoZIhvcNAQENBQADggEBADHQ75un1UtxDI9oluXu
++-wEJL0515nIAKjaWFCl0Z/CGaAWkkJERk0JBxTe9J/MrYY68NYCCAusRoUoRbvcA2
++-GQ8vKae5V6/md+npZpKQznmUk+nZMzNKr+QoMY/nvtLA5tZ85fsU40H4nbvb23EY
++-3o6IiEbLD0G3FbIFtkgQ7+j9w6bvvMwd+3Ed0jSjRl4wKi4cXgD1UIyce/MVzAzT
++-bXW2SLWjfRzcTsrAnrbno5S3g+KMD1w9zGNppYiFH0zydpatKjJW18r/6XgJqoim
++-Rl5OGVnMNgIAw+S8/G3+/IIPXWHFE29R3j3oXjm/F8570TpQTYyx8wOmEr+zJPv0
++-8gU=
+++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnweGJw3HXhvtIAFL6i3hzFdD5F3UG2Nm
+++hIGaiKyDy71b25rkXFduG8R9i4s5rVBUdafA2OlrRDWMMrlYSudJnlB6P2jtBRxB
+++7iw66vBVCBstDiKEr5xWFceG+2WpHU1peLCj72Ujuy/Xc/85S+70a9ISXItDRuyY
+++tNTLi1HROioH6A0MfpvoLKxHYyoJ1dxu/eXikY8uk+J1cKogOP0jjn0VieJXptqc
+++nHICV5/LmX3KC7ZxowexrQhTw81cKtx0fVeyZAHlM0rmIj23iajLqLtE+tq07P50
+++OP8uABiK53L9RH55SlM/7PjDss6/VZDG7xsRBhEzaU39jOuSmZdrewIDAQABo28w
+++bTAdBgNVHQ4EFgQUBt0gNG2VFq4KeC5rPkvqxlxUZpgwCwYDVR0PBAQDAgbAMBMG
+++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUDH40Tp0C
+++9PsflBT7LIr3BXriX84wDQYJKoZIhvcNAQENBQADggEBAIsh0gAB91/phH0XSbaV
+++5X7bOvUQZBkF6VU3FMSKz1qeP7zhxhHnsTQVAWRCT4QdQ0bXzWDaUubUfS1uL9fW
+++hMS6qJ/X56WjYvzUqr6Haxxc6nF2SzaZfNHC02uBOBqZaOWsf0rEv4M9A1PPPyy4
+++ZO5nCLsLvReiAXViAyRO2HjXej/820fXh0uwEZgR8tUaQEt5frphr9cT/Q70kn+M
+++XfpXvhGmLZ9C+0pXS0ILJRb8DccdfL6UMmQEPyfuW2OJrCDwvK3aG4KA2mdAg9Ca
+++OvxCQ9WgAkMR2P7dHovoYaMsl8Nipiy/i0YeVG1rJAledWOO05xiVPdiTPkJk8JC
+++PPU=
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/chain_cert/cert.key b/examples/puma/chain_cert/cert.key
++index ed2bd0d..790455c 100644
++--- a/examples/puma/chain_cert/cert.key
+++++ b/examples/puma/chain_cert/cert.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/chain_cert/cert_chain.pem b/examples/puma/chain_cert/cert_chain.pem
++index 5f391f3..40ed0f5 100644
++--- a/examples/puma/chain_cert/cert_chain.pem
+++++ b/examples/puma/chain_cert/cert_chain.pem
++@@ -1,60 +1,59 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
++-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
+++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjUwNzAxMDAwMDAwWhcNMzYwNzAx
++ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
++-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkH1hQqC0EFwYxi5+Ihqat9Yqebpk0A9x
++-ZzdO68eBSw4glnhh/+8VNB238q3nVD+0oL5oOBFVPAA34jUrrngS3LSl7tx4y1tj
++-jqn2LwKkdjAaaQn7uNKf/Ow6JX8dsaFpEUmabOzQBbhQtUDdbHmX1jgJYy8siSdU
++-ExXtNHAA+kqlif0Hcj1Xx8dlXQlLiDgdO1I5h84rjfdX+TUGwnJO5MkIZ5X5r6tE
++-hk8s/2dvbrU2AKcP+pTY4jw/fyDNd9q8OdW186RlBdS+uyX3D2hh+8aVLONQIJOx
++-wRyQaImYzHPWMDO6MuQ5/5LAxFFYWCGSLvUTdrillB0Snmppe9uGhwIDAQABo28w
++-bTAdBgNVHQ4EFgQUQT/iPOTx/zDEIgWHiraGJdrud74wCwYDVR0PBAQDAgbAMBMG
++-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU1V8CDxIv
++-GpM3njBhaJZ/FWJz6IcwDQYJKoZIhvcNAQENBQADggEBADHQ75un1UtxDI9oluXu
++-wEJL0515nIAKjaWFCl0Z/CGaAWkkJERk0JBxTe9J/MrYY68NYCCAusRoUoRbvcA2
++-GQ8vKae5V6/md+npZpKQznmUk+nZMzNKr+QoMY/nvtLA5tZ85fsU40H4nbvb23EY
++-3o6IiEbLD0G3FbIFtkgQ7+j9w6bvvMwd+3Ed0jSjRl4wKi4cXgD1UIyce/MVzAzT
++-bXW2SLWjfRzcTsrAnrbno5S3g+KMD1w9zGNppYiFH0zydpatKjJW18r/6XgJqoim
++-Rl5OGVnMNgIAw+S8/G3+/IIPXWHFE29R3j3oXjm/F8570TpQTYyx8wOmEr+zJPv0
++-8gU=
+++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnweGJw3HXhvtIAFL6i3hzFdD5F3UG2Nm
+++hIGaiKyDy71b25rkXFduG8R9i4s5rVBUdafA2OlrRDWMMrlYSudJnlB6P2jtBRxB
+++7iw66vBVCBstDiKEr5xWFceG+2WpHU1peLCj72Ujuy/Xc/85S+70a9ISXItDRuyY
+++tNTLi1HROioH6A0MfpvoLKxHYyoJ1dxu/eXikY8uk+J1cKogOP0jjn0VieJXptqc
+++nHICV5/LmX3KC7ZxowexrQhTw81cKtx0fVeyZAHlM0rmIj23iajLqLtE+tq07P50
+++OP8uABiK53L9RH55SlM/7PjDss6/VZDG7xsRBhEzaU39jOuSmZdrewIDAQABo28w
+++bTAdBgNVHQ4EFgQUBt0gNG2VFq4KeC5rPkvqxlxUZpgwCwYDVR0PBAQDAgbAMBMG
+++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUDH40Tp0C
+++9PsflBT7LIr3BXriX84wDQYJKoZIhvcNAQENBQADggEBAIsh0gAB91/phH0XSbaV
+++5X7bOvUQZBkF6VU3FMSKz1qeP7zhxhHnsTQVAWRCT4QdQ0bXzWDaUubUfS1uL9fW
+++hMS6qJ/X56WjYvzUqr6Haxxc6nF2SzaZfNHC02uBOBqZaOWsf0rEv4M9A1PPPyy4
+++ZO5nCLsLvReiAXViAyRO2HjXej/820fXh0uwEZgR8tUaQEt5frphr9cT/Q70kn+M
+++XfpXvhGmLZ9C+0pXS0ILJRb8DccdfL6UMmQEPyfuW2OJrCDwvK3aG4KA2mdAg9Ca
+++OvxCQ9WgAkMR2P7dHovoYaMsl8Nipiy/i0YeVG1rJAledWOO05xiVPdiTPkJk8JC
+++PPU=
++ -----END CERTIFICATE-----
++ -----BEGIN CERTIFICATE-----
++ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
+++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
++ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
++-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
++-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
++-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
++-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
++-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
++-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
++-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
++-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
++-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
++-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
++-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
++-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
++-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
++-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
++-iX6YKGNd
+++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
+++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
+++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
+++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
+++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
+++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
+++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
+++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
+++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
+++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
+++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
+++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
+++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
+++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
+++05PKNc+5
++ -----END CERTIFICATE-----
++ -----BEGIN CERTIFICATE-----
++-MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
+++MIIDEjCCAfqgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMBwx
++ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
++-AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
++-E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
++-UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
++-xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
++-Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
++-JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
++-BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
++-CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
++-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
++-9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
++-nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
++-tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
++-ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
++-SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
++-8uByucqDNovFjYNMKw==
+++AQ8AMIIBCgKCAQEArOhy3ADotcJ0F7rl0KpWlm/a6wkyeSbTNPd+gaccACR1wd92
+++kXs2/S5day5/lP6uVUxrrKU2fhFXSy+aI5bng5cQl0ita6sVZCThs9k683w/fobc
+++OMIKk3MFPxF4QJTa4iNb21g8olKYT/L2b0MUTq+AvnlC3mAAJkLrXjML3wrhwORa
+++VmTdsepqMOkQD3EcuggbkfkUK3p3xfVcHJ2iEfRhGY/7JxNcm1o6YLbj8WPqAKcH
+++0f8KNjzr0IJuMDKy/jArV7VdA9TeGoq6ECMkIIx7y9lwu0gfkJNkmmEYJbU7c0ik
+++UzwIko3qxlvB9nugrzzsG11aTwYkLu2WE1BhcQIDAQABo18wXTAdBgNVHQ4EFgQU
+++3ZgoXoMYzlhYDr93B73HJUlsQXgwDgYDVR0PAQH/BAQDAgIEMBMGA1UdJQQMMAoG
+++CCsGAQUFBwMBMAwGA1UdEwQFMAMBAf8wCQYDVR0jBAIwADANBgkqhkiG9w0BAQ0F
+++AAOCAQEAjwWu4jaf6ybB4BVNuNvvFFCa40iRsjYH7W9LSjtkObEDyOAr4GK3j83b
+++3r23HVE4y/Aiz502DlENUdhLw3rPqfY6efHG1k6W0RiKbL++0BLQOmta3e8fpgaq
+++DDkmGGt60hpizfftkkGoZUVs+MabuJwCezs5n+KcyztGhGKCTtLJfv+1N1aevrFF
+++50E7rkqTkhHsCjMvL/dnmDVzuXDkqJ2SGeWC9fSwWEKmVEA6QDCXPc8RyGEgJPgF
+++gK7Q+5JF6zd3ZSVlcX8lCivXw4GX6Mh2ZjE3DtDIaGpuQIFV/y3vo0c/8RVMBiMo
+++dGuf7tB1eQn0vSFRUc3UrZIMBspK7Q==
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/chain_cert/intermediate.crt b/examples/puma/chain_cert/intermediate.crt
++index cc9895e..501d1ad 100644
++--- a/examples/puma/chain_cert/intermediate.crt
+++++ b/examples/puma/chain_cert/intermediate.crt
++@@ -1,20 +1,20 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
++-dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
+++dW1hLmxvY2FsaG9zdDAeFw0yNTA3MDEwMDAwMDBaFw0zNjA3MDEwMDAwMDBaMCYx
++ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
++-hvcNAQEBBQADggEPADCCAQoCggEBAKe0Vb0OyhNyWi4/u1jwLOkDYGx7+aXOJJyN
++-5ExJNS0goWy8+OQKVBwFgZZ5jqqfrXlLheOpAEpRm7TIJVTIwD1/gi/zrNN1ec3D
++-uJMBvlTzNVozfBncQ9EJ62JRC3I/56W1xYMekCIG2SjzSnAfNSojyN6SLxGmtT89
++-xN6parFq/GcvEtssDRVVUm6pyIOgpDOgTuUcqT3qUgOkN9w+5ZgjKWAc1BuMipR9
++-f8wwjuhXx2XlH2lodVWl94xo4ipY7sd2frF/oil9SXDC3ZrwGdkt9TQaCMYlt74V
++-yNxPAX5XwRH8b2OAsIGkPNh7TvIkKR33JkKcXXpZbxlRP6PDWR0CAwEAAaN1MHMw
++-HQYDVR0OBBYEFNVfAg8SLxqTN54wYWiWfxVic+iHMA4GA1UdDwEB/wQEAwICBDAT
++-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFC4S
++-mXgLro3UDdm+hU5w7yTobbWdMA0GCSqGSIb3DQEBDQUAA4IBAQAOdOtD3py2k4OO
++-0Q5KvmvyybaeSlFPM6/iXNakmqJY3lELnJgjWYgBXlOK91M7F2xG8YRFoBrUipXd
++-rMAburoWjnKvMoPaGZqbpligfkPIueo+ON/Q27UhvH2EYFzTOGjfnCiSCzpekesC
++-32MhK7mB9Uzu9yxDgtRu0IRqCk9WbU35qDzx7mUEZwCHe11T6tV4k9ZHAvhqEvaq
++-sqAgA+OoXBev6wx1tWgiqf40vuKZBRutWUSTHgGIXqain2l5b7Jv6TkCNI4HttHN
++-43oME4M6P1/iH+l99Y7fZBkLGnkGYPiWXQH9NyydQVHOBm3dN26QJzAmV06ZLxEm
++-iX6YKGNd
+++hvcNAQEBBQADggEPADCCAQoCggEBAI1oWjP0qqF7UZqnmfU2nTVC+IotygpP2jFe
+++bd+navwcWLoizHEy/h5QdmiEUu9L/kR9krMfhcOL7z0mETBVQpfN3JsYkn/gLyJd
+++6XES3dwHXINAp6LMfwQXOYCbv+yC5KRJ/kER/PIrY2/bwLR8eT5mOZJqtmpE3LiQ
+++UUEXcEX5ycQ+xdwYmKgGJCjmDdBhSgMSMY1dhZM5nk/HI8jRT10iJ/g6GKwsoveu
+++B8WSA4iX1ZUxRFGhaXbkDo+6ldzPPERa9yQELy8iQHW3hC35v0xFSfirL2DOvSRf
+++p3Vf/7zHn3EEF8QBO6FHCnDuHUqYXnjjv1k2f+pAQQLQQXT2yhsCAwEAAaN1MHMw
+++HQYDVR0OBBYEFAx+NE6dAvT7H5QU+yyK9wV64l/OMA4GA1UdDwEB/wQEAwICBDAT
+++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFN2Y
+++KF6DGM5YWA6/dwe9xyVJbEF4MA0GCSqGSIb3DQEBDQUAA4IBAQBsxxIbUQvJEYsu
+++jGmNVXTbB3h9yh8u0pYEBbPSTKo38Ah4OAtrpnzn3SaniRdahFegn4wmcNJr2BAj
+++8EFkNdLfHzB/NnDfzmHAfZlkf2OLgDotKTT2psL6wgWFLIu47MFoge4z4zVFLaNp
+++ESJUiHDoFIms6DXDFoKiCO0IA6sCrYEkaOBfC8IMaPyDcnIrrdEuTuZd/5DxhAih
+++jlNUPszXAh7wGVoFyKiEjbACmQXAWKvTtALNl5Z3aXeucR3iamrUDVmJyKKYsdvh
+++24dNlMF6beMl8v8tIQ0iQBbkD/jsp3SjzrANMNhgOQHKcXQ84j1C3AAkNwTL0M7o
+++05PKNc+5
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/chain_cert/intermediate.key b/examples/puma/chain_cert/intermediate.key
++index 9269949..a1d0df4 100644
++--- a/examples/puma/chain_cert/intermediate.key
+++++ b/examples/puma/chain_cert/intermediate.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/client_certs/ca.crt b/examples/puma/client_certs/ca.crt
++index c3d39dc..599b16a 100644
++--- a/examples/puma/client_certs/ca.crt
+++++ b/examples/puma/client_certs/ca.crt
++@@ -1,19 +1,19 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++-ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
+++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUw
+++NzAxMDAwMDAwWhcNMzYwNzAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
++-DQEBAQUAA4IBDwAwggEKAoIBAQDPVFa7U4cqfq2Nux7VuXIUhYtaiQwxEEZuDvGI
++-tlSVzpENnqFLbqH0QsOuxGgIZofsrSf4BrCzh4AoL3qY+HgVRCmkD09FnoWjFTfT
++-X6v7QaCtUsrb7RNASrrgyP7rB9y7sp9oc8FNJQA3gtJQxghffO9zGhnEvPt8EGGU
++-axh29BYVxvQpX1Av0SkYjTgpRus1s7r50tpoDHXhKyAHP6WEEVaN/8x1p9eXqVCT
++-XIhlJJ+dgwZz/Hfnb6gr97W5G16Ceo7ybS8syKBJf2D20DOL8kLAiNpjWm9spoJi
++-oxHvFMdDB3nUqZyRO+QU8gSoQBVYYqRlEnOXvouzqslUVdbLAgMBAAGjIzAhMA8G
+++DQEBAQUAA4IBDwAwggEKAoIBAQCxatlqNB98n2Huwg4TNhTx81t4RDUHyRH5YUCT
+++808QrxqqhNJGOSTfLDoobeObZqm8DzhZgeiMI8TQjGoQUPntARrfmS0qwBKpERJ7
+++Se2mY7J5EFZtIR4dtTlD6CPzEC1cxdgF8+2BXCb/DdSRmgEMseC32cimYZt4uumA
+++ckJfmGJst18nc8R9EPZdsW1mFjGSYrfigtqEcm4UOKnBRilMhacIXHJqUKcV6oIh
+++KXWraHLex62Mzfp+g9MQ2xEmOz6j/nJ/54xqmFNoIR2mZBAOvsKMQVph/EWFF8Ei
++++NMkzXYbePkKaQBLMsKnonfIpfPzm4Sg8V51oSOG5KsW4JLzAgMBAAGjIzAhMA8G
++ A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
++-AQC9iO5jvBDNgDmUq8+NfsAZngWLOG7IR+Ez5h3CzGU9yzcJgn8y6PMjzhgc20le
++-WYzAHEG/KXFIfubUW/9iA8E6We0hm0LM1s9o7A9JAqsHcZ/pK2QmDW71JupU8o1z
++-3Qcu7jRzPc7zYgNwaD4/ccpJTAPGg6keV3YGN2Z5RpWykOFzP7WswaMIcKQE869c
++-Tyi8i71XkVrL+xx2pRiiNDOmfMkmm8TZ9tBP7n6BcRd556TTIxhjONvmamCraBQP
++-msPnMtb8+H3/IsMsUw02/fQTJ91FVa3t914Y24+q5xmkasyrhinTNmsa/S939P6I
++-JNNoAM6TUZrskKPtb/pMzaqn
+++AQAayMxMY4+PRsjODW49e8YM+NfLIypZB9+QV432q6BTT+5KQh9DSBt1Bz5RaU1g
+++tsz0sS7x0Iv7CvRwR1iDZOv8annHcjuEgxfWJ0+PBhFi2Tz1eF4EnpZt2RcJ/IMW
+++xnsDLjRMASdmQxOLvxqz19fAQMAVw7ThkzicuW0ZMBX3baAf88m7w1Mu/V7P6rj5
+++yw+SfZv/qNakUv2yc/2xEDRcfrYuimZAmGhM/HaPsta2BpvWJDpYe1Hq8AFWniz0
+++C2epSzW+CdkpQZD/DIQmfWrWcBeb/XQ6hmouyJ6IWrgL45x7xcTLBOSAecBeZGMp
+++npnO0PJN8Z/PQWz4sd8e2dIN
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/client_certs/ca.key b/examples/puma/client_certs/ca.key
++index c689bd4..16a86af 100644
++--- a/examples/puma/client_certs/ca.key
+++++ b/examples/puma/client_certs/ca.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/client_certs/ca_store.jks b/examples/puma/client_certs/ca_store.jks
++index f522926..9071747 100644
++--- a/examples/puma/client_certs/ca_store.jks
+++++ b/examples/puma/client_certs/ca_store.jks
++@@ -1,6 +1,8 @@
++-þíþí
+++þíþí
++      \92&\89\93ò,d\ 1\19\16\ 3net1\140\12\ 6
++-     \92&\89\93ò,d\ 1\19\16\ 4puma1\v0      \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r240801000000Z\17\r280801000000Z081\130\11\ 6
+++     \92&\89\93ò,d\ 1\19\16\ 4puma1\v0      \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r250701000000Z\17\r360701000000Z081\130\11\ 6
++      \92&\89\93ò,d\ 1\19\16\ 3net1\140\12\ 6
++      \92&\89\93ò,d\ 1\19\16\ 4puma1\v0      \ 6\ 3U\ 4\ 3\f\ 2CA0\82\ 1"0\r\ 6        *\86H\86÷\r\ 1\ 1\ 1\ 5
++-\ 2\82\ 1\ 1
++\ No newline at end of file
+++\ 2\82\ 1\ 1
+++i
+++ôpGX\83dëüjyÇr;\84\83\17Ö'O\8f\ 6\11bÙ<õx^\ 4\9e\96\17   ü\83\16Æ{\ 3.4L\ 1'fC\13\8b¿\1a³××À@À\15ôá\938\9c¹m\190\15÷m \1fóÉ»ÃS.ý^Ïê¸ùË\ f\92}\9bÿ¨Ö¤Rý²sý±\104\~¶.\8af@\98hLüv\8f²Ö¶\ 6\9bÖ$:X{Qêð\ 1V\9e\vg©K5¾       Ù)A\90ÿ\f\84&}jÖp\17\9být:\86j.È\9e\88\vã\9c{ÅÄË\ 4ä\80yÀ^dc)\9e\99ÎÐòMñ\9fÏAlø±ß\1eÙÒ\r-ql\12ñ\11Zq­\7f£LµÃ\r²6\13\82¾
++\ No newline at end of file
++diff --git a/examples/puma/client_certs/ca_store.p12 b/examples/puma/client_certs/ca_store.p12
++index 2af10d9..9b7934a 100644
++--- a/examples/puma/client_certs/ca_store.p12
+++++ b/examples/puma/client_certs/ca_store.p12
++@@ -1,11 +1,13 @@
++ 0\82
++-\ 4\ 2\ 1\ 30\82       º\ 6      *\86H\86÷\r\ 1\a\ 1 \82     «\ 4\82     §0\82     £0\82\ 4\ 2\ 6  *\86H\86÷\r\ 1\a\ 6 \82\ 3ó0\82\ 3ï\ 2\ 1
++-\16¾²÷E\88\9b\17\87ÞR_Ì\80\82\ 3\80Üæ\ 2¨        H´³ï>º\87x\95\Òùë\12\9d`\95\ 5ð\85\8a\12ËÖ/\80ê\93-\93\13\18<»À\ 3õ-®µP"1¥\96Í|ª¹9O\ 5\10MO\ 3Ú7\8fò\15\ 6ølÛF\8eø«ê )b[\80
++-óÙ\9aí/1ï\e!Áà\aK\ 4L\9bÞ_É\eü'¯QTÛ45yfN/¶&°¿?Ö¶PÅÀ\88Æwí¡.;jÐ),%Î"ÚC)4¥«o½ÂÁ[ÝÀ´\96\12Ø)4\84\9eØ\9fUn7¿Ã\18\8c±Îk×/\ 5\19.k­\10Òßå\7fd2ÝíÅ%½rOë\eãwF+°xÆkøìVn`Ì~}Ñ\13\16s\1cæ:]Ù°ñ\91tT¥q_\96èï¸ÈZËL\81\17îâÑ\81:¢W\b\96|*dè\9f^v£Ñ\8d\eÙ\84^òV\1c\a\10A\8fêPI"@ÕÌêrFÑIÎf\97µ*ã\9e¶»\b\8d{\1cJ\9e¨`bBÒîö\18\84\17êÓ\82¯J\8eê\rVÐ@Ð\85Îß.$ð5¸AÓ4åߪ\1c\98 Ò6¾wë\10n\9bñ\v\9b\1d\7foªf2À¯\vØ\1d¸Ú\13Vï»-\98\ 3$^\9c?4\98A¡oó-ü+K\85\85\11Ë\13\8c:È-¼l§\ 5}7´Sþ4a\1dbe<¥ô±X\f$\ 6öµÅ\ 2F\fê\9bþuÐB\9ay?ûzqñí9GHÏ娢\ 4\96´o\86\15En\97Ù·\98~\99×&ÿùQtþ\9bÃÝÊ£
++-¦ÀÀÈ.íºBƼ>\92§\ 6ÇO\90Þ\ f\8e\99jJ\9b¿þmóÝ\88úç¾S\1dó°à\14\16®-\14|v¡í½\rÜÎ5¥9GEbôvVõ\11W}\1a\8d1ßU\15È+Îí\ 6ñP\17\1a»d9\8aqì^\96Û|æ\19E%\ 6ôµ}uÔ;zF¹\f\9c\82Q\18\1eJ³»\9e\ fZ&\15\92òòQ\r\b\11«ÑTÖöá ªSö\97\8d\1cA\9bß\11X\83Ï\9cüûB\ f\aÀt\ fÍê5_ó\87óº\9e.\ 5\88\9f$~<fv=D±Nëv\ 2|\98i4l ä\f\NÁõ\ 2\e°Ü\ edk[h³\v+\19½Ú¯Ä=ÈUEDÃ\ 1\9aÏ|'ã,Äð°Ü±'CR.\94\9f-²41g\99mêÕK
++-\ 1\ 2 \82\ 510\82\ 5-0W\ 6        *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\83 ôø`\ 3\95\12\ 2\ 2\b
++-\9aó\18i(>û\91\8b:úøÆm¶MîÞN\ 6)ìð\7f";Ô±µ7\80ðY´\83\19&
++-\1c=ð¸ãÈ\99\rÇ5F\7fi\94½ßO²\rK¯gL\9d^s@´´Sðûn«"\ 2¶äBÕòpe\9c~<Ó/ÒVT\9bÓ\80X©Ó Kú2¹«°wÖm\8bÁ`\9b¸¬\ 3*Úð\ 5$\13p\12/ÒÚ\1a\94õ¤În¢\ e=áÄJ½¥2]0´G
++-Ni\v¬Í\9e\ eE\8ewl\99Ðð½\18;¥yÝ¡3Ë\ 1¤L¾L\1dG\r\9e©\95)3
++-2\83\19Â5ñÚ\ 2ìÍ\9a,½'*\12\87\H\86\16Þ\18\88°8Vä)Ô*ýqÐ;ÕÏ@\b­}uä/F \15ù\1a§ð'\9dè\15\8b\9a\8aüAu_ìkïe¡5ÁÇpü\9f®ZSPß\b\87¡
++-eX\1c»\8b6\v\89t)>Ç\81ßá|®\8a\193ÝZ\98\90¬\7f9_1:0\13\ 6    *\86H\86÷\r\ 1 \141\ 6\1e\ 4
++\ No newline at end of file
+++\14\ 2\ 1\ 30\82       Ê\ 6      *\86H\86÷\r\ 1\a\ 1 \82     »\ 4\82     ·0\82     ³0\82\ 4
+++\ 6    *\86H\86÷\r\ 1\a\ 6 \82\ 3û0\82\ 3÷\ 2\ 1
+++\ 1\ 2 \82\ 590\82\ 550_\ 6        *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10\99:\19ЬL2>\15Á¶#H \v1\ 2\ 2\b
+++pac\8f¤\bèuÎ
+++æI1t^±þ*\8cqÏc\10        ·íÒ\1c\9e1o\ 3$\87~\8d¤]¦ø¯Âù°`;ö<Ø\9fåä\98*\9c=/ôÛ¹Ý\95ðã,TCUu\8b¶­ý½7«`n=&\16 ðgZÅ2(\11LÐfÞG\80Ú%_ð\9b\81àða¿ÖSÔë&\9a\98\88
+++Ï}!\1f\97\18\80R­hCß\96ÿ
+++\9f\137NâO.*î¤ûè\87?mÏ\93\ 5n1\9e\9c     }\9b¦ä\1eR&çjË0êfWúÿU*\85\ba+ù\12u Eøý\rç\19÷|M}»_å\ 6(Z\834z\83ÞÃýÅ/\ 6\83\91z¶ÂQ\8e¨tϸ¶
+++Eë\82\10N{×/°ZͰ\95ß\12Ê\80\1fÄ\16)¤Kê²°|{épLúêétz^û\ 3\1f\8b0>Á6#M\94¡F*´\8f\84­iYî[4Kþ   *¨\8d#`OØö71b;\ e\95¹n/j3¦<#½5\8cá>3APz°\87?ÿÃ-É|´pg?¬xÁ\e,ý¶\88#\8bÒH\98\ 3Nl+OdÑì¼Ð\1fø\7f=\9c×Meht}\84\90\rî\98ø\b½\ 6\7fÿìhà\94×\8e0¶e¿\f\12\r¿\950\ 4\94\13ºkç»âcýH\9d\97\95®\e¼c©"\ 2<¤Ç1\94[8Eo\1fýçXc)6UúúÊ/'® I½­\ f\16\1d>\rö\88¯,\9fH\14\9b©å\90®\eë!¤\83nr/$Ï0\10FZs%ßzÿº\8e×Gp\ 5\ 5þún¼nrµ\83Vî`,f\ 3Ó\1c\190¨µ9\1dhñìØ\b\ 5.k\r¡éc%±\83r\97tt¢Ê\1aFR·\ 2Ddø\95\8dXTÜ\92\1a\19©ö\83¶"ä\9e\ 6Øû\8e\1cÆÚ\843óÌ\8bÑJ\9a¾À!ï5\ 6ü;b\11ÒmOd=7T)çç¡òBp_ ;\8eî U±ï.|Ì\9f\ få^¤ôÂ\\91\80\83\99Åù\fS"\ 1º]ÏÇãÝ\ 4êðK©\ 1Èó5%(qûf¯0Ý\8c\ 6Î>\8fd\9b÷ø#\18»ìÏRø
+++CÒé\ 5»%\9b \81ظÔÝYÕ³ÀD
+++lªd\12sÍÁ"´²óZØ\83¯Ká<ïÖ\17o9¨\90xlnã\ e\9e]W£\f©\8f\11\91}y\ 1¼"ðA sÒÖ«\8bUn[\95Ç\ e\8f¥q¶Z\96\ f,Ä^í\1fs/ý UL\ 4\18¢¼Ý6Â\93t¢Ï:q-\90B\9a\ f×J!í\ f¶×0Éð\96\87kYUÛän­¼\92»\ 6=MÓìVÌ\1fÜ\eïþküãmzÇlU*\87¼G+ù\11<M}\14\9bÐ\9a\9e\9aÉ\10Ì\1f­yøÅ³ª\ 6\10,Æ6n\9c\88«\8aÂ\8a\1câ`é«\16_và¢Øÿ\ 3\83òï0©Ç­!ÚÇ$.·%®\98\9a°µÖÕ϶½Úô\ 4\83d\1c\1fÃ:ÁÉðÜô&ö~·Û¤m\99ÓA\11
+++\13@¥dFQùBC~~ÛpR¬ Ì\88T\1dg\98D\8f?êÜ/o[Å9\84Eí@K-*\ eð[WU\96\ 4EÈåâè  ÊÄ\9fì\ 3\ 5ªLD£A\16÷Þ\1c\eiy21:0\13\ 6        *\86H\86÷\r\ 1 \141\ 6\1e\ 4
+++Ð\1eûúk\17'¶¤A¯Rýtp\94íd(\986\84\      4Õ:V\ 4\b£>`4~     \ 5\ e\ 2\ 2\b
++\ No newline at end of file
++diff --git a/examples/puma/client_certs/client.crt b/examples/puma/client_certs/client.crt
++index 79e7f6f..14eb1dc 100644
++--- a/examples/puma/client_certs/client.crt
+++++ b/examples/puma/client_certs/client.crt
++@@ -1,19 +1,19 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDBDCCAeygAwIBAgIBCzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++-ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUw
+++NzAxMDAwMDAwWhcNMzYwNzAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl14vsZCU7E1qf/a4Yxs/SbIf/Pz
++-PW3Thbhno3JAbsTUpf9zkdDRB8fCn+R8SnJVZhCRYhUA3lNdZIskQp1h2Ix9TZxj
++-QSo29ixzik0fTd7nd4KC8WOpZUyDs0U2ugmqomJXP0e/AiFpN+3HmgTWJpDx2oET
++-Lcdl70+wRBkF2FDRJU/5KvArUnaGXrqW645GH3iXMadQRpEWBxFP/+aiz0FXqd9Z
++-IWSoobf03dY/tIaxCrFe2+yljBB6eI/oHWs7Y861JN+nRcJrtp4LmeCdDXzQN7/y
++-xDg+NVQy0sEltIMTgMyoIsb1UPD+IkepT9GKd09M6p63BX0SXr5YPhz9iQIDAQAB
++-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHKYzIAjmllB
++-n+CRjYjtwPrkVT8azecL9efdBvE90KkGnIvRzNe4vQdH0mT4R+RUOXO4mbhAT6tX
++-zOpO2gPldBAQ1GAcjs1XJPGxSqKUO8B69Nv3mXqwR3FKR4ZGseC5MXjQb5dZc3An
++-NJZy6t+7gO0nDfV361JJjXvNdHd0cfx0aCWdTgQWxt9RSnH3QxvVbdXLAPvYyb1g
++-Ueao9M5PMMx5cAgq4ORM+TxPJxTRj2BuRj5coHsPn7R4dkwWP59+h6Vgdf0AmeUG
++-Jmdrul5ESeACbs2GixZdtqLT9QUJhTAFaXpJd3IUYyML1V7qRk1FJqRvatYxhBxQ
++-gjZp0ouJRCY=
+++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvAuT6k08rCxgTQtwtZ1PB2iaVTAE
+++Z/DTKp1bUP+A06DslWT9tng5bxUNMD/8z/D4sOKzNTds9JP9QmJsgme1qlm+pIRQ
+++qgejLw6hG3v4ZdTe2CTvfE08lJlwWVU2hoDLDnurXWoQE3SSAzfuoeg48EZ8tjug
+++3KkxbCR0GUzk5aof8fskCapybRGvIek/xBkVKwEVhrvNwCvIwvw2SRgGuxHuZNCk
+++kq3pptuVC4e14RglByVV0C6MkNMP9CDMXILZfTQRnsqgq67MuB7IUbVPH6VUYqwB
+++IIR0MW7lLFLkB6x9QOkCdAXrzqKFeNeWxw2eyV2ueTDQIqsx0fx+SylDPwIDAQAB
+++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAKlWE0BFzumd
+++XtXSiD8AESuDWHAdJ5l+lzwGJ5/qJHQMTYg+7IwVumlf9z2rwTyCRNVCU3t68D7/
+++8d4l52+DcmZExa8PXnkAotNcV4cDps/ZJt+k3stYSAL2zzxOCKEaysd7UvL/b61g
+++t0Xyg3jlg5svhJomHuevB/db9oRUCxlSuSTxjeanVyvgXlURBOLT1MaN3tNhtBJM
+++RmkpGupNeS6Zwuzi+Ina2/TfmKSwtoKMyiP/QuzH7wAV0BCDsDPT32CYkvuJ9ARh
+++QsMK9a3oromDxKx98l9FScYsH6SkPlywXF4ZkimZj4Wtni5kHkeFAbc6KuPanYIL
+++eypAAM0Zm4w=
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/client_certs/client.key b/examples/puma/client_certs/client.key
++index 371a4a1..9a511c3 100644
++--- a/examples/puma/client_certs/client.key
+++++ b/examples/puma/client_certs/client.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/client_certs/client_expired.crt b/examples/puma/client_certs/client_expired.crt
++index 6a6fefa..58e9c98 100644
++--- a/examples/puma/client_certs/client_expired.crt
+++++ b/examples/puma/client_certs/client_expired.crt
++@@ -1,19 +1,19 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDBDCCAeygAwIBAgIBFzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjMw
++-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
+++NzAxMDAwMDAwWhcNMjUwNzAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzl14vsZCU7E1qf/a4Yxs/SbIf/Pz
++-PW3Thbhno3JAbsTUpf9zkdDRB8fCn+R8SnJVZhCRYhUA3lNdZIskQp1h2Ix9TZxj
++-QSo29ixzik0fTd7nd4KC8WOpZUyDs0U2ugmqomJXP0e/AiFpN+3HmgTWJpDx2oET
++-Lcdl70+wRBkF2FDRJU/5KvArUnaGXrqW645GH3iXMadQRpEWBxFP/+aiz0FXqd9Z
++-IWSoobf03dY/tIaxCrFe2+yljBB6eI/oHWs7Y861JN+nRcJrtp4LmeCdDXzQN7/y
++-xDg+NVQy0sEltIMTgMyoIsb1UPD+IkepT9GKd09M6p63BX0SXr5YPhz9iQIDAQAB
++-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHclwiffmiFl
++-uMlhnVbcw5UILFnZLhrT5Ufxg+dpPVpd0s6vZ/emw0QgQHSUwBfo0l4De3rA4ZfK
++-wqXv87c38tA9fZ6Schj+0m/pGFbixX3ptw9jm05V79broPgzSflEUKpJiyYJmjnK
++-3ZfN1JoxYsd3WUrcbxnoOhNEbHuImyFn6sd1Aw7o4+Zs7GcKvKfY5n+anATy42bL
++-ODnB/XJf8sZtevb57ceiKGIoGbVzrdi62QY3uQS8Jv1CAVzGHogW8mAw1yjE94v0
++-vcV7U4/v2KNt2UqWLHjIpeefnN+7scbX4YAz+UXbBZ+1DwAgSZq+oyzrBn2RKggM
++-LSUeS8vdfds=
+++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvAuT6k08rCxgTQtwtZ1PB2iaVTAE
+++Z/DTKp1bUP+A06DslWT9tng5bxUNMD/8z/D4sOKzNTds9JP9QmJsgme1qlm+pIRQ
+++qgejLw6hG3v4ZdTe2CTvfE08lJlwWVU2hoDLDnurXWoQE3SSAzfuoeg48EZ8tjug
+++3KkxbCR0GUzk5aof8fskCapybRGvIek/xBkVKwEVhrvNwCvIwvw2SRgGuxHuZNCk
+++kq3pptuVC4e14RglByVV0C6MkNMP9CDMXILZfTQRnsqgq67MuB7IUbVPH6VUYqwB
+++IIR0MW7lLFLkB6x9QOkCdAXrzqKFeNeWxw2eyV2ueTDQIqsx0fx+SylDPwIDAQAB
+++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAJMDA1om9i0I
+++uRNtBBYk0k6/E0Tu08VPzJNsBuO16x6wpG3icESNIBoC04Vt/POxcJGUCxJhs9z6
+++k69lY/hXW7tLDSbKVTetV77j+zzZoHo6W/Hh2hCOwXJwVc1qKc2Aj8of42dSH2vd
+++eXL8PCc9Yk+nRCs9R6xUAdE9t06dVUxvRb4B67RjhLUXvC0Q3sXHEbqWZir6aNhW
+++NJQ542RBLFM4XKOqrybZblKEMXIIz8lK+hs5qDRe7DWd1alunl1L2zJzXwZUj756
+++l4J81itIG0LcBluOQKTPhYpZCPo0btK9UiUFaCxdkW0k+q4WOcA1xBuz8F6hfd89
+++UGtEB8nmOHU=
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/client_certs/client_expired.key b/examples/puma/client_certs/client_expired.key
++index 371a4a1..9a511c3 100644
++--- a/examples/puma/client_certs/client_expired.key
+++++ b/examples/puma/client_certs/client_expired.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/client_certs/client_unknown.crt b/examples/puma/client_certs/client_unknown.crt
++index ed467f1..b6b66fe 100644
++--- a/examples/puma/client_certs/client_unknown.crt
+++++ b/examples/puma/client_certs/client_unknown.crt
++@@ -1,19 +1,19 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDBTCCAe2gAwIBAgIBEzANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
++-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
++-MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
+++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI1
+++MDcwMTAwMDAwMFoXDTM2MDcwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
++ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIw
++-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALpCL06kbLE9BNknrrRVfW5YgkoJ
++-ih7EaPNNNqmUgnIsLBjPcCZ7qlsMaUa2ft0mRFxniFkccdrHKox1oAZQ4WrOV5Ls
++-pcLktNTESkuMG5oiobsASItz125YMoEs/q+cLhErf24EaUAhXjn3/ebvCwtza1il
++-7bL1RS0iwfkCS68cQi8MI+tQlBebcSUoWazoitg5YituPKNj493tS1nO5pL3vZuG
++-6tNmhLr8lW+3n4Fi8SElC/pBWiIvsUhaUZzRjrcyPeMS7H2+zdJXDgTj++RNyP0U
++-TLZzFigeZJXNmHia3uneHw7o3d4fyZERuBl2d990iboLbtPh/9Pf82bBIU0CAwEA
++-AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBO7O5IQJHh
++-4ENYDw/kJFdye3l204JSDrFMP8uMIWQLd1RiI22CWjoyhUSfoyumrzykbPNhxf4w
++-kj1E+z097/8Q491wxbbLbE1hfNdTtx35dnCUVGPb9lCP4YLK3v3swXw4OklVdsCb
++-k/cf8s6BdNKVPdhO0zXRBdCbq2Z2PPpzQtaZ2qH739v2tX6CulB68hUO/hQeQINA
++-eJGMck7mlR4FOE76IeHKYy4F2V4S9iNtkqvkf7M0wfdRwZFJqbdZBXTjRpOVMXgr
++-XFGvANl9HByFudJJHk8t+NmkIFP6rj5xQSV4i31KQQHMGNr3hCKgkk7X6Wn95BH5
++-FSJcNlLR8BuJ
+++DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMAqcKCOd/f/Fi9CPDGvS3/IkhEk
+++Q08pKToBNsaybIaoZq0cqjqrRT0/szOe1WfF6mYIeEnN54PlEEn4MVo15BxnqmEi
+++Ow0Bh//U0IOgLejxj5XS0xRX/01pGojgjW5wTT+gDu/WFcMWopaRS8c2b5HY2Egw
+++5Y0a2nNrMQr+ZEAITGME0mY+nr/CSEJAHRtXqJ/JdwKTcrEWPEFzRdBgQATucCdG
+++NYcEyg2iX0suE5l4ocGHIub7/XYnYnABpY4LBVutjQ5LEDOc1RVeLiYJt5GKKnTk
+++qUoUSTAuISkFwKCVa1vYQHoTrWKC5mcx697QnB0B2QDQq1+homQpLu+KhpcCAwEA
+++AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBLU/+Nb6ZM
+++QV63HgVF2RZ/q2zFjziP4qZS07WYFUl51aOH8xZ4D8wrjI949LHcloRsyky65T4s
+++UH7kbgvd1MasHHWn80tcH5Wq2ekUGqdZsH46dmq6/QLzNb1/zdZTNmAwuGf5m9DM
+++R+hd6qMbt9a3DZn3cznNXt6/pqoU570fmF/VchZKXj7rfo24niddBKXJbBtQkNhE
+++oE0RPCi/mvYeVkMtJKZaX+ua0L/rn7txKqDusWHcsd5Bkmew6gIT1mI+PSNlO6b/
+++wfu9YKTuGIhWbaqNET9T83mNgJs3+acdiphFLZWqsQOmyWC9QTZGjAlVyhFW2SJq
+++M15arUrhr8Yu
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/client_certs/client_unknown.key b/examples/puma/client_certs/client_unknown.key
++index efa436f..90ea42d 100644
++--- a/examples/puma/client_certs/client_unknown.key
+++++ b/examples/puma/client_certs/client_unknown.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/client_certs/keystore.jks b/examples/puma/client_certs/keystore.jks
++index 17e7d5b..574fd32 100644
++--- a/examples/puma/client_certs/keystore.jks
+++++ b/examples/puma/client_certs/keystore.jks
++@@ -1,27 +1,23 @@
++ 0\82\11$\ 2\ 1\ 30\82\10Î\ 6 *\86H\86÷\r\ 1\a\ 1 \82\10¿\ 4\82\10»0\82\10·0\82\ 5®\ 6      *\86H\86÷\r\ 1\a\ 1 \82\ 5\9f\ 4\82\ 5\9b0\82\ 5\970\82\ 5\93\ 6\v*\86H\86÷\r\ 1\f
++-\ 1\ 2 \82\ 5@0\82\ 5<0f\ 6        *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14¢\1f?\9bÞð\ 4"\9c¿è\94\1d]\ f2V.%m\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5
++-0¤Pßíg\8dçÚ}\ 4\99\97£6¿W°   \a©yb\9e\18ò*Io\9c\8b§uö\ 1ø®\9b["5\13ê¼DX-ËÁ\8cg²íð\82£Dw·¢\13æòË&Ùm\98\10\90É\ 4OS\9dó~ü\88\96\98tUK%«ô\8b>>]Eö\86\15_\ f=\b\r\96ä6,Ö-\97µ\9e0J\r\85 Ú÷¶¹\8bê\9f\9c\9a\13\ 1\1d\82ÎÁ\9fbõí¾\82
++-æ³6ËHçD§E)R\89ìo;ä\ 4¬\86\12\94x\90\17­\r½)Ó.~i\16´ø6\802 M5\99\ e¢\80»:±\92§ÚfÓ¤\82EÔþºÖ­LÒÁ2=îg@Ò!ªó/¦p=À\97øÏ̪èB\7fÂÝsã\12Ùª\88ârÒ\ 3rbh
++-æqñWÈóÓÁ\1e\ 3\9bv..\17pöA~\13¶A\ fM,7ß\7f\83ûWmX\ 6HÐeÃEèH;Ú\a\9eLKC\91,-\ 1TMjêÅ«ô!Køuojó\9cNxâÕ\9f\ 4Vãoª³-ÿ\9b\1c5ÿ5U²&$µ\13M&ÿN¬qDX\1a%\8fîÒ\f\84\87
++-ÍÚBJ\r\17 Õ,\br\9aN\a°\1cüú
++-®xNû]ÄÑ\1dÏO²eZçy-è?Â'g.¡6\87Hýç\9fh\ fþÓð\12\91µ\b|óo\87\1a\1d½\éE\9fÛcµ¹ÌR^&|tÕÇ\11ÿ\f\r\9e¬\90\v\9bã
++-Ò\1c$\11x\81Öb<\13Åæ²^ªO\ 3\8fÝÆ×\1d&£sT\9a._\ 4f\1dýø7ÿ\8a0O\9e\88£·!^û\1eeK\ eü\94\ eú-ÀÇ\ 38\14¦\a¢l\ 4B,Öå\ebÉ\\99½ä\8e\8d@\8aPõ`c
++-O\e\10úÚ«-Ó\ 2ð\f9¥«g\12\ e\1f\8eì$1Y\1e\12\ 4\1f§õ\82Û¯\16ìÁ\95\ 5øÒ1@0\e\ 6       *\86H\86÷\r\ 1 \141\ e\1e\f
+++\ 1\ 2 \82\ 5@0\82\ 5<0f\ 6        *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14À1Ð[Ç\eEJ*¨Oj\10F\ 3Wv§<\83\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5
+++¬\10ª[É\9e²Yó
+++nÐ\1dÛ.¦\84\83Ï0Áñ)Óq(ÙÿÜ \88綯EÊ\ f\8fÄLÎϲü\1cK\96>tXcèí´nÍýd"ÏÃXÜgÕ|\9aÜY\8cT¡h¿\ 3\9e\1a¹NÎþÕp5\1e9KÙò&ÖoÆ\17Dº7\9d=u\8cï\89À.\82¯\96wË2͸µ<V
+++À\88\14\9aD£ 1iOl¹Ó\f\9c×\7f\13÷ÖÜ\97¶:ÁÜ\83Ë\b©G+Wâ\85\9e\91Ãå>´b¼ð¡Ã¶þEô¢.~Ê®4\92%\92zAjô»[-Ñ·\91õ\1c\18\ 2ݾ7\81\ 1\91ûÅ´µ\14á)\fù;\99ìfâ8 |Íp©;¡Õß+\ 6Ý6Òê\95<j)í$\ e\1f\92¸kq\b6r\1386¨\bBéÊ\966GÜ\ eª        1|AÁþ­\1d·±^îd'(\91\f\81Ó\ 4e\8fý¿\1e Þp½£\v&ßK=L\93¾\ e\9d\8fO.Ìïsá,â[7qâNSq\10Þs\93Þ¶ýá5ä¨\f\aZH\91w¡;\8e¸\9aÛÔ\94¢D~v0±­\11ëM#éÿ$èÍ6ï\96íÓW¡ì\10\ 5\8e\1dårH
+++;¼9\91"\9cÛµÜ\v\ fÂ\86Ø\9e\11r¨H\8aº:ÿ4 ;<â®awÆ2\9a\8bs\1dëü\8ch.ü\85¥G¸÷WÀpØ_QÈ\82è\1e\18Å\82\91\7fDѦS\87|¦½ùö\9aü\r\84\87\9bÍ?=Ì\13\88#2 Lo\1c\95»\ 1â%@\15ÚÓæ%é\12\9b·pv\1e|Ù!\ 5\ f³°4$¹{\ 5*ÝP'\83\96\1cO"÷\ er\9eo(ù\19É\1c0\84+1X\9e¦³ÿRCMµÒ0\ eÀcj(,\17ËFo\83è\ e\91õ,o\1dn\8e)2+\99\97r,çEÉU\98>\vÇ\ 6\85\ 5ÆÆ\vçd%|'\ 1ÿ\12AxÒ\87\10ò\ê\90\ fÙ \13öÌ\97Ð\9a\1d\9f'\93\ 1µ\1e/\92÷F\²\10ú\12\9b¯ë«ºþ\87"\14dn_Éñ1X8\99
+++{º\19\80\8câ¼Fö¢Ô¶Ý7È\9cgv\ 5æÐÿ\97\b\ e\8099»k=º¬­&WÌ8\ 6\90\83S\9cPs#\9a\1f\9a¶üë^¿';ÆÍ
+++å\1e.\1e\82Vj\81aÔã6\8f?eIÃ'¡p\94¦­_\97\94%<ôò!!z\1fs\1a¾\1d\9d\7fï7\1dÿ»+\ 3¶H\ e\97fÿå~zê\ 32âóI×®«í\95w\83\9dý\82\1c+,øpÑ\ 36ªSè\ 6\99.S\9dJfÍ+\88\851
+++\ 2\9cÂ\94Ü÷\80jÁì\90ö\90\ 4Cµ=Þ¬\87?_S\96¿\8f\9fÀ³H\19л\81\1f\95W;Âik­J<ÍSYð&\8exG\ 4uùýü\8e8> \vi.²Y\16\93¤°Ê\1a\9f\99ô\8c9\92¿Þ÷\ f\94¥6\11\99
+++ã\8aÛ<Z\7f\8d½ýÔÒÞûO\9cÇo,\19Ofµ!K70$ù\84 Â\1f<.\8c¿¢/j±]¨w\14Aµ£ðÏ\19FdÕ\99
++ ò0\82
++ î\ 2\ 1
++-ç\ 6   *\86H\86÷\r\ 1\a\ 10f\ 6    *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14^AM\11\96\80\16óÓJ6Xýk+\85ë?K\8e\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5
++-puû\93|\94¾\1e\9fÃÀôs!c\19\boCpRì"å\18E\9c
++-\80µ*ðë#n\1a\98ù\92æ\b'\95ï     Ç\9eò@\8bãU÷mß
++-\16\ãŧ«\80WøÃioÙó\94\84\979#Ëø\1fSw¦Ý'C\ 1 î]A\eI&¾5Åù¶CjQ'*\9d51²\7f\8f\9bqLª\ 3'oIëôLl\95\ 6\ 1ÓË?Z\ 6"« \86 ¨>­{\16CßÙF°¥rPf\133\a\ 2%në\14\1e]\8fz\99\v&x?Q\1dÞ\16;u\15ò\1e®/¤A+ZÆ]  \83ðB\8a(Aí\10\f¬Â®kP¥\935±G:Î\15Qº¨j\92À|Ö\8d(ç9¤\99ºËJãºLìknCj\9e§v\8d\88\ ex0­Ûh´Q\ 6\1cÜy?¤ù÷\89¢ÚHÑ\1fûI(1_s\88íR\85D\93\97\14\84+¿»ÈÁ\84\1e+Y\b\95\11\ 3\83co\84ú\11DSáRaÊ9&\1e\1fnÇC3[9\9b\92S\88þ@3F\91ä¦oÖÁ6ýy\1cO\11õ\85\1f\19\89`+\9fG"I¨K\ 5ö,ß\87\94\ 4
++-ÄÊÊ\9bPP\87¤õ¼\87\8cZo³r\8b2¹¤â\e3Ť\rÅ\83áV½\9fò\ 1\v1*\10*«Ïå£UïÚcÐ\15SR]\ e\8c½Å@=\8a~\fd\855\16?\80Ïï:\ fà\83\r\ 6s\83[ö(V\99\17Ú÷*\98îÜ\7f\aW¿õfR¤Ó_\9báVðUL¥y\88úÓ½±,ÀC?-\8bò³.½,±\15¯vèÈ|ôk ¹Ò_ó \866x£\82è-\92µàB`÷\ e¸4\8cc\16\9bZñ^Z±Y÷Ú\9f\ 2K\95\81ÒB\95öZ7\9cIB[N¤}\ 2  \9f\9d9¥ðxå*`Bý)Ò\9c¶bÐ.ä\95D°t`\aÞÕ%µÓ'©gQÁ»\1a=Jx\93\12Ýù2Ëà.\10~\9c#\ 6-\f[@#~<B&\16
++-\9d©Ý$=D\ 4\\15\80ØÕÉQ\1c\85\85\8d\88\9a±|Î\99ÄÄg.\ fÀè*±×e¼w\94ã\96m¢n\84ã\1a6JÄí\1es·¢é>ÿ®\ 4bYö\93\bõ\ 3!òð\86êi¥á\7fÑ(Â[\8að²µ
++-%¢:r\8b_?òÏú½Lð¿;Û\94tÖITPov[\99\9d¯.ðÄô\89»µ\1d\ 2ÖÍ\15Ü\92ù,ø\81t\9f\8cùE²z.U\14?\10\15î<\9az\11'\83(OßÜFgiKnîa¥¿6ÖµÃ+,Æô¡¶o«\1ec÷¢\18Õ6pkús\9eà¹7ÕCµ8¬!\10/\87\ 4Êê'ý4ÙÍ\80åÌNu\1f\97M]\84>$dp .ûr6`I\1c#§§ýt[?D\97Ë%¨\81\85\94U
++-$ÈA¥Ù½×ª."]\9c­Áqá\9a\ 4â`þßI\83!U
++-©½\ f\aÓt§5u=­@±åô9ØÂAß\84ÉAð\1cãý\81¤\7f\80ä\15\16\12Òá\ 4\12^[
++-KAÍ,\ 4»òq,Û¼\80"\ 6^\8e¡¨\89íÝ\94Þ'©\83ÿ÷¨×\9f
++-Æ\87{¤Öy\19\89\98­\14ï\96\ 1¹;&o\r\82Íô9¬\82\99M\9a°·\14¦ñf8è\82\91u\85\9c\90?\ e]aE\85\1cËý5´\ 3ã\9c\19¯½h\9f\12Èr~BÖæ\90Á\96Æ \1d#rÚ)\ 12\19)Ñ<\r2Z\82é\95ã0<]ÔÓ\96Ãí4\11\1e»C\11\ f¯\8eÎX«[\13\87¨\18À¼¤ÅIWöAè¦0öç\81»\ 2"\9dgTþÜ\8fX\17§¾þA  !ª9(À\86¿/åÝn7ý!\9b\ eW®¶ä\95`Ó¨)Ù\10ɶTüD\9a@)\96\12³\86\94°HP\\9d\8c\82k\ eI4ÃÔ¾^­\9b\84\10\ 6é\1c¤\19\82\9c\ 5\89¯4H\1a/\1a\8bú\bØ¥¤\1c\f^@6þ­vJV.y18D`Ç^§\1cC7\vô·T:³\90ÉUJMÞ\81\e\avY\9eT\85Â59:ø\8f£\9aÑ\9fÍ\fö\89$:¦^øWk\ 6¼sc°Öx\85ÆÉ_TjÔË
++- N«^\82N\90FI\1d\b  \¥%\r\899u¨Ã3\95Uí\\15 è\89\85\8b\7fL\18þÀk\9eY\8a's\aR_\ 4<;$\ e\ 6$\99\18¦,W\8cÚÌ+\8e³vü\176\ 5¦M\8fVÜ Vz®\91¼\\11÷Î\8b+ê^51\89Ñ      \86«\9cfÅóðµý>ù\82\97H\r\98æG 9\7fºÞçÌÁ\8aì\91ö"µ\ 1ôcÇë\90Ñö\97]\87\97që÷\81AÁòèÉ\a\e¢\b
++-\12\87\ 4\90\8c&\ 3%[\83Ïu¥öÒî>\12\ 4»»èã¢\97dLÏ\9b\12¯\fù®n#Ï5\93]\97\99ý\9f
++-U\92¦\1eÒ\9e£{¬E+x\8dÇ\80RH8¨¦iEæ>Q&\b\\ 4À!\8bW?ALë\83aAø\10Å\8e\19ª`\rº\17Ei%\98Hu\17Ø\83\ 5ßÔÐ/³¤Á<\1aöÜ\ 5»\ 2[Hu\97\b\81·\ f0\ré*¢\94\9e\1eÌ|\fÝÕÌçFàÌ{æä6\9d¬>¯       P¿¡1ùÿ\13\87\8b\ eø+p\95VA\rCÞ4î¤Ñø\1ddÆ?I\v\v=,õ!\83×c¶Ì\81ÉùL\15®ú\81\96\1fÁ»^0Ý\85xkÈ®\94ÃE\1e\19\89» v\f\1e\9bs\1aÈcò¾äv294ó¦gá\91ä¤Ã\ 5\ e·)³àÅ·Ì©ÉúÇ/\1cå9AÒµ\93ôѱ¾¶\r\ 1kÎmjô\8f¢c-uÏ\8b\99N9z
++-\95Ü
++-µÿº ¡\9d\9fTK:E¢\80?\87ÂôÝA\8b²p?
++\ No newline at end of file
+++ç\ 6   *\86H\86÷\r\ 1\a\ 10f\ 6    *\86H\86÷\r\ 1\ 5\r0Y08\ 6  *\86H\86÷\r\ 1\ 5\f0+\ 4\14H͸@\ 2\bÃ5\rÊØ\ fÒ\ 6ÂÙ"\11\1dÏ\ 2\ 2'\10\ 2\ 1 0\f\ 6\b*\86H\86÷\r\ 2     \ 5
+++p(G\ 4\9c\9eÂ)Ï\v#õÏs¢>£i\10¼mh%äN;Có;Îr§¯ç\9dÒ\13+\ 3Ù¦u\aÜ*³®È\10</úpNs2Úª\8eóùF\92?èÕz¬Zý,ØR^Ý\87^\v¬Í\\19ýó&\8cXú­È¼Õ­3Bµâ
+++y\18An¼äE\8b=}"o\18\8e\1c\16&\1aúëë\ eÃ\e¬Ä$ä\1dH\82ËÀ`ÒìCA\9bÙ\1aJ\15fvö·I\9fnùÆÏ\e\15~ѨÖ\ 3;\12\94ÅûlÆKð¬4·)SP]\1a\97H³w\f\15VKéD>Êè\ 6Ó ß\8b>\9d{\18îv\92¤L}É\f\9fÛ\ ff$ªÝC\946JÁ\a\ 6ã\12\1f§ã¥\17Û~}1«µx+Ü\82(ô~)çoÃ#þ\ 2ÀÆH¸¦2\90k\oT´\80¥gÓ\1fñ\94¼Ð\86­ \81\ eÌ\ 4çÇ\ 1°\ 1\a³(Òd\12ò!\ 6\8c\ 2ômàX1ò\9aÄÐÚzÖo\1fóMFi\ 3#&æ5 \8f\85\1d¸\88\ fyÙ2\82Û\1a¢¬\eÖè\8dÅi ìç6\ 1þ>í±ý¼g9óêL{X(Ë|äÌÞ\1c\1d\9ccv#^x\8c\90^y\12\8djܼ\8b«Ø¢1âZ\85$.ìá\foK{\90\8bq\98\99ÚA\86g\19\bIðV>\85ë+2¦äT:ýòdÖÖ ´§\8fávUó\85\12yرçÞü\91í®¢\18ÞmÃ+E/¡;ó|°\7fÏs5\80.\1f\82\98\ 5\15\81V515\bH\96Iy$(\9chÃ9s·\94,\ 1è &°ÿ\11P\91\1dk\9aO\96h¥%O\vìÕú\16_øh6vçp\ 5¯º#m
+++j&\vM\10\8aÑÀ\90Â\ 1\12\93^:\91\99\10%»Á¡qìÒ¼\1eaD\16û\82LÙmÄ\8d\ 4ñ
+++l\1c\1c
+++l{7\e\14\a¾þ\93Eí1ÛÓó
+++S\b ï
+++>\9f4c\16å¶\9dÂCÎñÔçÁØó³Ú\18\99\81À'þr/¢\1dHÛo\fн  Ë\8cØÕB\ 1\12\9a}6\v¤»\94\8b1oY¢\ 6y\fá\f\ 2s\9axu\84ìXÏÇða+b]³(6\99ì\15"\8aá\88óCÅË\14pM6Z²²Þ¸\1d¹\85ú»ÙÐ[\965\a\ 2\8a©á9\951\8dÌ\9c=X\ 6\ 1ð_\8e~÷p\8b¤v~z\1fHrXÁóvÇå|%«PÙÉ\8fzÐ.ég¶\ 1 ÐP\94U\90\ 2y¾V1Ùþ¨ª4\8eÈNÎï\83wñ@Sp\19>>Ù®ÊT·P`E£\ 2\172"#:\9e0kFÁtßCÜ}\18\88\15´\90²¯j$q\86òÌ\8fn\1cê\8e\87ò*ô\9f>\93q\v\ 2\f7\ 2ånmý°Ã!À$\944\10@0ðq¦\ 6Døm÷rîs\14géï¿ã\17\9f\96\92gítÅ>¬hÍt£³A\95\b¸ÀDÿO\1edz&¬¿\14~\80µÕ\95ñ\89ÀI«\89\9fvdJ¬K\9f\1d°Gw        W\86©§&9?hªOʯGO\1a°ôö¢¾\11|¨´}«Ëê\99òeö>÷Ðt    ¯\99à ,§y\89½\9fÞdȨùûX6}\8aO\ f\16 z#\11ü÷
+++]\1eU̳wÂâ1}X\9bsËà^7Khå\ 35üî=H\9a\19é\1d8\ 1\1c×\ fVs\aºï\9dÕV\v\aæ\80\8b~\19ªbÞÝ\1aÀEâ\82\94\ 1Ólv\9fl\1a\82ׯ3þP-\80r,aÂ\83\18\b3\8bôí
+++u\1aý\15_.u:?\1fð¥\9cç5L:\1a­`¡\9b®àÁA\94mfé£*AúÌ\1fí´\V\9aó*ÁÝ\1c¨%e!\9e\vwÿQ¶+g\996{¦ßÁ\8aª%\1a¼á\15åsa\80£sÒPéŹÛ÷\7fFþn¨Y°âfTì&TìËðñ\ 1ºDK\10\87/!T&X\91""Î(\999\12Þ¸%\15\8fî\96c90=KÞt\97 u°S\9e\12\18.\16Á\96D
+++áòWÌ\8a\13N\8a=DÜE·8ónæ\b0M010\r\ 6    `\86H\ 1e\ 3\ 4\ 2\ 1\ 5
++\ No newline at end of file
++diff --git a/examples/puma/client_certs/server.crt b/examples/puma/client_certs/server.crt
++index 1335881..3a7cd3d 100644
++--- a/examples/puma/client_certs/server.crt
+++++ b/examples/puma/client_certs/server.crt
++@@ -1,19 +1,19 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++-ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjUw
+++NzAxMDAwMDAwWhcNMzYwNzAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
++-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxqbRfVxcH5wKCTGfuZTVisUKUIWS
++-TUOWkIoyIfBKVknREnVSN40aw72bs9GDh55F+R2IJ3y9F7TQXo0Y6PJ9tFXZqJMb
++-2NHXYTfhQCSN/w5wqKIrWOR7wbA4JHjs6x/vHYnjFVbvbx43M+wceKsMBlQ1eDLz
++-Ukr5vjLGASmdgzTq8AUd5bNKiNq+ERyAUTcuwXWC6ndXNdr3vdEgcYnzPWtgM7eo
++-1SpewqCqrlSeA1dzXThB8vCFkCNy7DYrJbCuGIIxm1D2garE2814LXztE/rhwdIG
++-zonh44/Zc43cFhzJQUhcJ/jOxFovgijHd5lvUfvqj6YoquC5yFVYEfsSwwIDAQAB
++-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAK8iNpb7JRQ+
++-CNHl/dUV2DW9Js1TndISLs0YqAcAJHgzwtp5OPV8GHUV/BF7sf91sHU8y6ivety8
++-QsvG1ToZhWAVJXG+AStgJDM8Iw6g2xZbIY3wP3bBSuxAE5PGdcXM7nRfjwnAJM7i
++-Q1gdPcntc5J3dZ1Kt5d9iofI7UMBTuf0Ws+LWG73i/NeRj0lef6+VErQ6M93Yi7/
++-knXVzvRkpK2664fRmUHlavXP2Alleuuibgg8kgJ9M1yjluwwx66LXUbhMClrS/OD
++-hPM29fPZmO+XHJ1dtR79DhdmwqX+GOqjD78asYHIg2Yjy3yZsOX6chKvD0MWk6pc
++-DyFSu5fEHQ0=
+++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwemh+fx2FupgRmKG7ru3X2m//xDX
+++DttQXdXI8OwqwQcWW/7fGxzYXImPGKSYToXUctU7pFM4+PjBvp0l4iZLXANn5lLA
+++e3zEUzC6tZEGVol7Id0nRNVqVgt3CXLLmcxyuTwFZmTPM3AwxtxTu6WbGWz0l6v8
+++ElFkIZ023Kb5e/D0GBUVHOJJDcqiaDf18WrzPjJd59VOE6gH8iO4GX2ckzpf2hBq
+++VPVsmXi/3sTv+5RlBr5VSNPRq4LxBrARfWU/vTq8Q0u4mc0saLNPB3O3i3iN9wMj
+++KKJV3tBNzV72OnsIhs2KprVrcE9bm1XT1U8KTqkpPprOmY+iVWHcjJTa9wIDAQAB
+++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBADTBxt0J0+jn
+++VWiuVEvkVNLutKP//CbQxwt/h9KsigHdwhBBQ4yeqZ45OnVMh8npTLc+7PHgqwnb
+++VUO+0aqIOGJbeEAbGbjxI4ND0LA1sHwKkGRUPIQEETXOB4H4DPiM+HHsUMd+DuPb
+++cWn5RqBZByj23wFCp9/Bf6Db8jzVNRnZx26+rjjtP8muQuxeIACjsgt58akLLQEk
+++IVvLPoKrnZGxMbKnLejmXGYB8iLeWnF+nrR2+IrJNcBk3A+Fkb92EsJUpernqmzU
+++3+Vrx1xeOrm5gRMgJshqUEdqZVeolOsQX6FW7LNV2AtvKHHGm3LtssaR/zHuZ36G
+++ONP85Zw7QHA=
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/client_certs/server.key b/examples/puma/client_certs/server.key
++index ea6f467..8b890fd 100644
++--- a/examples/puma/client_certs/server.key
+++++ b/examples/puma/client_certs/server.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/client_certs/server.p12 b/examples/puma/client_certs/server.p12
++index 7f7e8ff..12cd7db 100644
++--- a/examples/puma/client_certs/server.p12
+++++ b/examples/puma/client_certs/server.p12
++@@ -1,15 +1,14 @@
++-0\82\rL\ 2\ 1\ 30\82\r\ 2\ 6 *\86H\86÷\r\ 1\a\ 1 \82\fó\ 4\82\fï0\82\fë0\82\aB\ 6      *\86H\86÷\r\ 1\a\ 6 \82\a30\82\a/\ 2\ 1
++-¤\960dÆÂ\94\ 5d+\17¹b{\17#\1cÐ\89\9b¯¢\1dÊ!|Þö¸\98Â\1f\9c#\ 5Äm      <¨O¢%4/®*ò\1a¢\7f\9eÍ7óélá·Öß\8c,z\923\96 »Â6s+,\83Ù\8e/x´gòéèAÓ\10R\15Øøö\98 \8bã<\ 3\17\8d*bsÄ\80\86\vf{ ×7=\9a\ 5\10p\a%)\91ÏH\8a®ð\9daht\ 6\87\81;F\85ÖôÿaÐÄ«³²°\1f÷ìD\8e   ú6g[o\16\9d\91£§/!R\9b÷Í4¾\887V¢ú^¿N\ 2Y\9d  \9aÿ¥ë½\15Ö¦ãÏn¿b¾%«ô`ô7?àëA
++-céÆu>\eí¥\ 3\13`°½#\1f\99bý~*NÑEÄ~Y£f§ÿpî¼&ÕÍ+Ò\bTC§¿Z9Í\ 3\10\84)RÊZ\98ï\92\em\ fS2D\ fJ ¡hVÁìúÕØ6.¬øÚ¸fåZ\19\11¹¯ÌBÉ\18½üì\103\9d\86¯Qo3õ\85Ñ\86\ e\16\93¹JÞ\9d\94o\11\97ã\f´TVl,l\92þ¯êÚ
++-?\ e\92F+yú¦\bä^Á­\ f\r`ºì\1a\93áúH]\89\18\89®Ú®LŶ|"\13\98\ 2K£ã\8d
++-é8\1c7\8fEÔ ÃÑÞ\94¤&\ f¸ÿ\9eF\9c\ 5\82¹\93Î\ f(0SÅ\1e\10,cî¶²\9c\17 ò®\vûRF¿§¾úEP&\9fñÙ\18\<*6\99ù\ e\8cær-¤\91ëèJ\v\8cv\9bÒ\1c\92AJm}Ѳ\84ðAíO¢ÔØa'Ïæ{\e\17\ 3\96\13<\9aÍ\94\95\9fºHÇÖ\81òLܹ:Û®*)Y\92'×ã¿»\8eQtQÉ\15µ\13\95¯z¼o\1e\12áô\90        ÿ\1c­örð\7f8\9bö\15\8ek\16\17\ 1\a\1e}\82\81Ñ\1dò\eé\9dÂÒN<çõOr\8fiáÖÏ3ÙV\1a\1e&CBMà\90ò¿3\a\1féÚ¦\99Þ°0qdu&ïU&d@@ènÒ|Ð\86¬\ f°M êVs\8eSµD\7fkBrªk[PÇ)ÕÝ\bÍ\ 3!n\rCýH4¶«/\fñ\88î\1cpÃÓÕyv\15O\8dßÝU\81Kí-Xý\94t'\13\ 2´y(Ò\95\90$uË`__²u7QY³}\86a\83ÔÚÂÁYU²\f\10åï\9e¡Ê\adºËÐ\1c¹\90{\8cÐW?\81ܽZrÁg\87\90d¯×\80G\14ï¦U»]\1eyLA\94BxøÜûSß\87\98Gw1{×\17¿sVsq
++-¡\18\ 5\87Ã¥±¿\9fé!\99
++-\99\v+\1f\995÷rXô¶\88è´\1f\92\83õR\150%R÷ù6]Ù!®\99¹Æ\10\8dª²\1f.(ÁëªÇT\96U\85\92Ú\88öV¢çú´ì@\9bIq±Y(í½\85á\17y%è³bÓ5Sá\98Ü\ e©ñb\83\1f/sø\16¥\ e\ 4\ 5j\r\ 1]j®oÈÌ´æ¡pò¼\9b#\e\94\9c\ 4±8àw²\94ø\97e      \90S!K¦\18©y:°óÀb6Òø½#GÈÓ*½3\86\8eÉwnÿôO~q_\1e\91'Ñç
++-\ 1\ 2 \82\ 510\82\ 5-0W\ 6        *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\92\aù÷"~n)\ 2\ 2\b
++-Ùº½íw¸\1e=,\ 5\89¦/\19$ûò\93OUH\b\1c&7?Ñʦ%ÉM\15Æ{þBã\96?\8bF½\ÇlZï\9a\9c0\86\aÉ\e\90ÕW\ ehÖ\/OùyÿW\7f°È$ÄÝ]ÏÀÄ../\7fÅÙ{T±\aêÛø \84Où(ÒºT\97gyÖ­å\10Ê\ eOÍáw­¿}úÎr#:8U\1c\12-ç6\1fÓx&9>\93\bãÁ æÑ>\r\9aÙwd(ÛÚ¤ÔÿkT
++-S\8e;\9c4\8cê\18\91Ñ÷ã²\85Ú*\18\ 4÷>\1e§|×ûê\ 5\9b\ 2´´OP¨\88óì«ÍR°¬v\9eõä\9b\8e¯fV\ 6>Ùl\10C\842\ 4¦ \89U\9c<\84Y·Ì\8d\99\13ð\ 4À ÄÎxcÌά\f\92Ò
++-\1d÷ÛÖ¯\8b\ 2\8cÑ'7CvyU¤É\ eÊ­ËÞ'Ò\10Å1AP\97tRï§e2\81*â÷\1e7âcõ~ç7\vÏ
++-[­¬Î:\8dïè=Ç´Vº\83\8dËLK$\7f\94õÏ*R\b\93¦\9b\90ú\ f­
++-\aª½\7fÐ{Äç\95\9aÿ\85\86¹=·cø¿:\90\18fÉ&\1a¨xiV,£eËV\91Û:dÖ\14(\91|\9aôüv¶É*pú?Ä\9aÀËÍ=       Ýa*\13èË"á\97(\96\1fÿ\8e0\8e÷çÿÄnVå\a\93       Ä\94\ 2\rú£B\19ÀÈH\ 6uzï\8c(]\ 5¶6Îrêy#ä­OÙÚ?aÂ*\1f\eÃ^\8a(
++-\9e\ 2\9a\8c\1al g¦½\88\bʦ¢
++-Q×pn_E\93\8aêy3ì\9bÛú½\18õjl
++\ No newline at end of file
+++0\82\r\\ 2\ 1\ 30\82\r\12\ 6 *\86H\86÷\r\ 1\a\ 1 \82\r\ 3\ 4\82\fÿ0\82\fû0\82\aJ\ 6      *\86H\86÷\r\ 1\a\ 6 \82\a;0\82\a7\ 2\ 1
+++\ 3"¨ýs\136CТ\84þ\89\ 4\10éV\15O1\9d\15\14%eú ¨;\8e\9f\ 1-5Frþ-8<\8e!è«Ó\8fÄ´çÁ)\7f\f\96g*B\8bUÄ4\88\ 1¼À\82)û¼\82CzBM×ar¡âÜ\ eX\e´¾óú\rq\ 3Ó\8bÂrL \ 4â\92w\v¯ª\91\16Ø\98n\13׸5>u¦\9e;_2Ñb¿ð@¥Ñɺ\eûztç¿Þ2foË vée<}7?\16âÎé¼ÑCcL\8bIÇ/\1c\8aî\81\±¢²\8f\9a~ðýòeÍA uâ\f÷¡       $tñª\1d\99·Æ¬Q\ 6dQ·\ 3\1c²J\9d\ e #\eÒVÓ5Ä}\17a9\91²^\ 4J¾~ ý#ä:\8b&cþÅÆ¶\9d²,\95\87
+++îÂN á\81\93j\18=\9d\1f»âÊÅ4Ã\ 5
+++W\e\ 2\82¦ï\16C³Úî\1aþ%ú\15\1cå\97\8cBàÉáÍ?\ 4}\14­<\83£s2oaz ·\ 6»­\96ï\1dÏ\9dÔ LÈѸ0¸\9b\fg\ 1\ e\9aÊ\11G\îûûE¾ëÙmÝ9fðÎ\89\86C÷ùË\95jqÉ^Ú) rºý\96\80<v£¯"Z6\993AÙ\12B\82\8b\11\81¯µ\8d¬\9a¬]\ eé\16.7 ñ(½kk½Ï¤\9b\1aÖ?°k\1fQt¹QÒlæ/jþ0eÍ-Ö\11®_\96f>Xc\93f®É\84\ eÝ3I\7fÖz;)\ 6Ôß§c°Ôo_\9d¼>L·\8aîÌL·\83\9eôб\ 1\1f\92\17Ô\\1d\ex\8a\9b\18\1e5Íf\15?\1eZ#¤p\8c«I®?³vY\1f~_í*Jú\82mB@Í,õw\9dâûO\ 1\83©ÿ#¤²&T\1f¶<[\f\f9\v\19âÂÓS,øí̲a"4\82ê\10}b®\950\12\ 4g\9d\84\97\926\8c\rk\90"®nCÝ\a\128@øÒo\8b\1f\ f|\14\e[o¿Þµ\19&\93qcÇ\9bo\1a\95C§ª\8eÃ3´kÀf\19\96Û               ÕÐ\16q\vÿ½\10µûäT@Ú5
+++RË-W¡×í\1e·/Û8;~FÓ½Yx£I        gÉ\19\12$¶P"K+5s©&¢Ý'>ûì#Ñ\ f¾H\17j\96\ 6z\88ÁLåeó\12\10,0aÿ\8aÓ\11\8c\16ÿ\ eè"{\82hÄÃÂ\8ccìw\92®;M(\87\19\v\1e7\8eÿä\1a¶¾}¼HFÄ×y~\1c0\97¯-Ôæ@fw\84
+++{\86^\85^y§_Å'\ l×G\11²µaÿ\9dR\8cÿ
+++\94\81\1d¥KhB¬`,\9e<0<µÎÑCï\95\80t§O\94©Ym
+++,pP&d9\8c¹?\aÙÒ»\ 4\17N\95\ñ³¦t$Úà
+++\ 1\ 2 \82\ 590\82\ 550_\ 6        *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10`\r\1aÇu\1fåß\98ú·\9a\81\\ 2\ 2\b
+++l\1e~uï\9bVA\99x\18yoÜìï­\8fW\¶Ì¡±Þ\13®õî¸D
+++ÕÜH\ 6 >\81>\81©{.\88­\1c\13\15q\ 1b\94b3'ÊôÓ+&\12Ôú
+++\99§\94M Ök\82ñþv\81J\1f\9b\94fâ¡m\f\12îDR    \9aS\1e±Îª±\bѤ\80È\8b¯¯«nÅ¥Vüذ+\1f\11\8cir²ÞDÞWFÖc*<U×\9cÆ/ý\13\1e\93:l=gÀßP°\18½[<ÿ\95
+++^I!\83g,w\19G¬©T\9aU\ 1\83áL¥8Òס
+++\9e\1coO+>ðýÌÉ\ 3÷¬þ\8bÙ\89ª9\99Q\14C_\1f½ÙyÊ\ 3\8f.I\9fcªµÈqO\b\99   Þ1B0\e\ 6  *\86H\86÷\r\ 1 \141\ e\1e\f
++\ No newline at end of file
++diff --git a/examples/puma/client_certs/unknown_ca.crt b/examples/puma/client_certs/unknown_ca.crt
++index 5c50d8f..4b07a87 100644
++--- a/examples/puma/client_certs/unknown_ca.crt
+++++ b/examples/puma/client_certs/unknown_ca.crt
++@@ -1,19 +1,19 @@
++ -----BEGIN CERTIFICATE-----
++ MIIDEDCCAfigAwIBAgIBETANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
++-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
++-MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
+++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI1
+++MDcwMTAwMDAwMFoXDTM2MDcwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
++ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExDDAKBgNVBAMMA0NBVTCCASIwDQYJKoZI
++-hvcNAQEBBQADggEPADCCAQoCggEBAKh5VmSGmeN97MEPb9Td++UYcWHhYVj+yxi9
++-leDzcLpAgqtd+z0yBYCS2ULRQqomf8uIYODEuWxaepVNjjRN5Y22Hzlodnp+kJ3G
++-CXQva6GtwxbTIxyZ21Yn8APPgb7OTHZ/js1EhZpJUSjum19PnSS8rPfQRkr6m2eg
++-HKDkzV3jrJXTpNdvUhTi2NVVo0vNzLYV5Kj45vqirlTEesLxdxHtDNx8vanYHaJY
++-JY7OryIJhPsxKYplSbQ7ydJuHtpx5SiFjRckw9ddhRzGjYsAQFE2eVBPjhiYJnDL
++-tmEnb2e+tgRNiru9ttffpfzN4EG3/d9qnyZV9nua03yn+tqe0sECAwEAAaMjMCEw
+++hvcNAQEBBQADggEPADCCAQoCggEBAO17pO0lTeGMVgMplzEn/4IdsVQXt45z1MgS
+++3irQEGPfIKkZHnVdPElJnag3pTg5bmFQ/yPOEdbP04Ao8/BvCgvUO6jqkTR9aic2
+++PqnlXbTPeHckjskihhcbcr+ZKO23dBP42U40E+6TakZponUsZs/YlKE4pKUfjsYq
+++btVyDxe0SQWxSp85XUNn6Sd2Wm274/wQtjjDdMeMtYANqGRJStKG6qZAe9bYwOlw
+++UFddMu2osIV8i5CQcmJnkVW0MagUrpvGZSni6HO9i3h7Y63r+d76NlR+anFPz4+l
+++kZKBugfWGI6lC1rSQ7q85ucEJeqSJN77dHGRyNITy2+PrYGcNAECAwEAAaMjMCEw
++ DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQAD
++-ggEBAAp+1M6+Z8T/CA+C0288CRF27tXKn5Kd5Iffrx1Dg7I5HrFGJl87tkzLRoZi
++-MKj+FfpF7fJ/QSyQt+UZa53R2vmJig6JUEQwfzXc5Bp+fusJgmkGPZQ1A5tnbwCZ
++-TTuyy8Sy9reCWdJkmdDWyK3ah55mjiuOwZ+woA3RAoC9vCRtIT4w08NqrISBYp2i
++-NeQCv3gooiQrbJuCUuo56Qm73juJ4T7GXElRMF+SupmhC2SHwFVGAbu0/g6Yc+ye
++-i6/T36t/GTT0fG3kKfGfFMq3NCvY3WI3vcPzYtK9fN8QYVy3LjdnsjcTV2L3SaxG
++-3fYURa9nn7mrxlMBX88UWLUIPlc=
+++ggEBAOgqzVzIQwZAtnhBhZ52J49MQzw7e0jlUoI0nSBNcT1QckxOGNE2jGoh9gHr
+++Ti1VlesIEO7v5IXAyDuL66sOWPWzmPdU2uKDoWmUE5ry02dJu4W2OoueTCQYilAg
+++vmaPXgH6GySOsazj1LK2RNkAzbj0Kw49bwa4vOxEnrkPCLlZBonEAmMnhOh0t3iP
+++TUk2wMTnSJrJ002xDArUQol+sjVXGktYWT/bReERDBnGA6opFqtMVap48kGqgCOV
+++6lHEEOg+F86ubhM0wLfdpFp4j4q7aAFQTtapihnLlFXMKiz9imjpuAWllSKh0owP
+++ZDowdJZgG1trNkK0oMgfICIYKlk=
++ -----END CERTIFICATE-----
++diff --git a/examples/puma/client_certs/unknown_ca.key b/examples/puma/client_certs/unknown_ca.key
++index 830cd91..06e0f03 100644
++--- a/examples/puma/client_certs/unknown_ca.key
+++++ b/examples/puma/client_certs/unknown_ca.key
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/client_certs/unknown_ca_store.p12 b/examples/puma/client_certs/unknown_ca_store.p12
++index c74c940..04afb8b 100644
++--- a/examples/puma/client_certs/unknown_ca_store.p12
+++++ b/examples/puma/client_certs/unknown_ca_store.p12
++@@ -1,10 +1,16 @@
++ 0\82
++-\1c\ 2\ 1\ 30\82       Ò\ 6      *\86H\86÷\r\ 1\a\ 1 \82     Ã\ 4\82     ¿0\82     »0\82\ 4\12\ 6  *\86H\86÷\r\ 1\a\ 6 \82\ 4\ 30\82\ 3ÿ\ 2\ 1
++-\87\ 5\7f_®é[\fÒG\ 3m\14itö]æ9$º
++-\84ÊÚ)\90f\82\18\99DÏÀ\va\912t    /«P\98\8f1\94KW2­Ç\ 1´ôC ×\ 1?
++-ñ\1a
++-\ 1\ 2 \82\ 510\82\ 5-0W\ 6        *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\12åA×\vú¾\ 1\ 2\ 2\b
++-`\ 4¶ÿô\ fX0-\1cÒêøß\ 6á\83eÊÿÞ\15«f\97ÀGf\86³8P´1ª\9e]Û       ]§A/ü\8b;VÁÖ\9b(¹]Üm\9f¯úÂN0.í\94\19çÒ¥\ 3)dm\ 6FÍiÙ\92\10*"      S
++-I\89¸y¾^þ%+\15-}áªwOç0c#\r`5.*µ \85íf©rC¸äy\8b0sð*3\87¯\13\93#½¨ÔI\ e-\!Q}«®zû9,ÒpA\95w\eÈ\7fÖ*\MÎ\17ÃO.ذ\83Â\97±\86ÎÀ|üèáÆ®\81\14Sk\r>\8b²\86\19\94¾\10Ç\88vÄõç\8eú6NÁó\8f\17R\82oO¬#¡ç3Z\88)ë{2¹¬`­\ 2¢^Æ¢£¹Õ\93KJG[   *7è \b»\r³{`\86G>fd\9c\154\8bÕ+)Ô\ 4Á§\8d1z\9d $ûVÀmÞ\85¤\92ׯ\ 3}Âòƾ1r\99n¦s Ù[H¢¶éÑ5¢Ü+6ð!,¹\16ãý\1380-/ã¨\v¥Q~&ß\ 6ã5\15þÕäÍÕ-Ç®öÐ\ 3u#nzn.mÚ±lÐXÖqÈ\ 6ÎÀÕÜg1Þ°»JÇ\81\12²J
++-ãjöd\80ìVfÿ\17Àr\91ªÐX­´\82`ïìâôÝ\16É{\992âìsï&\8e\8e
++-à\95\17ôÀö\80q/õë\fÃU\82_0A010\r\ 6      `\86H\ 1e\ 3\ 4\ 2\ 1\ 5
++\ No newline at end of file
+++,\ 2\ 1\ 30\82       â\ 6      *\86H\86÷\r\ 1\a\ 1 \82     Ó\ 4\82     Ï0\82     Ë0\82\ 4\1a\ 6  *\86H\86÷\r\ 1\a\ 6 \82\ 4\v0\82\ 4\a\ 2\ 1
+++ãÒA\ 2\ 2\b
+++!@_
+++òÂ)\af\ 1Z\82\9a\a$+\98\8e\9dö&\8cÂv³\e¿`¦Í\93Ævxå ÝªÂ¦¿°Öu\9e×S\8f®\9d-\8c~7^
+++)\10\94:eÞÎíA\9c\8eØ \80\9a{m\18bè×»,\8av+÷k\91uÚùÂBQ\a\1aBÕïg£\9c)¢ÝËñ6\87×\1c\a&fI¯È6\ 21\ f৤\88¸\89²Dè-.ån\15\10\ 4²\v\ 6Y"-8\vÎÈç\1eæ7á1»\17\ 3!\ eÓV\ 3\91ùú\1d
+++\14¤f\bÀeåé\10\1f\8e{d)ñã>º_×.xqÁ\f\1a£þ´Vz\17¬É\97zw9/Õ\ 2|\94±
+++\95\84\13Ù\86ß¡\80\ 6QfgÏ¢-\1aNG,
+++Ë\ 5n(\1d¥k~\81n\f\9bdEívkTõ\9e2æÆfìEìÈÖP"lm*\ 5\90× gªH¶?\7fÑä/#\bjLá\88¯Q:þ §Ø\9a}º ½e\ 4aÖ:f\18\18Vô<\87f\10\13côÀ¤³ÕÌ'2\ 1x\ 4\95Ý\91Jo`\90é6R1÷\9eÔ½ðà\8cÈieú6á\92LVe&ß<ù\18\v\83\12\13\9e\11¥z\7f®ÆïÖâÞ\16¢/½¥¨ÊÒcõ[å}W+$¼¥àÎ]2Mh¯ >ip1TÄ\9e°\ 2\9eA¿ì\ eèÿ÷HY\16¶NîYá\8dB}ÆÃj©æ×ѬÎ\12ì\8d\11\8b\11\82`\vì\8eh\8f*_\1e\18\e»â\88V\ e¤    7ôÝ\ e|÷&\96\90+µ?÷¢¸kjü;\11ª>z\ 2Óæ\1dQ¬Tóz\9dà7\10¨j\9aK\92\7fÞ0\rÛUç#\16Ä\94\83ëáëàõ\19lEx\16Ñd\83h{\12
+++º\8b\9dØÝ÷Ó\1a\ f´OLÃ\ e\ euaÖ¾µþ\82zh\13\ e\9e\95G®åâ®3\ 5øgI\ 2[Q\r\8dî¯\99¯\ ecî \89ÏÕAç¾v\8a\1cÙíM\1a)\1d\97Á\1fó\12\11qÍá½b°~úÓ\86\ 2ÌÍt\ e\9c¨\1aCã6\9c2Ûÿ½\81?!­\ 3¤\15¥sö;¬\ 6Àêܶ\ebÓ0\82\ 5©\ 6  *\86H\86÷\r\ 1\a\ 1 \82\ 5\9a\ 4\82\ 5\960\82\ 5\920\82\ 5\8e\ 6\v*\86H\86÷\r\ 1\f
+++\ 1\ 2 \82\ 590\82\ 550_\ 6        *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10Í4gÞsrPÆ93
+++\9a\1d\ e\94CÛ§ï5J\ 3\13'¥eÈ1M$àèzheës\1a6ÜP\1d\ fo\92<H)¸\819<)\18È\8bóK\ e\88
+++\1cÕeJ\1ctÂÀ\ e]G¹²\1fåÒoú^\9f\9aL¯Y\99üc\99Èÿ\81®a\7f\9aZG\1f:Õæ\8eáý
+++rä\85vÏø\1eû\ f    éf¼\al\ 5¸\13\ f®¹\90;%Ôæ\\9afÓ1÷8õ©è¯²Æmw·\9cª¿~É(üÒ\9f\1f¢Áç¶Å:\87dùh«qÀ\9cÜåx¡Ã½Vå\e\ e\88\87Ñ[\8a\ 6`e|\88?1\96â\9b÷¢(\96î±®p\82¿®¬\12\9cÅ\94²Þ\ eN7ô\84j\94F\93\19qe\98\ f¸c²tÃe$ù4%øu\ 5.%èNmPU+KK0n¡%Y&7>\8e{\94o÷h´}\Ê¥U!HêùPì\82\e\ f\13ý)\84P\93¿³øN±\91\aïêýQ~\1f\f\96\9a\1fáÊ\ 1ÆkÑ\7fÃ\1ca\9f,NÛ\86\82öc\87\93ÌÇþãÑ*8'ÒÆòNÓaÑË'lÎ4Ã\98HÂq\1a}=
+++*®dû{        ÂIç¼\95\16\9cåä0\aDu\9b\1e\vpv\99\92ÓßXÇ"л?\9b-Ô¬"akÁ¶\15_\8eÄ=xÕ Ày³>w=ã°\82ä\ 6\ eG¢§õ\ 1Éhx\8b0]\11\95ÉsAn\95Õ\8cM\1ayC?H± D®\8f5Nºyr¬xkè\ 6Ãæ\91:«dGáe\94Åþ¤\160{{>\ 6\f§_m¦ØàR\b-;³p9¼54\ 3\97ÐÃ\ 5u\93ËP\ 40§c\ fÒÁ\94æ\ f7L·nºúLjv÷4Úõz\16$Cýt?/7\b>\91W¬¤\8fçf¨UÔz÷N¯\92\9f\ 2çÐÄêKø0ïpÞkÆ¢)|)õ\82
+++8Û¹\100A010\r\ 6  `\86H\ 1e\ 3\ 4\ 2\ 1\ 5
++\ No newline at end of file
++diff --git a/examples/puma/encrypted_puma_keypair.pem b/examples/puma/encrypted_puma_keypair.pem
++index d876594..25becf1 100644
++--- a/examples/puma/encrypted_puma_keypair.pem
+++++ b/examples/puma/encrypted_puma_keypair.pem
++@@ -1,30 +1,30 @@
++ -----BEGIN ENCRYPTED PRIVATE KEY-----
++-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
++ -----END ENCRYPTED PRIVATE KEY-----
++diff --git a/examples/puma/keystore.jks b/examples/puma/keystore.jks
++index e36f314..ef92af2 100644
++--- a/examples/puma/keystore.jks
+++++ b/examples/puma/keystore.jks
++@@ -1,16 +1,8 @@
++-þíþí
++-+\ 6\ 1\ 4\ 1*\ 2\11\ 1\ 1\ 5
++-E\11,\82?hcS\8fÔ\1cÒ±]yB\r\ 1W\8aG\r\1eäcİé;\87-\ fu\92\1a6\ 3\7f"\17#®Ò\11ç\89¤\82æ\ 4Ø<\ 2\82¼bô\ 5hbG\9f\8dd{fç\84æ$Ì]zÃ|å\10H\97\96\12\8dÑ«\aÍØt\97´¥ eã\9d\15\10'=?Õ:¼£6µJ[\8a\80»\16!ðSù³R2\18­êßp¡\ eÇ\1e±Ò²\85\ fög\90ê­\ 1íE\9b´iìzv\16\ fv\1c ÷¢:P\1eAI#\9f\96Ú\98Ë\84\16U'£\ 6\7f8\9bç¶\1dÓ¡l\8aÈ*&ln@\ 6Ã\ 6<Z\P!ÈIjµ\1e\94h4D\85´¦ÊAþÚ\r ^+
++-5ãÄøîº\e3×ÃÌ]Y@=¦¦\9fìÜæÇ%Ȥ1\10c\8c3j®ð\89˨b1ü\84^\e\96\1fåL\96=eª\97\1d»"À©fðµr\9aí\86%:2\8bô-Q=mß&A.\ 2åÖú\1dc:)X\95e~èÜýøs%oÉÏ:ZuåJ¢.4ï&\9c×P
++-¹É\1eàÞE²ÏqûFS\9d·\1a\8ft\92Î\85AÜËtrࣣÀ oa°G\91\17\97@\a¾x®¸Ä­Í°D5\16d\9b=\8e÷GFIwi\ 4ã¤A\87ÀG\14ÎI²ö=]'ö¶<Ë_\rñ)IKÀ\90\ 2u\ 1eÔvb6tÕ»Õ/\88\80eUZWÔYà\11\12\9e,\91çíæÁþ1ú\7f¸|)\9a³ûR\ 6Í\8eÞ\8e1Oºl\8bÈî\v\8eÚ\94ä\9dJù$]¾gê]9\ 1\89Ï\ek8Í  PYº'/'ó\8eøi\9a¤:G\93û\84Øg)\rÃe¸
++-ßñU\8f\88ª\96N\1eñ\vU\r>Ôî¡Æ\1eÿò«\ 3\1eÜ"|^ èÏCmn\ 1´M$<QÕ:TùØ6\9ec\9b\18\ 4Îe\9e\14\e
++-ÌÆ\14¾Wÿh±Ç6\1a\ 2¦¦Æ\97Þòý\93\15\f\aÚA\12\18ê\841¬t
++-\b@
++-\v
++-K\9e¢\83äVµ6ã³ì²æ\1d       Û\8d÷SY\#õ$LuÌõ°¡pî»÷\99\1dVñÜûÉ0\90x\80\ 4Ú×Ýå\v¡\86=Oë³(ÓiÁ1EW=º4y\101}eC\83Q\ 1K\8b¨ßüwnoZ9\17l/81!»U<\8f\1c£\16\87£}dobuéC9(Ñ\9dëZQ\94\80|þËÙO\8fy\ 6¤b\80»\ 5ôå\8d\8dÐË;Þ\v2²õ¨ª=Î]6Å\8dtµV\12®¶þ¤\13<ÒʽjÏ\86i\91îÞ¨Mð\ 1þ_¿µ|\87?ý=*\86fú)\12á_\\1a%O¬\ 6\12´uºá¸w\87\81\9cÚ³\14\ e=#1±qúW@a\9fLÿ\80\15j\92Í\18½ï7ôA£õïõ\ 1e*X!\8bo\ eÜÍ\ 2¶y_®³Pu\89èÍAîéÀk@^\1f\87\10\11EܱjS=J\9f\8fmg[\9c\15Ïý²Äé5}\ 4Ϊ\1eõ`IL\82\87õE\9eb¸ø\10\9a¸ÿ6
++-\f\ 5local1\r0\v\ 6\ 3U\ 4\v\f\ 4aero1\v0    \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r240801000000Z\17\r280801000000Z0H1\v0  \ 6\ 3U\ 4\ 6\13\ 2US1\ e0\f\ 6\ 3U\ 4
+++þíþí
++++\ 6\ 1\ 4\ 1*\ 2\11\ 1\ 1\ 4\82\ 4ë&ä¨DÅ\8c¾"\91ìQÉ}Û\17ú\81ÊÅsâ\98ßíbù¨íÅ©³l\1aÂ\9d¥I\1dÖW2ó'ó\10²$\957\a÷pé\8fKu¤\1d9Iiz¥Íø\12\1d    ¼?»Ñû\f\99µmdö\9d8{®o°mj¬^1\\81ìö§Zg»±Ñ×g\ 5\aK\11yþ=êH®N\85®S+à3\8cëö\89*QÛÚMÝ¡ê\1ao±ËyÊnüâã\91¨U\96\16°YÐ3EæËÜ\16½`¯¹ÝÞ\8c\8c\ fÒcµì\15\15N¢Y\8a\1fwüNÔÌ\80¼ö~¤\16\86~äÁ6ï\eì2¬\ f¿JѺn½¢\8b\84\9e\81\a-r\1aÌ6+ßæ\ 6Ы\8e\94ñÓ\11\82ÊLtg\1eóëíçÄ\87 atÞ\ 4\8aL\84ü\88nz\1foýª\97ú§ö>F2RæµEÀkEî?DK]Ó!$aO/xÔ'½L¨æ2\10\ 6Û[r\1eh\f¨\9cG\9eð3ò
+++VP\r£\88ÎùWÅ×1\87@\91æw\94F\f\13\f·ÇÞ\7f\11?u¡ã\ 6f;ÀÕD«b!ç\ f($éáÄÝLà\1fAP7)Ïó~$7+ļÑ\8dgÄ!\¿\93¤mí\81~\9eî1\ 1\9dàæ\1aÏ­k\90\12ø®¤:$o\1dõ\83½\97§u1ÌïH£x³\85\17\f\eÚ[¡= \8fHwÈeÈÈNel:nº\99\91¨·\ 1\9dk\97,\87üAK\86\17y{Ü\1c Ïܨ
+++1¹\f y\9d¹\82T6(yç £4zÛT»\1d\14rθ\15\97N
+++\f\ 5local1\r0\v\ 6\ 3U\ 4\v\f\ 4aero1\v0    \ 6\ 3U\ 4\ 3\f\ 2CA0\1e\17\r250701000000Z\17\r360701000000Z0H1\v0  \ 6\ 3U\ 4\ 6\13\ 2US1\ e0\f\ 6\ 3U\ 4
++ \f\ 5local1\r0\v\ 6\ 3U\ 4\v\f\ 4aero1\v0    \ 6\ 3U\ 4\v\f\ 2CA1\r0\v\ 6\ 3U\ 4\ 3\f\ 4puma0\82\ 1"0\r\ 6 *\86H\86÷\r\ 1\ 1\ 1\ 5
++-\ 2\82\ 1\ 1
++-\ 6\b+\ 6\ 1\ 5\ 5\a\ 3\ 10\r\ 6        *\86H\86÷\r\ 1\ 1\v\ 5
++-Äz,GS×e\90¶ßé\86?ZgÉ\9d0\ 5\95\83ï\11Âw\8da®NhýÉV\14[úîH\11´h&\1d\8dÔà¼àx]KT-\1a\93þB¾+\9d½2f(Åå\ f\80ºÏ\1a{ס+ãé>MKË1ôî®Ø\12\a\82O\16Æ\fÓ$VÌH\17\ f¡2!²\91\88$8\99u\\93\8b²\e\ 2¥£à\e!oa\89²\v\9d\9cè2*OE\87\19\1c\ 3\83ÜV\1dÙFád\15\80\ 5¦ÎkS>¥\1346¢S\8bÜ!ª\97bè4þn­_
++-[\95\88ð ÃÀ
++\ No newline at end of file
+++\ 2\82\ 1\ 1
+++\ 6\b+\ 6\ 1\ 5\ 5\a\ 3\ 10\r\ 6        *\86H\86÷\r\ 1\ 1\v\ 5
++\ No newline at end of file
++diff --git a/examples/puma/puma_keypair.pem b/examples/puma/puma_keypair.pem
++index 1aded78..f1c333e 100644
++--- a/examples/puma/puma_keypair.pem
+++++ b/examples/puma/puma_keypair.pem
++@@ -1,27 +1,27 @@
++ -----BEGIN RSA PRIVATE KEY-----
++-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
++ -----END RSA PRIVATE KEY-----
++diff --git a/examples/puma/server.p12 b/examples/puma/server.p12
++index d928a19..49f76f8 100644
++--- a/examples/puma/server.p12
+++++ b/examples/puma/server.p12
++@@ -1,13 +1,15 @@
++ 0\82
++-\88\ 2\ 1\ 30\82
++->\ 6   *\86H\86÷\r\ 1\a\ 1 \82
++-/\ 4\82
++-+0\82
++-'0\82\ 4\82\ 6       *\86H\86÷\r\ 1\a\ 6 \82\ 4s0\82\ 4o\ 2\ 1
++-\86    Y0\82\ 5\9d\ 6  *\86H\86÷\r\ 1\a\ 1 \82\ 5\8e\ 4\82\ 5\8a0\82\ 5\860\82\ 5\82\ 6\v*\86H\86÷\r\ 1\f
++-\ 1\ 2 \82\ 510\82\ 5-0W\ 6        *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\b\1a\8bR)?\e¼ù\ 2\ 2\b
++-\1cIj\1d,éð\98Öµ==¨æ±fñ¡Ö$/£`ÑAS¡Lm-úÕs\8a\18»¶j\ fvÍß`\80.\12ÓD{ý¨\91m=q1
++-\ 14`G|\11O4áP=&\83\9f¬
++-\89O\82®Ý·%M+ÿ7Ö\9f4ÔÊMË1èz/\a\13ÜÕ2Ö\10\82A\999\9eö\82ýâ\7f¶^Ê\93\89ö\89m\80\83\89wÓÞ\87\f\97ê/«>å\82TCÃk$j'âÆÙ\9fæapDV'Ç \ fB\9cè\ 2«Û¿ý\91\8d\9aÜ\ 6f\85¦)ç\9dù²\95à­!o\81\ 4˧ñEð;\r\ e5ß³ø±ëQË\8c]¼è\r<M
++-½XH
++-\1e\b
++\ No newline at end of file
+++\98\ 2\ 1\ 30\82
+++N\ 6   *\86H\86÷\r\ 1\a\ 1 \82
+++?\ 4\82
+++;0\82
+++70\82\ 4\8a\ 6       *\86H\86÷\r\ 1\a\ 6 \82\ 4{0\82\ 4w\ 2\ 1
+++J³±\83\ 6\ 1á\ 3\9c¦üí\ 4¯7_+3Ü*Ù\9fA¾ÜGÃÞ` \98Ê\8d\fé\96ÀÃ)\9aÊ\95{\89Q\93\18B\8d®\17Xb\ 1Ö¾¶\95ÔØì\8f       \9fð\18\1a\98àÅHª"̪N~£aå]\15ìI4\r\1eg\83\93-ukó<¥^àgj+\14j|\e\ 6[\ä
+++ì<­qSÑ2wÏtí®RwZ\ 1r\97¡ç1Ì\ 6 µ_³3É\92j4\8b®\8a\83@sóÜ\ 3\96ø\81ûÍß°   Àý$\15\eÅfr\ 46 ÎÓcR\81_\bÍ\8d o8\17úf®½$<\1dû\14vg(Í   §¼8±1Hîvvý\7fä Ü\12\93¹T\12\fäÃÿV\93t²¿tC¶\9c\1c\ 5KKà.'ò\1068     µæ\94\ 3°#\9eÔ|vú)Â2\11\89'åI@\8cá\1eQ\10\1c\9eÎZ´]\88Ì*ù\7f©\8c\16S\ 6ã\vãËV.äãõbNu}oÑ\18ZS.ü´x\8aM\81Ý#ñ\95SZ.8\eÁh¼¾é\8de"\ e\ 2n\ 5\8f~"* 
+++DOá.K"Á7Kä¨|wDÃH\8e\9bõ*\8b\ f\99ó¶\ 5\1eCÓxõ\ 2*g¬\v\10ÂárÖ*eÀ\18r٥°£¹¹Ç®Öí\ f²é%$Xé\9ciOr7ú¦\8bÊâ\7fÔî¥
+++Ú<Ú|[i-äeö\q#\ 3hº7
+++\ 1\ 2 \82\ 590\82\ 550_\ 6        *\86H\86÷\r\ 1\ 5\r0R01\ 6  *\86H\86÷\r\ 1\ 5\f0$\ 4\10j¿º\7f<ÑÔw^Rä&Üz¾o\ 2\ 2\b
+++§VA\8fçg\12µÔ&b\ 5CZ\13c
+++A\8c\8atíàÎt\97T\90Â\96¿v\17\ 2S\1eĤL+\ fLSé\9bà¹G\ f¼\98z}\94Ls4\88~Ûx¯ù\89£ým\ 5%\98ã©\f\9bÔ\87O¢ö®"r\89*½ê,¸é§lþ\e%h_\ 4\9dÍ\16ãE{µ\85p\9f\19 ã]u\93\9b³tC\16\82\86ú´B%Ác\ 4ßÚeä\82Wø_*ÃXöç,n¹jg{\1e\807²   R^\1c\99Ü8°\88\fû¢O\e\80\92µ\17ï\92\e
+++ð`Þ<I¿³¦Ý\91÷q÷Ù$2c\9b¢\92¥Á\84èÔH\82£å\8cÐ\18\8b¹~WïûAbµ\9cÁ¥\e\98-C<{HR\9a:ÆþN\1cí\r\82é\95\1d\ f½E¦X'&Ò7\123/.ìD\\90©z®\97\1f\9aáåp\8d/£Ø%åÒÏfã\96H6Ò\88)»Í°\9câ\rANÂ^\9b\15|$\89âÙB\11\8e¾Í\91Qd\15È\ 1\84\11¾¡{âù\ eÉjä§dÐìÒn\85n5MÛ\ 4«æ/`\9fÂŹñ©#è\91i~ê\84\91§MÈ)ê\83ó\1dÉ\ 4´-d-Í\ 1\1a-ØRf\82CR      Æf!I\18*ÇÎ\ 5ùÕ\92ò\9bM_fÖÂ¥\94\81´^üÉO¸×qs\a¨×\925ÚÐé¾g\95Í\9fe¯J\ 4 \ fèV^˵ |µÎi¬R¿\10%G\80
+++\1e\b
++\ No newline at end of file
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f1e77b976601c9fd5d7db56c386c9ca47bf5f6ea
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,12 @@@
++0004-puma.gemspec-drop-git-usage.patch
++0011-disable-minitest-extensions.patch
++0012-disable-cli-ssl-tests.patch
++0013-fix-test-term-not-accepts-new-connections.patch
++0014-disable-test-failing-on-amd64.patch
++0015-disable-different-output-test.patch
++0016-disable-test-failing-on-arm64.patch
++0017-disable-test-failing-on-armhf.patch
++0018-disable-test-failing-with-ruby3.2.patch
++0010-Disable-test-concurrency-without-concurrent_ruby.patch
++0019-adapt-test-certs-generation.patch
++0020-update-ex-certs.patch
diff --cc debian/puma.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..47a94c33a1b68656703ddacb43251e743af42fab
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,165 @@@
++.TH PUMA "1" "January 2020" "PUMA 3.12" "User Commands"
++
++.SH NAME
++puma \- fast, concurrent web server for ruby and rack
++
++.SH USAGE
++.BI "puma [options...]" " [rackup file]"
++.PP
++.B puma [\-h | \-\-help | \-V | \-\-version]
++
++.SH OPTIONS
++.PP
++The following options are available:
++.TP
++.BI "\-b, \-\-bind " URI
++URI to bind to (tcp://, unix://, ssl://).
++.TP
++.BI "\-C, \-\-config " PATH
++Load given path as a config file.
++.TP
++.BI "\-\-control " URL
++DEPRECATED alias for \fB\-\-control\-url\fR.
++.TP
++.BI "\-\-control\-token " TOKEN
++The \fITOKEN\fR to use as authentication for the control server.
++.TP
++.BI "\-\-control\-url " URL
++The bind \fIURL\fR to use for the control server and app. Use \fIauto\fR to
++use a temp unix server. This requires to use a \fB\-\-control\-token\fR, which
++needs to be given with every request to the control server (\fItoken=foo\fR).
++.TP
++.B \-d, \-\-daemon
++Demonize the server into the background.
++.TP
++.B \-\-debug
++Show low level debugging information.
++.TP
++.BI "\-\-dir " DIR
++Change to given directory before starting.
++.TP
++.BI "\-e, \-\-environment " ENVIRONMENT
++The environment to run the Rack app on. Default \fIdevelopment\fR.
++.TP
++.BI "\-I, \-\-include " PATH
++Specify \fB$LOAD_PATH\fR directories.
++.TP
++.BI "\-p, \-\-port " PORT
++Define the TCP port to bind to. Use \fB\-b\fR for more advanced options.
++.TP
++.BI "\-\-pidfile " PATH
++Use the given path as PID file.
++.TP
++.B \-\-preload
++Preload the application. This loads all the application code prior to forking.
++Preloading reduces total memory usage of an application and is only available
++in cluster mode.
++.TP
++.B \-\-prune\-bundler
++Prune out the bundler env if possible.
++.TP
++.B \-q, \-\-quiet
++Do not log requests internally. Default: \fItrue\fR.
++.TP
++.B \-v, \-\-log-requests
++Log requests as they occur.
++.TP
++.BI "\-R, \-\-restart\-cmd " CMD
++The \fBpuma\fR command to run during a hot restart. Default: \fIinferred\fR.
++.TP
++.BI "\-S, \-\-state " PATH
++Where to store the state details.
++.TP
++.BI "\-t, \-\-threads " INT
++Min:max threads to use. Puma will automatically scale the number of threads,
++from the minimum until it caps out at the maximum, based on how much traffic
++is present. Default: \fI0:16\fR.
++.TP
++.B \-\-tcp\-mode
++Run the app in raw TCP mode instead of HTTP mode.
++.TP
++.B \-\-early-hints
++Enable early hints support.
++.TP
++.BI "\-w, \-\-workers " COUNT
++Activate cluster mode and define number of worker processes to create. In this
++mode workers are forked from a master process. Each child process still has
++its own thread pool and the \fB\-t\fR setting is per worker.
++.TP
++.BI "\-\-tag " NAME
++Additional text to display in process listing.
++.TP
++.BI "\-\-redirect\-stdout " FILE
++Redirect \fBSTDOUT\fR to a specific file.
++.TP
++.BI "\-\-redirect\-stderr " FILE
++Redirect \fBSTDERR\fR to a specific file.
++.TP
++.B \-\-[no\-]redirect\-append
++Append to redirected files.
++.TP
++.B \-h, \-\-help
++Show help.
++.TP    
++.B \-V, \-\-version
++Print the version information.
++
++.SH EXAMPLES
++.PP
++The following examples show how to bind TCP or sockets:
++.PP
++Bind Puma to a socket with the -b (or --bind) flag:
++.RS
++.B puma -b tcp://127.0.0.1:9292
++.RE
++.PP
++To use a UNIX Socket instead of TCP:
++.RS
++.B puma -b unix:///var/run/puma.sock
++.RE
++.PP
++To change the permissions of the UNIX socket, add a umask parameter:
++.RS
++.B puma -b 'unix:///var/run/puma.sock?umask=0111'
++.RE
++.PP
++In need of a bit of security use SSL sockets:
++.RS
++.B puma -b 'ssl://127.0.0.1:9292?key=path_to_key&cert=path_to_cert'
++.RE
++.PP
++The following example show how to Create a control server and use
++.BR pumactl (1)
++to interact with the control server to restart \fBpuma\fR.
++.RS
++.B puma --control-url tcp://127.0.0.1:9293 --control-token foo
++.br
++.B pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart
++.RE
++.PP
++
++.SH "CONFIGURATION FILE"
++.B puma
++will look for a configuration file at \fIconfig/puma.rb\fR. If an environment
++is specified, either via the \fB\-e\fR and \fB\-\-environment\fR flags, or
++through the \fIRACK_ENV\fR or the \fIRAILS_ENV\fR environment variables, it
++looks for configuration at \fIconfig/puma/<environment_name>.rb\fR.
++.PP
++The \fB\-C\fR flag allows one to pass on a custom configuration location. If
++the value specified is a dash (\fI\-\fR) \fBpuma\fR won't look for any
++configuration file:
++.PP
++.RS
++.B puma -C \(dq\-\(dq
++.RE
++
++.SH "SEE ALSO"
++.PP
++There is extensive documentation at <\%https://puma.io/puma/\%> and
++<\%https://github.com/puma/puma\%>.
++
++.SH AUTHOR
++.PP
++This manual page was written by \fBDaniel Leidert\fP
++<\%dleidert@debian\.org\%>, for the Debian GNU/Linux system (but may be used by
++others).
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b43bf86b50fd8d3529a0dc062c30006ed38f309e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++README.md
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..e39721e20f0708703dc6d9b607634636d625e9b2
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++examples/*
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..711e9813759eb4f1624581f4a0260d3166dfbb8d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++# this is one of several sub-directories; no need to rename it
++repeated-path-segment puma [usr/share/doc/puma/examples/puma/]
++repeated-path-segment 3.1.0 [usr/lib/x86_64-linux-gnu/rubygems-integration/3.1.0/extensions/x86_64-linux/3.1.0/]
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8c2d5877bb9f1f190cac012f6d69e19b76971830
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++debian/puma.1
++debian/pumactl.1
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..67e70d67360abba841fc52c5fa025e374cbe8ef8
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,99 @@@
++.TH PUMA "1" "January 2020" "PUMA 3.12" "User Commands"
++
++.SH NAME
++pumactl \- command line client for puma
++
++.SH USAGE
++.B pumactl [options...] [commands]
++.PP
++.B pumactl [\-h | \-\-help | \-V | \-\-version]
++
++.SH COMMANDS
++.TP
++.B halt
++Halt the server.
++.TP
++.B restart
++Restart the server.
++.TP
++.B phased-restart
++Restart server but phase out old workers while starting new workers one at a
++time.
++.TP
++.B start
++Start the server.
++.TP
++.B stats
++Show stats about the server.
++.TP
++.B status
++Show server status.
++.TP
++.B stop
++Stop server.
++.TP
++.B reload-worker-directory
++Reload the worker directory.
++.TP
++.B gc
++Start garbage collector.
++.TP
++.B gc-stats
++Show information about garbage collector.
++
++.SH OPTIONS
++.PP
++The following options are available:
++.TP
++.BI "\-F, \-\-config\-file " PATH
++Load given path as a config file.
++.TP
++.BI "\-T, \-\-control\-token " TOKEN
++The \fITOKEN\fR to use as authentication for the control server.
++.TP
++.BI "\-C, \-\-control\-url " URL
++The bind \fIURL\fR to use for the control server and app. Use \fIauto\fR to
++use a temp unix server. This requires to use a \fB\-\-control\-token\fR, which
++needs to be given with every request to the control server (\fItoken=foo\fR).
++.TP
++.BI "\-p, \-\-pid " PID
++Define the TCP port to bind to. Use \fB\-b\fR for more advanced options.
++.TP
++.BI "\-P, \-\-pidfile " PATH
++Use the given path as PID file.
++.TP
++.B \-Q, \-\-quiet
++Don't display messages.
++.TP
++.BI "\-S, \-\-state " PATH
++Where the state file is.
++.TP
++.B \-H, \-\-help
++Show help.
++.TP    
++.B \-V, \-\-version
++Print the version information.
++
++.SH EXAMPLES
++Create a control server and use
++.BR pumactl (1)
++to interact with the control server to restart \fBpuma\fR.
++.RS
++.B puma --control-url tcp://127.0.0.1:9293 --control-token foo
++.br
++.B pumactl --control-url 'tcp://127.0.0.1:9293' --control-token foo restart
++.RE
++.PP
++
++.SH "SEE ALSO"
++.PP
++.BR puma (1)
++.PP
++There is extensive documentation at <\%https://puma.io/puma/\%> and
++<\%https://github.com/puma/puma\%>.
++
++.SH AUTHOR
++.PP
++This manual page was written by \fBDaniel Leidert\fP
++<\%dleidert@debian\.org\%>, for the Debian GNU/Linux system (but may be used by
++others).
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..67a5a4a70b21c9aab279faf3786f42a86cd5e40b
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,22 @@@
++require 'gem2deb/rake/testtask'
++
++Gem2Deb::Rake::TestTask.new do |t|
++  t.libs = ['test']
++    t.test_files = FileList['test/**/*_test.rb'] + FileList['test/**/test_*.rb'] - FileList[
++      'test/test_integration_cluster.rb',
++      'test/test_worker_gem_independence.rb',
++      'test/test_rack_version_restriction.rb',
++      'test/test_preserve_bundler_env.rb',
++    ]
++  t.verbose = true
++end.tap do |t|
++  exclude = %w[
++    test_application_logs_are_flushed_on_write
++    test_hot_restart_does_not_drop_connections
++    test_logs_all_localhost_bindings
++    test_multiple_requests_waiting_on_less_busy_worker
++    test_term_not_accepts_new_connections
++    test_prune_bundler_with_multiple_workers
++  ]
++  t.options << ' ' << "-e'/" << exclude.join('|') << "/'"
++end
diff --cc debian/rules
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..da15652282ad87fd94648c270f09aeb244e732a3
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,14 @@@
++#!/usr/bin/make -f
++
++export GEM2DEB_TEST_RUNNER = --check-dependencies
++export DH_RUBY = --gem-install
++export DH_RUBY_GEM_INSTALL_EXCLUDE = benchmarks/* docs/* win_gem_test/* tools/* bin/puma-wild
++export LANG = C.UTF-8
++export LC_ALL = C.UTF-8
++export TEST_CASE_TIMEOUT = 300
++
++%:
++      dh $@ --buildsystem=ruby --with ruby
++
++override_dh_installchangelogs:
++      dh_installchangelogs History.md
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..33c3a640d2a84306b6a8b5640692ac3481739e65
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++---
++include:
++  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
++  - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..163aaf8d82b6c54f23c45f32895dbdfdcc27b047
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++3.0 (quilt)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..362d49eeddf78b4541c161f629ae876d5bff7729
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,2 @@@
++# no signed tarballs by upstream
++puma source: debian-watch-does-not-check-gpg-signature 
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..cbe22a282bcbdc788cd8d52c041ca0f2171e255f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,7 @@@
++---
++Archive: GitHub
++Bug-Database: https://github.com/puma/puma/issues
++Bug-Submit: https://github.com/puma/puma/issues/new
++Changelog: https://github.com/puma/puma/releases
++Repository: https://github.com/puma/puma.git
++Repository-Browse: https://github.com/puma/puma
diff --cc debian/watch
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b06856ff3d2cba70a8fbcacd9388f1043cf985e1
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,5 @@@
++version=4
++opts="searchmode=plain, \
++  filenamemangle=s/.+\/v@ANY_VERSION@/@PACKAGE@-$1\.tar\.gz/" \
++https://api.github.com/repos/puma/puma/tags \
++https://api.github.com/repos/puma/puma/tarball/refs/tags/v@ANY_VERSION@