Import puma_6.4.3-2.debian.tar.xz
authorLucas Kanashiro <kanashiro@debian.org>
Mon, 23 Dec 2024 22:07:19 +0000 (19:07 -0300)
committerLucas Kanashiro <kanashiro@debian.org>
Mon, 23 Dec 2024 22:07:19 +0000 (19:07 -0300)
[dgit import tarball puma 6.4.3-2 puma_6.4.3-2.debian.tar.xz]

33 files changed:
README.source [new file with mode: 0644]
changelog [new file with mode: 0644]
clean [new file with mode: 0644]
control [new file with mode: 0644]
copyright [new file with mode: 0644]
gbp.conf [new file with mode: 0644]
patches/0004-puma.gemspec-drop-git-usage.patch [new file with mode: 0644]
patches/0009-CI-update-chain-certs-example-files-3426.patch [new file with mode: 0644]
patches/0010-Update-all-certs.patch [new file with mode: 0644]
patches/0011-Fix-path-of-certs-useb-by-test_example_cert_expirati.patch [new file with mode: 0644]
patches/0011-disable-minitest-extensions.patch [new file with mode: 0644]
patches/0012-disable-cli-ssl-tests.patch [new file with mode: 0644]
patches/0013-fix-test-term-not-accepts-new-connections.patch [new file with mode: 0644]
patches/0014-disable-test-failing-on-amd64.patch [new file with mode: 0644]
patches/0015-disable-different-output-test.patch [new file with mode: 0644]
patches/0016-disable-test-failing-on-arm64.patch [new file with mode: 0644]
patches/0017-disable-test-failing-on-armhf.patch [new file with mode: 0644]
patches/0018-disable-test-failing-with-ruby3.2.patch [new file with mode: 0644]
patches/0018-update-certs-from-upstream.patch [new file with mode: 0644]
patches/series [new file with mode: 0644]
puma.1 [new file with mode: 0644]
puma.docs [new file with mode: 0644]
puma.examples [new file with mode: 0644]
puma.lintian-overrides [new file with mode: 0644]
puma.manpages [new file with mode: 0644]
pumactl.1 [new file with mode: 0644]
ruby-tests.rake [new file with mode: 0644]
rules [new file with mode: 0755]
salsa-ci.yml [new file with mode: 0644]
source/format [new file with mode: 0644]
source/lintian-overrides [new file with mode: 0644]
upstream/metadata [new file with mode: 0644]
watch [new file with mode: 0644]

diff --git a/README.source b/README.source
new file mode 100644 (file)
index 0000000..620cda3
--- /dev/null
@@ -0,0 +1,14 @@
+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
diff --git a/changelog b/changelog
new file mode 100644 (file)
index 0000000..7b7d539
--- /dev/null
+++ b/changelog
@@ -0,0 +1,371 @@
+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 --git a/clean b/clean
new file mode 100644 (file)
index 0000000..4535125
--- /dev/null
+++ b/clean
@@ -0,0 +1 @@
+tmp/restart.txt
diff --git a/control b/control
new file mode 100644 (file)
index 0000000..c1fcb57
--- /dev/null
+++ b/control
@@ -0,0 +1,32 @@
+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,
+               rake,
+               ruby-localhost,
+               ruby-minitest-stub-const,
+               ruby-nio4r (>= 2),
+               ruby-rack (<< 3),
+               ruby-sd-notify,
+               procps
+Standards-Version: 4.7.0
+Vcs-Git: https://salsa.debian.org/ruby-team/puma.git -b debian/experimental
+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.
diff --git a/copyright b/copyright
new file mode 100644 (file)
index 0000000..70590cd
--- /dev/null
+++ b/copyright
@@ -0,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 --git a/gbp.conf b/gbp.conf
new file mode 100644 (file)
index 0000000..da9f191
--- /dev/null
+++ b/gbp.conf
@@ -0,0 +1,4 @@
+[DEFAULT]
+pristine-tar = true
+sign-tags = true
+verbose = true
diff --git a/patches/0004-puma.gemspec-drop-git-usage.patch b/patches/0004-puma.gemspec-drop-git-usage.patch
new file mode 100644 (file)
index 0000000..3c0205c
--- /dev/null
@@ -0,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(-)
+
+diff --git a/puma.gemspec b/puma.gemspec
+index f5e01c2..9ff86a3 100644
+--- a/puma.gemspec
++++ b/puma.gemspec
+@@ -13,8 +13,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=)
diff --git a/patches/0009-CI-update-chain-certs-example-files-3426.patch b/patches/0009-CI-update-chain-certs-example-files-3426.patch
new file mode 100644 (file)
index 0000000..d7b0bd0
--- /dev/null
@@ -0,0 +1,521 @@
+From: Patrik Ragnarsson <patrik@starkast.net>
+Date: Sun, 14 Jul 2024 18:44:29 +0200
+Subject: CI: update chain certs example files (#3426)
+
+Ran "ruby examples/puma/chain_cert/generate_chain_test.rb"
+
+examples/puma/chain_cert/cert.crt expired June 5, 2024 before this change, causing test failures.
+
+Origin: upstream, https://github.com/puma/puma/commit/11e5d6dcbf0f6bfb170f38c5713d5851399a55dd
+---
+ 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/generate_chain_test.rb |  5 +-
+ examples/puma/chain_cert/intermediate.crt       | 32 ++++----
+ examples/puma/chain_cert/intermediate.key       | 50 ++++++-------
+ 9 files changed, 207 insertions(+), 207 deletions(-)
+
+diff --git a/examples/puma/chain_cert/ca.crt b/examples/puma/chain_cert/ca.crt
+index a5ae2d7..3247c10 100644
+--- a/examples/puma/chain_cert/ca.crt
++++ b/examples/puma/chain_cert/ca.crt
+@@ -1,19 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+-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
++Srj3l9ghFLwEImIBPw==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/ca.key b/examples/puma/chain_cert/ca.key
+index 4d4369a..c228706 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 5d77a44..785fc82 100644
+--- a/examples/puma/chain_cert/ca_chain.pem
++++ b/examples/puma/chain_cert/ca_chain.pem
+@@ -1,39 +1,40 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yMzA2MDEwMDAwMDBaFw0yNzA2MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAOHKwUnnX7QXvewBtH5XAtRbhhgAIQQ14pxs
+-9w3WBWY6B7zKZdkRnu/bULwP4QGHPc/YAtWSMN+1aWWm/6od3xn0AfFrzWxzMXVT
+-ZTnI6aQ3emxIec3gc5Xa4+oF0SUmVZiY3U9l4Apk1d4xNnV81UzE7KpdSUqYXdS/
+-Ja7T9QXFbE0/5L7Ci9luVQLyUYNiW2CmaiiC1YE9292kfZTujsKKf4Og/65U4qgF
+-mfSTnIBSAHTkiF5Qo8QTx+qz55A0ue2NX3QXVZOYJMtjt8OQEWkGKP2iPFnGnd3i
+-TW57THaNNzVan0A96IZv3hGVNqqlUto6L0tni+QD+3d14FDRLKMCAwEAAaN1MHMw
+-HQYDVR0OBBYEFPsAsa4SCE1WrZvYs/3TKSllpTUbMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFIDE
+-rrQrGbYkUaWL+93VfSqFj3fWMA0GCSqGSIb3DQEBDQUAA4IBAQCCEJymTKz93kmQ
+-Bfgj1UkVo1MC4GQAwVDJJTdEk80a3AFPuwmuwcl50rq2w4UBN9vkleKWz9ysWSrQ
+-Qs5RoM08ggca1dqgzIKHH95ft0BFZixEfkAhfAcrEiBNT6H5lgJ+EcFNq1n1T435
+-ow3r9P3u4FlBP4BmfpffnOFlY1cTYsEOFtDSGmBe8mNJkx2z37OAiLtSKPtkfpeq
+-84haUFAvfJX/93JLsuHbrhZXTjXVGDsbITxheiqmxaN5HiFacG0Ju2USPtHAge8H
+-Rz3fbPlN2Txn83ejbaHetj2zrbsd+QobPusfDRZKUcDG/CSXV7lc65+Lp0iPbCd/
+-KG6q1Yf+
++hvcNAQEBBQADggEPADCCAQoCggEBANyc2QAnSAUwxbuaS2ps9JrZ3uu/z6T861kF
++cuOQaGdkSkTrYuqwZx8XG4KNC9QxJlmjo6NuZE2HduimlU0Lt4c79VrOzuhktrLc
++T1NL2fRX62qpvcznVGJEP8UhzhgvuhpLAvLr0/4wSt4mZOgZEFzJ5sTiapCie5GD
++szRDsuh4FNAwUMpqUxJ+Ri+z942gUhfhb3K07idI5flVSBIBjlCUvYvOuW0yo7Ne
++exdtbaqb7Ahe2vE7M+06Ld5X2KUhx60ueTgMrilm80tm+TontsF88uKUfZfmLMNG
++8ms2E3cN91OSweBthRxg9FBz5eF3lDcySrxtTPjNhcLp2B9YnE8CAwEAAaN1MHMw
++HQYDVR0OBBYEFB63KpMPIZiqsbc0XUhuEDXhPqUiMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFLVk
++Fh3q72RimfwyCrXMxSh25cUWMA0GCSqGSIb3DQEBDQUAA4IBAQBmv1bfw7CLhGwy
++aOzmBVINzfRJGCMZ7EXIMo0eBNsJ7V5DmQOIsOm/BU3FGvZ+6BcJZa98NkWQybYk
++c9slDyMGgQBVjbSW7l/aaejqKNZxD0rnN79801lN7IXSXbHk03sX8vXdXKsZSzeo
++4hKh4ZKDjKGBuGNM1nYHaTcX8EThe5VYbsydX/ShC0x3+XKHOH0BeUUjIFT2iscQ
+++UDqpWeMq6G+pXWVS7klezHIT5V0zg8apLhIt8o7NzJNQgz5LW/y+8LgWLEmBdp0
++Xj7RihQi0fxWhAWLFMgqK7QasJZZRJVOqEHabfsvCsAMzztDsm4EFzJMd0/tZXHq
++g3cTPG2b
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+-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
++Srj3l9ghFLwEImIBPw==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.crt b/examples/puma/chain_cert/cert.crt
+index 5c8dbce..8df6d84 100644
+--- a/examples/puma/chain_cert/cert.crt
++++ b/examples/puma/chain_cert/cert.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjMwNjA1MDAwMDAwWhcNMjQwNjA1
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwNzE0MDAwMDAwWhcNMjUwNzE0
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1iY3+/B0oIXUChZFnXVQvZ2PfYJ8UVeW
+-3Oq9a6zQTP95aSwtv/rAt1jYA1H18p6npa254ODZcdWp+EtvUIiTFIII9X0B6WH/
+-rDm8D6mDkMGi/L3DlJ1vJaOVbXe9NL33zJJznAZ0T2lcg9qXN6wbUIhcChRSMsFw
+-xR0pPnvZv34NBvefxNWnJpFKqyXEi64ONHwjil4/Sk7lunmguwLAPano3wp81qsp
+-rv8KTiqJUfF78CrtwY1LMWvC3AcbPBLlyBrr7mPfAoVuxu+s6tXqpcOsp/FoKa9Y
+-lIxS82po1aKLnXkAMc75rlT5WVXrPVeRWgDucxUDOXFpl955pNSQRQIDAQABo28w
+-bTAdBgNVHQ4EFgQU3FVgqa85bI7/5jVEfOh/w1RfvH4wCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU+wCxrhII
+-TVatm9iz/dMpKWWlNRswDQYJKoZIhvcNAQENBQADggEBAG0gjxN6U8EaUhaJJj8C
+-Av/5A+F5SPDotbpj4T/1ciSn8wQf3aotBaNCzv7mC2mWtl4PIrOZ8bH42dZ0sWEU
+-Ft1h4HVLQADv5QU0RKNuKXoDRvVXB6IDNAIWB+8NQwYwj+WvYH+BLoc53yBfHQGK
+-B+y8SVeEcQVjzmcZ2TUT2/b5XEsiV+ugLce294lUPIlSmWK043Oe3UfMRuurPwyj
+-Qjn/pwl7S22BRDCorQ5NThb+/lsO54J/8zpCxHmhgm152mXcCYBNjYLwd5SYvawN
+-Q5EDcE/31xqtZkGtBDb/ZqwUSbmwLb3qFRjgM/t+H2eUMyZUxbvmxzlZdAO7xAOC
+-fho=
++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA18r/nJpmqPzoMawvn7qt6Dtz3Jx5332M
++BnBxXf+dlwZo+YkXGCmtXGXi8UtNZh+CnvlBf4+nauxYwzEHrIbMafH+Zt63OUvA
++jb5uwDDaVOMal4vtwkoGzLJxINzvaxEzsSzX89maxkWyaRnaM9ac5/v0WvH0Kz+Z
++JhzFQAIpUdxwb235BKtIwyMkKqYQb8+0mxSIIEKP9dqsrWNFXiUY1YbY786Yz76N
++xAg/KFSUGdAPJlqMQEVaroTU6zNX5aa6WO8ynnBIvPdS9FbrfIupoXoTQ8WHnmeh
++N09auierVy//KtZIHFyd7pMaeiqgyWn91fRz9RluEhWT8IfuOofViQIDAQABo28w
++bTAdBgNVHQ4EFgQUBvBG+wQNE+xNksBRCuzO04bhs2kwCwYDVR0PBAQDAgbAMBMG
++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUHrcqkw8h
++mKqxtzRdSG4QNeE+pSIwDQYJKoZIhvcNAQENBQADggEBAKO8XfzNct6uwxSh4FVe
++xDcPbIOOGJv3lD2sA1xDRzw/djMITd2eRqG1iLim8whRfd1LqsXb7nHgPJIKIifR
++oqSg0LxmsmZ2+tocFpmVNppKWUggVAuH/yel1s9JWzEkB1NXyoRONQCZIuXTmInu
++RdrdERwy+1VZRSFL7IBZfg45ZzwH+/7Vaz5kY5FjkyBk0xwhIDRUXprO6ZhTokUC
++152UBWdAiK4IHRxLY+h2cjIsR8szSTUzS8erwqQmt+NIeiUEJYtuVS9rQ3zXNBKV
++l9X5G9FwHjWQL3j95ze60sa2xzObCqZ+w7f05O6ZiJ9dqdk+oIPe3+xWeQgVyYn0
++SLg=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.key b/examples/puma/chain_cert/cert.key
+index d6e70d8..411bdc8 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 b60ece6..134ea32 100644
+--- a/examples/puma/chain_cert/cert_chain.pem
++++ b/examples/puma/chain_cert/cert_chain.pem
+@@ -1,59 +1,60 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjMwNjA1MDAwMDAwWhcNMjQwNjA1
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwNzE0MDAwMDAwWhcNMjUwNzE0
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1iY3+/B0oIXUChZFnXVQvZ2PfYJ8UVeW
+-3Oq9a6zQTP95aSwtv/rAt1jYA1H18p6npa254ODZcdWp+EtvUIiTFIII9X0B6WH/
+-rDm8D6mDkMGi/L3DlJ1vJaOVbXe9NL33zJJznAZ0T2lcg9qXN6wbUIhcChRSMsFw
+-xR0pPnvZv34NBvefxNWnJpFKqyXEi64ONHwjil4/Sk7lunmguwLAPano3wp81qsp
+-rv8KTiqJUfF78CrtwY1LMWvC3AcbPBLlyBrr7mPfAoVuxu+s6tXqpcOsp/FoKa9Y
+-lIxS82po1aKLnXkAMc75rlT5WVXrPVeRWgDucxUDOXFpl955pNSQRQIDAQABo28w
+-bTAdBgNVHQ4EFgQU3FVgqa85bI7/5jVEfOh/w1RfvH4wCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAU+wCxrhII
+-TVatm9iz/dMpKWWlNRswDQYJKoZIhvcNAQENBQADggEBAG0gjxN6U8EaUhaJJj8C
+-Av/5A+F5SPDotbpj4T/1ciSn8wQf3aotBaNCzv7mC2mWtl4PIrOZ8bH42dZ0sWEU
+-Ft1h4HVLQADv5QU0RKNuKXoDRvVXB6IDNAIWB+8NQwYwj+WvYH+BLoc53yBfHQGK
+-B+y8SVeEcQVjzmcZ2TUT2/b5XEsiV+ugLce294lUPIlSmWK043Oe3UfMRuurPwyj
+-Qjn/pwl7S22BRDCorQ5NThb+/lsO54J/8zpCxHmhgm152mXcCYBNjYLwd5SYvawN
+-Q5EDcE/31xqtZkGtBDb/ZqwUSbmwLb3qFRjgM/t+H2eUMyZUxbvmxzlZdAO7xAOC
+-fho=
++hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA18r/nJpmqPzoMawvn7qt6Dtz3Jx5332M
++BnBxXf+dlwZo+YkXGCmtXGXi8UtNZh+CnvlBf4+nauxYwzEHrIbMafH+Zt63OUvA
++jb5uwDDaVOMal4vtwkoGzLJxINzvaxEzsSzX89maxkWyaRnaM9ac5/v0WvH0Kz+Z
++JhzFQAIpUdxwb235BKtIwyMkKqYQb8+0mxSIIEKP9dqsrWNFXiUY1YbY786Yz76N
++xAg/KFSUGdAPJlqMQEVaroTU6zNX5aa6WO8ynnBIvPdS9FbrfIupoXoTQ8WHnmeh
++N09auierVy//KtZIHFyd7pMaeiqgyWn91fRz9RluEhWT8IfuOofViQIDAQABo28w
++bTAdBgNVHQ4EFgQUBvBG+wQNE+xNksBRCuzO04bhs2kwCwYDVR0PBAQDAgbAMBMG
++A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUHrcqkw8h
++mKqxtzRdSG4QNeE+pSIwDQYJKoZIhvcNAQENBQADggEBAKO8XfzNct6uwxSh4FVe
++xDcPbIOOGJv3lD2sA1xDRzw/djMITd2eRqG1iLim8whRfd1LqsXb7nHgPJIKIifR
++oqSg0LxmsmZ2+tocFpmVNppKWUggVAuH/yel1s9JWzEkB1NXyoRONQCZIuXTmInu
++RdrdERwy+1VZRSFL7IBZfg45ZzwH+/7Vaz5kY5FjkyBk0xwhIDRUXprO6ZhTokUC
++152UBWdAiK4IHRxLY+h2cjIsR8szSTUzS8erwqQmt+NIeiUEJYtuVS9rQ3zXNBKV
++l9X5G9FwHjWQL3j95ze60sa2xzObCqZ+w7f05O6ZiJ9dqdk+oIPe3+xWeQgVyYn0
++SLg=
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yMzA2MDEwMDAwMDBaFw0yNzA2MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAOHKwUnnX7QXvewBtH5XAtRbhhgAIQQ14pxs
+-9w3WBWY6B7zKZdkRnu/bULwP4QGHPc/YAtWSMN+1aWWm/6od3xn0AfFrzWxzMXVT
+-ZTnI6aQ3emxIec3gc5Xa4+oF0SUmVZiY3U9l4Apk1d4xNnV81UzE7KpdSUqYXdS/
+-Ja7T9QXFbE0/5L7Ci9luVQLyUYNiW2CmaiiC1YE9292kfZTujsKKf4Og/65U4qgF
+-mfSTnIBSAHTkiF5Qo8QTx+qz55A0ue2NX3QXVZOYJMtjt8OQEWkGKP2iPFnGnd3i
+-TW57THaNNzVan0A96IZv3hGVNqqlUto6L0tni+QD+3d14FDRLKMCAwEAAaN1MHMw
+-HQYDVR0OBBYEFPsAsa4SCE1WrZvYs/3TKSllpTUbMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFIDE
+-rrQrGbYkUaWL+93VfSqFj3fWMA0GCSqGSIb3DQEBDQUAA4IBAQCCEJymTKz93kmQ
+-Bfgj1UkVo1MC4GQAwVDJJTdEk80a3AFPuwmuwcl50rq2w4UBN9vkleKWz9ysWSrQ
+-Qs5RoM08ggca1dqgzIKHH95ft0BFZixEfkAhfAcrEiBNT6H5lgJ+EcFNq1n1T435
+-ow3r9P3u4FlBP4BmfpffnOFlY1cTYsEOFtDSGmBe8mNJkx2z37OAiLtSKPtkfpeq
+-84haUFAvfJX/93JLsuHbrhZXTjXVGDsbITxheiqmxaN5HiFacG0Ju2USPtHAge8H
+-Rz3fbPlN2Txn83ejbaHetj2zrbsd+QobPusfDRZKUcDG/CSXV7lc65+Lp0iPbCd/
+-KG6q1Yf+
++hvcNAQEBBQADggEPADCCAQoCggEBANyc2QAnSAUwxbuaS2ps9JrZ3uu/z6T861kF
++cuOQaGdkSkTrYuqwZx8XG4KNC9QxJlmjo6NuZE2HduimlU0Lt4c79VrOzuhktrLc
++T1NL2fRX62qpvcznVGJEP8UhzhgvuhpLAvLr0/4wSt4mZOgZEFzJ5sTiapCie5GD
++szRDsuh4FNAwUMpqUxJ+Ri+z942gUhfhb3K07idI5flVSBIBjlCUvYvOuW0yo7Ne
++exdtbaqb7Ahe2vE7M+06Ld5X2KUhx60ueTgMrilm80tm+TontsF88uKUfZfmLMNG
++8ms2E3cN91OSweBthRxg9FBz5eF3lDcySrxtTPjNhcLp2B9YnE8CAwEAAaN1MHMw
++HQYDVR0OBBYEFB63KpMPIZiqsbc0XUhuEDXhPqUiMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFLVk
++Fh3q72RimfwyCrXMxSh25cUWMA0GCSqGSIb3DQEBDQUAA4IBAQBmv1bfw7CLhGwy
++aOzmBVINzfRJGCMZ7EXIMo0eBNsJ7V5DmQOIsOm/BU3FGvZ+6BcJZa98NkWQybYk
++c9slDyMGgQBVjbSW7l/aaejqKNZxD0rnN79801lN7IXSXbHk03sX8vXdXKsZSzeo
++4hKh4ZKDjKGBuGNM1nYHaTcX8EThe5VYbsydX/ShC0x3+XKHOH0BeUUjIFT2iscQ
+++UDqpWeMq6G+pXWVS7klezHIT5V0zg8apLhIt8o7NzJNQgz5LW/y+8LgWLEmBdp0
++Xj7RihQi0fxWhAWLFMgqK7QasJZZRJVOqEHabfsvCsAMzztDsm4EFzJMd0/tZXHq
++g3cTPG2b
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+-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
++Srj3l9ghFLwEImIBPw==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/generate_chain_test.rb b/examples/puma/chain_cert/generate_chain_test.rb
+index 31c215e..0e6b0d8 100644
+--- a/examples/puma/chain_cert/generate_chain_test.rb
++++ b/examples/puma/chain_cert/generate_chain_test.rb
+@@ -14,10 +14,7 @@ expires in 4 years
+ =end
+ require 'bundler/inline'
+-
+-
+-require 'certificate_authority'
+-gemfile do
++gemfile(true) do
+   source 'https://rubygems.org'
+   gem 'certificate_authority'
+ end
+diff --git a/examples/puma/chain_cert/intermediate.crt b/examples/puma/chain_cert/intermediate.crt
+index 8194028..f26fb01 100644
+--- a/examples/puma/chain_cert/intermediate.crt
++++ b/examples/puma/chain_cert/intermediate.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yMzA2MDEwMDAwMDBaFw0yNzA2MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAOHKwUnnX7QXvewBtH5XAtRbhhgAIQQ14pxs
+-9w3WBWY6B7zKZdkRnu/bULwP4QGHPc/YAtWSMN+1aWWm/6od3xn0AfFrzWxzMXVT
+-ZTnI6aQ3emxIec3gc5Xa4+oF0SUmVZiY3U9l4Apk1d4xNnV81UzE7KpdSUqYXdS/
+-Ja7T9QXFbE0/5L7Ci9luVQLyUYNiW2CmaiiC1YE9292kfZTujsKKf4Og/65U4qgF
+-mfSTnIBSAHTkiF5Qo8QTx+qz55A0ue2NX3QXVZOYJMtjt8OQEWkGKP2iPFnGnd3i
+-TW57THaNNzVan0A96IZv3hGVNqqlUto6L0tni+QD+3d14FDRLKMCAwEAAaN1MHMw
+-HQYDVR0OBBYEFPsAsa4SCE1WrZvYs/3TKSllpTUbMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFIDE
+-rrQrGbYkUaWL+93VfSqFj3fWMA0GCSqGSIb3DQEBDQUAA4IBAQCCEJymTKz93kmQ
+-Bfgj1UkVo1MC4GQAwVDJJTdEk80a3AFPuwmuwcl50rq2w4UBN9vkleKWz9ysWSrQ
+-Qs5RoM08ggca1dqgzIKHH95ft0BFZixEfkAhfAcrEiBNT6H5lgJ+EcFNq1n1T435
+-ow3r9P3u4FlBP4BmfpffnOFlY1cTYsEOFtDSGmBe8mNJkx2z37OAiLtSKPtkfpeq
+-84haUFAvfJX/93JLsuHbrhZXTjXVGDsbITxheiqmxaN5HiFacG0Ju2USPtHAge8H
+-Rz3fbPlN2Txn83ejbaHetj2zrbsd+QobPusfDRZKUcDG/CSXV7lc65+Lp0iPbCd/
+-KG6q1Yf+
++hvcNAQEBBQADggEPADCCAQoCggEBANyc2QAnSAUwxbuaS2ps9JrZ3uu/z6T861kF
++cuOQaGdkSkTrYuqwZx8XG4KNC9QxJlmjo6NuZE2HduimlU0Lt4c79VrOzuhktrLc
++T1NL2fRX62qpvcznVGJEP8UhzhgvuhpLAvLr0/4wSt4mZOgZEFzJ5sTiapCie5GD
++szRDsuh4FNAwUMpqUxJ+Ri+z942gUhfhb3K07idI5flVSBIBjlCUvYvOuW0yo7Ne
++exdtbaqb7Ahe2vE7M+06Ld5X2KUhx60ueTgMrilm80tm+TontsF88uKUfZfmLMNG
++8ms2E3cN91OSweBthRxg9FBz5eF3lDcySrxtTPjNhcLp2B9YnE8CAwEAAaN1MHMw
++HQYDVR0OBBYEFB63KpMPIZiqsbc0XUhuEDXhPqUiMA4GA1UdDwEB/wQEAwICBDAT
++BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFLVk
++Fh3q72RimfwyCrXMxSh25cUWMA0GCSqGSIb3DQEBDQUAA4IBAQBmv1bfw7CLhGwy
++aOzmBVINzfRJGCMZ7EXIMo0eBNsJ7V5DmQOIsOm/BU3FGvZ+6BcJZa98NkWQybYk
++c9slDyMGgQBVjbSW7l/aaejqKNZxD0rnN79801lN7IXSXbHk03sX8vXdXKsZSzeo
++4hKh4ZKDjKGBuGNM1nYHaTcX8EThe5VYbsydX/ShC0x3+XKHOH0BeUUjIFT2iscQ
+++UDqpWeMq6G+pXWVS7klezHIT5V0zg8apLhIt8o7NzJNQgz5LW/y+8LgWLEmBdp0
++Xj7RihQi0fxWhAWLFMgqK7QasJZZRJVOqEHabfsvCsAMzztDsm4EFzJMd0/tZXHq
++g3cTPG2b
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/intermediate.key b/examples/puma/chain_cert/intermediate.key
+index 53a547b..bb63df7 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/patches/0010-Update-all-certs.patch b/patches/0010-Update-all-certs.patch
new file mode 100644 (file)
index 0000000..53b4d00
--- /dev/null
@@ -0,0 +1,1114 @@
+From: MSP-Greg <Greg.mpls@gmail.com>
+Date: Sun, 11 Aug 2024 14:29:44 -0500
+Subject: Update all certs
+
+Origin: upstream, https://github.com/puma/puma/commit/6db7c28b069710419cc
+Debian-Bug: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1078640
+---
+ examples/puma/cert_puma.pem                   |  30 ++++----
+ examples/puma/chain_cert/ca.crt               |  30 ++++----
+ examples/puma/chain_cert/ca.key               |  50 +++++++-------
+ examples/puma/chain_cert/ca_chain.pem         |  62 ++++++++---------
+ examples/puma/chain_cert/cert.crt             |  32 ++++-----
+ examples/puma/chain_cert/cert.key             |  50 +++++++-------
+ examples/puma/chain_cert/cert_chain.pem       |  94 +++++++++++++-------------
+ examples/puma/chain_cert/intermediate.crt     |  32 ++++-----
+ examples/puma/chain_cert/intermediate.key     |  50 +++++++-------
+ examples/puma/client_certs/ca.crt             |  19 ++++++
+ examples/puma/client_certs/ca.key             |  27 ++++++++
+ examples/puma/client_certs/client.crt         |  19 ++++++
+ examples/puma/client_certs/client.key         |  27 ++++++++
+ examples/puma/client_certs/client_expired.crt |  19 ++++++
+ examples/puma/client_certs/client_expired.key |  27 ++++++++
+ examples/puma/client_certs/client_unknown.crt |  19 ++++++
+ examples/puma/client_certs/client_unknown.key |  27 ++++++++
+ examples/puma/client_certs/server.crt         |  19 ++++++
+ examples/puma/client_certs/server.key         |  27 ++++++++
+ examples/puma/client_certs/unknown_ca.crt     |  19 ++++++
+ examples/puma/client_certs/unknown_ca.key     |  27 ++++++++
+ examples/puma/encrypted_puma_keypair.pem      |  60 ++++++++--------
+ examples/puma/keystore.jks                    | Bin 2253 -> 2253 bytes
+ examples/puma/puma_keypair.pem                |  50 +++++++-------
+ examples/puma/server.p12                      | Bin 2550 -> 2700 bytes
+ 25 files changed, 546 insertions(+), 270 deletions(-)
+ create mode 100644 examples/puma/client_certs/ca.crt
+ create mode 100644 examples/puma/client_certs/ca.key
+ create mode 100644 examples/puma/client_certs/client.crt
+ create mode 100644 examples/puma/client_certs/client.key
+ create mode 100644 examples/puma/client_certs/client_expired.crt
+ create mode 100644 examples/puma/client_certs/client_expired.key
+ create mode 100644 examples/puma/client_certs/client_unknown.crt
+ create mode 100644 examples/puma/client_certs/client_unknown.key
+ create mode 100644 examples/puma/client_certs/server.crt
+ create mode 100644 examples/puma/client_certs/server.key
+ create mode 100644 examples/puma/client_certs/unknown_ca.crt
+ create mode 100644 examples/puma/client_certs/unknown_ca.key
+
+diff --git a/examples/puma/cert_puma.pem b/examples/puma/cert_puma.pem
+index a073099..6cbb9c1 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 3247c10..9acfe79 100644
+--- a/examples/puma/chain_cert/ca.crt
++++ b/examples/puma/chain_cert/ca.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMBwx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAwsnMX57iy7q+UmP57mn6VQYnG/MFL0BvC4NcV/OpS4BkOHHi
+-pvp5tJxZ7N/OSg/zkYSTEPEvzLbtIORmaAMUse5rmlth/y+yMtNOc3wIJt0+Dyz8
+-804gkDhb5Mq3Cslo899IAJ/6aBbCElLq7GC6vMtIvUvHtXHynnl7R21j/+Q6CZJj
+-bj9UuZQ3Zqxnw300E/ePrO/UlDpuihG6H2MwxncE8P6TxNkKF7H9nG5e68qeZIeF
+-R/LqQQjoZJDVlIxL3DLoiVUmC/75NWCJwDo2bJcE1T8tkN5lcXKo1z5XcHsUx70d
+-e78LVy7SIKLI2YvC1VhJIy53f2XL+9iOWqsdyQIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBS1ZBYd6u9kYpn8Mgq1zMUoduXFFjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
++AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
++E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
++UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
++xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
++Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
++JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
++BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+ CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAMsHU
+-XdW0ykvbK5jeisKcVmHfiete8UF0ftNfaIBU44u0wF3gvmpXz6hVBRaxhcD2nTgJ
+-bYHUqSMmA0zD9RS3puPZpKj5k4x51WJVPQc9OSpKbNCdsaNtus6frLSuBrVypu9L
+-7GEnTe2bS5j61XQXL9txKbECpFfP9tZiBoQ6a3aZS1eN8UUucbWQTweMrmRohFBa
+-VG695OlN05QLGoyAdCHYWA63FSjHo/uWTHVoZ2QI8PJ8WE724kB6rhrkLEYzj9sk
+-jhd5r+z3HuMtDx8OhTMreaByAyox+Rh2pGbKFtoGWpXsTz7Bf/ZBmosRw+fbxiJl
+-Srj3l9ghFLwEImIBPw==
++VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
++9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
++nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
++tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
++ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
++SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
++8uByucqDNovFjYNMKw==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/ca.key b/examples/puma/chain_cert/ca.key
+index c228706..c884487 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 785fc82..7d500ef 100644
+--- a/examples/puma/chain_cert/ca_chain.pem
++++ b/examples/puma/chain_cert/ca_chain.pem
+@@ -1,40 +1,40 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBANyc2QAnSAUwxbuaS2ps9JrZ3uu/z6T861kF
+-cuOQaGdkSkTrYuqwZx8XG4KNC9QxJlmjo6NuZE2HduimlU0Lt4c79VrOzuhktrLc
+-T1NL2fRX62qpvcznVGJEP8UhzhgvuhpLAvLr0/4wSt4mZOgZEFzJ5sTiapCie5GD
+-szRDsuh4FNAwUMpqUxJ+Ri+z942gUhfhb3K07idI5flVSBIBjlCUvYvOuW0yo7Ne
+-exdtbaqb7Ahe2vE7M+06Ld5X2KUhx60ueTgMrilm80tm+TontsF88uKUfZfmLMNG
+-8ms2E3cN91OSweBthRxg9FBz5eF3lDcySrxtTPjNhcLp2B9YnE8CAwEAAaN1MHMw
+-HQYDVR0OBBYEFB63KpMPIZiqsbc0XUhuEDXhPqUiMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFLVk
+-Fh3q72RimfwyCrXMxSh25cUWMA0GCSqGSIb3DQEBDQUAA4IBAQBmv1bfw7CLhGwy
+-aOzmBVINzfRJGCMZ7EXIMo0eBNsJ7V5DmQOIsOm/BU3FGvZ+6BcJZa98NkWQybYk
+-c9slDyMGgQBVjbSW7l/aaejqKNZxD0rnN79801lN7IXSXbHk03sX8vXdXKsZSzeo
+-4hKh4ZKDjKGBuGNM1nYHaTcX8EThe5VYbsydX/ShC0x3+XKHOH0BeUUjIFT2iscQ
+-+UDqpWeMq6G+pXWVS7klezHIT5V0zg8apLhIt8o7NzJNQgz5LW/y+8LgWLEmBdp0
+-Xj7RihQi0fxWhAWLFMgqK7QasJZZRJVOqEHabfsvCsAMzztDsm4EFzJMd0/tZXHq
+-g3cTPG2b
++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
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+ MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMBwx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAwsnMX57iy7q+UmP57mn6VQYnG/MFL0BvC4NcV/OpS4BkOHHi
+-pvp5tJxZ7N/OSg/zkYSTEPEvzLbtIORmaAMUse5rmlth/y+yMtNOc3wIJt0+Dyz8
+-804gkDhb5Mq3Cslo899IAJ/6aBbCElLq7GC6vMtIvUvHtXHynnl7R21j/+Q6CZJj
+-bj9UuZQ3Zqxnw300E/ePrO/UlDpuihG6H2MwxncE8P6TxNkKF7H9nG5e68qeZIeF
+-R/LqQQjoZJDVlIxL3DLoiVUmC/75NWCJwDo2bJcE1T8tkN5lcXKo1z5XcHsUx70d
+-e78LVy7SIKLI2YvC1VhJIy53f2XL+9iOWqsdyQIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBS1ZBYd6u9kYpn8Mgq1zMUoduXFFjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
++AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
++E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
++UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
++xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
++Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
++JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
++BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+ CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAMsHU
+-XdW0ykvbK5jeisKcVmHfiete8UF0ftNfaIBU44u0wF3gvmpXz6hVBRaxhcD2nTgJ
+-bYHUqSMmA0zD9RS3puPZpKj5k4x51WJVPQc9OSpKbNCdsaNtus6frLSuBrVypu9L
+-7GEnTe2bS5j61XQXL9txKbECpFfP9tZiBoQ6a3aZS1eN8UUucbWQTweMrmRohFBa
+-VG695OlN05QLGoyAdCHYWA63FSjHo/uWTHVoZ2QI8PJ8WE724kB6rhrkLEYzj9sk
+-jhd5r+z3HuMtDx8OhTMreaByAyox+Rh2pGbKFtoGWpXsTz7Bf/ZBmosRw+fbxiJl
+-Srj3l9ghFLwEImIBPw==
++VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
++9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
++nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
++tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
++ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
++SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
++8uByucqDNovFjYNMKw==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.crt b/examples/puma/chain_cert/cert.crt
+index 8df6d84..8467b47 100644
+--- a/examples/puma/chain_cert/cert.crt
++++ b/examples/puma/chain_cert/cert.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwNzE0MDAwMDAwWhcNMjUwNzE0
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA18r/nJpmqPzoMawvn7qt6Dtz3Jx5332M
+-BnBxXf+dlwZo+YkXGCmtXGXi8UtNZh+CnvlBf4+nauxYwzEHrIbMafH+Zt63OUvA
+-jb5uwDDaVOMal4vtwkoGzLJxINzvaxEzsSzX89maxkWyaRnaM9ac5/v0WvH0Kz+Z
+-JhzFQAIpUdxwb235BKtIwyMkKqYQb8+0mxSIIEKP9dqsrWNFXiUY1YbY786Yz76N
+-xAg/KFSUGdAPJlqMQEVaroTU6zNX5aa6WO8ynnBIvPdS9FbrfIupoXoTQ8WHnmeh
+-N09auierVy//KtZIHFyd7pMaeiqgyWn91fRz9RluEhWT8IfuOofViQIDAQABo28w
+-bTAdBgNVHQ4EFgQUBvBG+wQNE+xNksBRCuzO04bhs2kwCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUHrcqkw8h
+-mKqxtzRdSG4QNeE+pSIwDQYJKoZIhvcNAQENBQADggEBAKO8XfzNct6uwxSh4FVe
+-xDcPbIOOGJv3lD2sA1xDRzw/djMITd2eRqG1iLim8whRfd1LqsXb7nHgPJIKIifR
+-oqSg0LxmsmZ2+tocFpmVNppKWUggVAuH/yel1s9JWzEkB1NXyoRONQCZIuXTmInu
+-RdrdERwy+1VZRSFL7IBZfg45ZzwH+/7Vaz5kY5FjkyBk0xwhIDRUXprO6ZhTokUC
+-152UBWdAiK4IHRxLY+h2cjIsR8szSTUzS8erwqQmt+NIeiUEJYtuVS9rQ3zXNBKV
+-l9X5G9FwHjWQL3j95ze60sa2xzObCqZ+w7f05O6ZiJ9dqdk+oIPe3+xWeQgVyYn0
+-SLg=
++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=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/cert.key b/examples/puma/chain_cert/cert.key
+index 411bdc8..ed2bd0d 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 134ea32..5f391f3 100644
+--- a/examples/puma/chain_cert/cert_chain.pem
++++ b/examples/puma/chain_cert/cert_chain.pem
+@@ -1,60 +1,60 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDLjCCAhagAwIBAgIBbzANBgkqhkiG9w0BAQ0FADAmMSQwIgYDVQQDDBtpbnRl
+-cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwNzE0MDAwMDAwWhcNMjUwNzE0
++cm1lZGlhdGUucHVtYS5sb2NhbGhvc3QwHhcNMjQwODExMDAwMDAwWhcNMjUwODEx
+ MDAwMDAwWjAeMRwwGgYDVQQDDBN0ZXN0LnB1bWEubG9jYWxob3N0MIIBIjANBgkq
+-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA18r/nJpmqPzoMawvn7qt6Dtz3Jx5332M
+-BnBxXf+dlwZo+YkXGCmtXGXi8UtNZh+CnvlBf4+nauxYwzEHrIbMafH+Zt63OUvA
+-jb5uwDDaVOMal4vtwkoGzLJxINzvaxEzsSzX89maxkWyaRnaM9ac5/v0WvH0Kz+Z
+-JhzFQAIpUdxwb235BKtIwyMkKqYQb8+0mxSIIEKP9dqsrWNFXiUY1YbY786Yz76N
+-xAg/KFSUGdAPJlqMQEVaroTU6zNX5aa6WO8ynnBIvPdS9FbrfIupoXoTQ8WHnmeh
+-N09auierVy//KtZIHFyd7pMaeiqgyWn91fRz9RluEhWT8IfuOofViQIDAQABo28w
+-bTAdBgNVHQ4EFgQUBvBG+wQNE+xNksBRCuzO04bhs2kwCwYDVR0PBAQDAgbAMBMG
+-A1UdJQQMMAoGCCsGAQUFBwMBMAkGA1UdEwQCMAAwHwYDVR0jBBgwFoAUHrcqkw8h
+-mKqxtzRdSG4QNeE+pSIwDQYJKoZIhvcNAQENBQADggEBAKO8XfzNct6uwxSh4FVe
+-xDcPbIOOGJv3lD2sA1xDRzw/djMITd2eRqG1iLim8whRfd1LqsXb7nHgPJIKIifR
+-oqSg0LxmsmZ2+tocFpmVNppKWUggVAuH/yel1s9JWzEkB1NXyoRONQCZIuXTmInu
+-RdrdERwy+1VZRSFL7IBZfg45ZzwH+/7Vaz5kY5FjkyBk0xwhIDRUXprO6ZhTokUC
+-152UBWdAiK4IHRxLY+h2cjIsR8szSTUzS8erwqQmt+NIeiUEJYtuVS9rQ3zXNBKV
+-l9X5G9FwHjWQL3j95ze60sa2xzObCqZ+w7f05O6ZiJ9dqdk+oIPe3+xWeQgVyYn0
+-SLg=
++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=
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBANyc2QAnSAUwxbuaS2ps9JrZ3uu/z6T861kF
+-cuOQaGdkSkTrYuqwZx8XG4KNC9QxJlmjo6NuZE2HduimlU0Lt4c79VrOzuhktrLc
+-T1NL2fRX62qpvcznVGJEP8UhzhgvuhpLAvLr0/4wSt4mZOgZEFzJ5sTiapCie5GD
+-szRDsuh4FNAwUMpqUxJ+Ri+z942gUhfhb3K07idI5flVSBIBjlCUvYvOuW0yo7Ne
+-exdtbaqb7Ahe2vE7M+06Ld5X2KUhx60ueTgMrilm80tm+TontsF88uKUfZfmLMNG
+-8ms2E3cN91OSweBthRxg9FBz5eF3lDcySrxtTPjNhcLp2B9YnE8CAwEAAaN1MHMw
+-HQYDVR0OBBYEFB63KpMPIZiqsbc0XUhuEDXhPqUiMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFLVk
+-Fh3q72RimfwyCrXMxSh25cUWMA0GCSqGSIb3DQEBDQUAA4IBAQBmv1bfw7CLhGwy
+-aOzmBVINzfRJGCMZ7EXIMo0eBNsJ7V5DmQOIsOm/BU3FGvZ+6BcJZa98NkWQybYk
+-c9slDyMGgQBVjbSW7l/aaejqKNZxD0rnN79801lN7IXSXbHk03sX8vXdXKsZSzeo
+-4hKh4ZKDjKGBuGNM1nYHaTcX8EThe5VYbsydX/ShC0x3+XKHOH0BeUUjIFT2iscQ
+-+UDqpWeMq6G+pXWVS7klezHIT5V0zg8apLhIt8o7NzJNQgz5LW/y+8LgWLEmBdp0
+-Xj7RihQi0fxWhAWLFMgqK7QasJZZRJVOqEHabfsvCsAMzztDsm4EFzJMd0/tZXHq
+-g3cTPG2b
++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
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+ MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMBwx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMBwx
+ GjAYBgNVBAMMEWNhLnB1bWEubG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
+-AQ8AMIIBCgKCAQEAwsnMX57iy7q+UmP57mn6VQYnG/MFL0BvC4NcV/OpS4BkOHHi
+-pvp5tJxZ7N/OSg/zkYSTEPEvzLbtIORmaAMUse5rmlth/y+yMtNOc3wIJt0+Dyz8
+-804gkDhb5Mq3Cslo899IAJ/6aBbCElLq7GC6vMtIvUvHtXHynnl7R21j/+Q6CZJj
+-bj9UuZQ3Zqxnw300E/ePrO/UlDpuihG6H2MwxncE8P6TxNkKF7H9nG5e68qeZIeF
+-R/LqQQjoZJDVlIxL3DLoiVUmC/75NWCJwDo2bJcE1T8tkN5lcXKo1z5XcHsUx70d
+-e78LVy7SIKLI2YvC1VhJIy53f2XL+9iOWqsdyQIDAQABo4GFMIGCMB0GA1UdDgQW
+-BBS1ZBYd6u9kYpn8Mgq1zMUoduXFFjAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
++AQ8AMIIBCgKCAQEAuKZ43p+68AFTSVno4p8rxk2Ixngw9CR9K5/11LCS+nM9jPph
++E0aWluwRAdWNs0CLN9A9ZKqJq+G67Y6CAw87g4RfUaZUkBkClwH76WUYzMTo9P3e
++UMpwzVtdrijW2Y/9MnxMCyt14WVfoY0itjEyfeGT3FbP8yKuk2qYoz3YecrhiRGu
++xv5gFZOd0hxIL0HkRe0lrpgWDj4MrvsBqUnb4aeqDgjz4lPUWo/GSvgU7xcV5Q6c
++Ti8FB9k3HZfphb2JHydZfxIqCCeflZlAQBBKNevWbSxhfsfjzqHmC64M9ELoJ/1J
++JFoX+zdlv9DqOn2k67N4rZcfptoEKPQThPmX+wIDAQABo4GFMIGCMB0GA1UdDgQW
++BBQuEpl4C66N1A3ZvoVOcO8k6G21nTAOBgNVHQ8BAf8EBAMCAgQwEwYDVR0lBAww
+ CgYIKwYBBQUHAwEwDAYDVR0TBAUwAwEB/zAuBgNVHSMEJzAloSCkHjAcMRowGAYD
+-VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAMsHU
+-XdW0ykvbK5jeisKcVmHfiete8UF0ftNfaIBU44u0wF3gvmpXz6hVBRaxhcD2nTgJ
+-bYHUqSMmA0zD9RS3puPZpKj5k4x51WJVPQc9OSpKbNCdsaNtus6frLSuBrVypu9L
+-7GEnTe2bS5j61XQXL9txKbECpFfP9tZiBoQ6a3aZS1eN8UUucbWQTweMrmRohFBa
+-VG695OlN05QLGoyAdCHYWA63FSjHo/uWTHVoZ2QI8PJ8WE724kB6rhrkLEYzj9sk
+-jhd5r+z3HuMtDx8OhTMreaByAyox+Rh2pGbKFtoGWpXsTz7Bf/ZBmosRw+fbxiJl
+-Srj3l9ghFLwEImIBPw==
++VQQDDBFjYS5wdW1hLmxvY2FsaG9zdIIBATANBgkqhkiG9w0BAQ0FAAOCAQEAOy3A
++9GPAQvTeqbmvMlkJh8jtTRUOKmcGUNPFQqJ4aTx/BXh8x415zjW9ZSjLN7ZSNxjJ
++nFm1XeD9I1EB1JjXwnkNTgC7zUn+kyuIMBxEvfsM0Pfdumr8VOrlidIJeTLBs029
++tYd/kVlaZfoDS/cSu8ezS7urwY/usHRuku6MUCs4L1WZlDptweGUCWsESpIEGF7d
++ZJC8f6C8rwQimOyhhouVSlOh1NxC338TvQSflhRtWiP4lIgDVNMmb4MRDAUzbkrg
++SH4+Oho7EeoK2VSmgqSAyIpOTBBhIcdEgib7Hz+Uq+Y6KekuD8Y8SslbXitBqgS3
++8uByucqDNovFjYNMKw==
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/intermediate.crt b/examples/puma/chain_cert/intermediate.crt
+index f26fb01..cc9895e 100644
+--- a/examples/puma/chain_cert/intermediate.crt
++++ b/examples/puma/chain_cert/intermediate.crt
+@@ -1,20 +1,20 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDMjCCAhqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADAcMRowGAYDVQQDDBFjYS5w
+-dW1hLmxvY2FsaG9zdDAeFw0yNDA3MDEwMDAwMDBaFw0yODA3MDEwMDAwMDBaMCYx
++dW1hLmxvY2FsaG9zdDAeFw0yNDA4MDEwMDAwMDBaFw0yODA4MDEwMDAwMDBaMCYx
+ JDAiBgNVBAMMG2ludGVybWVkaWF0ZS5wdW1hLmxvY2FsaG9zdDCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBANyc2QAnSAUwxbuaS2ps9JrZ3uu/z6T861kF
+-cuOQaGdkSkTrYuqwZx8XG4KNC9QxJlmjo6NuZE2HduimlU0Lt4c79VrOzuhktrLc
+-T1NL2fRX62qpvcznVGJEP8UhzhgvuhpLAvLr0/4wSt4mZOgZEFzJ5sTiapCie5GD
+-szRDsuh4FNAwUMpqUxJ+Ri+z942gUhfhb3K07idI5flVSBIBjlCUvYvOuW0yo7Ne
+-exdtbaqb7Ahe2vE7M+06Ld5X2KUhx60ueTgMrilm80tm+TontsF88uKUfZfmLMNG
+-8ms2E3cN91OSweBthRxg9FBz5eF3lDcySrxtTPjNhcLp2B9YnE8CAwEAAaN1MHMw
+-HQYDVR0OBBYEFB63KpMPIZiqsbc0XUhuEDXhPqUiMA4GA1UdDwEB/wQEAwICBDAT
+-BgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMEBTADAQH/MB8GA1UdIwQYMBaAFLVk
+-Fh3q72RimfwyCrXMxSh25cUWMA0GCSqGSIb3DQEBDQUAA4IBAQBmv1bfw7CLhGwy
+-aOzmBVINzfRJGCMZ7EXIMo0eBNsJ7V5DmQOIsOm/BU3FGvZ+6BcJZa98NkWQybYk
+-c9slDyMGgQBVjbSW7l/aaejqKNZxD0rnN79801lN7IXSXbHk03sX8vXdXKsZSzeo
+-4hKh4ZKDjKGBuGNM1nYHaTcX8EThe5VYbsydX/ShC0x3+XKHOH0BeUUjIFT2iscQ
+-+UDqpWeMq6G+pXWVS7klezHIT5V0zg8apLhIt8o7NzJNQgz5LW/y+8LgWLEmBdp0
+-Xj7RihQi0fxWhAWLFMgqK7QasJZZRJVOqEHabfsvCsAMzztDsm4EFzJMd0/tZXHq
+-g3cTPG2b
++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
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/chain_cert/intermediate.key b/examples/puma/chain_cert/intermediate.key
+index bb63df7..9269949 100644
+--- a/examples/puma/chain_cert/intermediate.key
++++ b/examples/puma/chain_cert/intermediate.key
+@@ -1,27 +1,27 @@
+ -----BEGIN RSA PRIVATE KEY-----
+-MIIEowIBAAKCAQEA3JzZACdIBTDFu5pLamz0mtne67/PpPzrWQVy45BoZ2RKROti
+-6rBnHxcbgo0L1DEmWaOjo25kTYd26KaVTQu3hzv1Ws7O6GS2stxPU0vZ9Ffraqm9
+-zOdUYkQ/xSHOGC+6GksC8uvT/jBK3iZk6BkQXMnmxOJqkKJ7kYOzNEOy6HgU0DBQ
+-ympTEn5GL7P3jaBSF+FvcrTuJ0jl+VVIEgGOUJS9i865bTKjs157F21tqpvsCF7a
+-8Tsz7Tot3lfYpSHHrS55OAyuKWbzS2b5Oie2wXzy4pR9l+Ysw0byazYTdw33U5LB
+-4G2FHGD0UHPl4XeUNzJKvG1M+M2FwunYH1icTwIDAQABAoIBABpm46oa3rR5pvMH
+-NFGrHXDvdGLBWf/UTEl4l0x4VU5Trcxmto1WCYP/13PTHnXJYLNnRpJXXUX8BB/e
+-rnfXLaJ6a1LFSkonTMgbXpueNG+DcByb7ieODca+2o+PNqN6tBUpIf62zhrvEPQE
+-zfG1l4Q184S01hezd6ytVsPWpZwgE0nMCOvAhDO4doF3RAHRMhE+4XxveDhXb3It
+-vaUrQaKLkIbZJsJBVwCtHbi9EoO4V5ttkkJcgLyyxCoREEtYS4R5uARMYhnz9IWT
+-1rUhOIiTvQBVfgUglLpGUJ5DjO2Pja/WocoCYhyPbjvuUC4HdYo9pW0pdXv+b2Ku
+-a4XZDA0CgYEA8rzd09DLpGyz9hnaSDcVTVcsFQMesaE27hfZgiuy+NMe2fe1MXGT
+-pLgA/UF61vIJ0mz53A6wwdoEWdXvNc+BOZlut63SgH/fC7N4/MabhPz0D9L2pWVo
+-FbPci2ukPdczaNlHxcUoAmI2Byf6cige/tuEkDsuRgTreZkeD1mQWPsCgYEA6KqF
+-du1l9KLXhOeJT2KPDERtpvdQ2Crt2/Qi8wnAbALixJAGWgz+P0E17g5upQjvTEbs
+-EHEiyJjHKWs1KBnD87V6NMTfneqGoe2TZrNcZhteozREFCiBwuiP2WYFTt9cVH8a
+-MeR2qvUse8bx5oSmXKwla0ApHDKEH/Bxd+/G0b0CgYEA3msmy9avMouUXrWTqMYo
+-U8TDlMFWF6dEIOhjmn4WMR+qTklGkvaiNbWQ2n5sY5ZGX7URQY2IcyglAnggB2uK
+-2k93/wBcOPhyVVNvUhdeG3542CMTc7w2omQ7etj4Ft4gsjseI96i6YQ6Q1ZjisSu
+-mhJlJo/Dt878QWCHBcOom48CgYAF3WaH3OwZApHUM9HuQlnAwWjSMKHFES/1v22y
+-GqjTEC+PLOI8Gt+90HL/kTWQy2zcy1zf/ToXPGKo1J7+Z8fcuNJfyiao4GSMaGSy
+-zgqiOEZmbsbYizzaIOqfXEb9+ftl1d5fK5ciMBPy+szWNrnK1DwNPAzNPSi/dVwm
+-3dBxMQKBgGf/LgGuJTr0SuCjJkQy0pwUl5XXSKq6DxuhaRB2zxBFeLCB9XIfGQ6k
+-jBRzA+QYQENytENHZNmsAhjmABGA2Ojav0rsTkITDIj+8Y8LVE7uO0ylun5p1HUm
+-laHX+3Y3BSfqHah/9aB+U5+jA2Ys2s55ENSIq27u/aWDKpY2lwd6
++MIIEowIBAAKCAQEAp7RVvQ7KE3JaLj+7WPAs6QNgbHv5pc4knI3kTEk1LSChbLz4
++5ApUHAWBlnmOqp+teUuF46kASlGbtMglVMjAPX+CL/Os03V5zcO4kwG+VPM1WjN8
++GdxD0QnrYlELcj/npbXFgx6QIgbZKPNKcB81KiPI3pIvEaa1Pz3E3qlqsWr8Zy8S
++2ywNFVVSbqnIg6CkM6BO5RypPepSA6Q33D7lmCMpYBzUG4yKlH1/zDCO6FfHZeUf
++aWh1VaX3jGjiKljux3Z+sX+iKX1JcMLdmvAZ2S31NBoIxiW3vhXI3E8BflfBEfxv
++Y4CwgaQ82HtO8iQpHfcmQpxdellvGVE/o8NZHQIDAQABAoIBAACPItwLARR4hKFz
++1/GPd27dcoRaE3aAjfGxrWmtss4wNimRJblI6YfgYtK4HAgomSD25f7g0N3ukLjV
++E/7I3o817h6vzsszsJDFjsd6sYJB/1MKKedCKz22rUC6KXIbkW+lf/+UagGbCT1Q
++NlbSW9CEpwZK8Xo7Fo6b65ycbv0hb0yJgPkATQQ2CIKW8fEp6CV6yJu93HprgMeL
++sUhyXtyPQBDdNJ/Nr+VWaM91/c8VUSzPwY7Ycw7LZlBKIqNA4TqYBEzkEUZpqPMU
++xdNm88zL3Hr15AKCH7NJfbh/rpa3DrDN5IfJ0Bg40TCXhjUIbOQ5LeYxcP55JrxO
++UG8oBFcCgYEA3TqNSE4Dc5xGCQSJfEeai/ztk8/XOGJA7pGjjrhbmOeQ9W71vITV
++5WGggrPoLNrbe0Ic53qDwePTkN6e0j5qDdV4eAGO8p09KRMykJdhKxUP17OiBVvK
++QlsFzknw+uznqegU0XofPQ3maiNcmqOSVZHTzoQxFKaFaEzl/GZnmu8CgYEAwhAo
++hD+Cy0DDdTTeplJ2NQ0v/dYKBCdA4VaAkYtlkxGvWLbW2XtmvcYhWvoNfFOiqIwj
++LBkQKhQkScCYWnM8OgUJR9ISd+s6bf78yQBNq7Eux5ijZfNH4d3b1Rd18QOABJRs
++yjimIM/RQh5Qu9sCZBGezjo2V5Kh/OPLDfcePLMCgYEAsYm1rBr/Zh45ji8X7qa/
++/ivitUaMn3EqTsqOCZEl4RWlHXIIv1uTFFw+peWfI7AXh1lNPO7zIfyl4pLlvi/c
++iHGSFiyZ/VX2qSoA4Ey77AkhB6ffFJHPRWUqyZxJSfYpDA919Y4d1696BB+Qx4ER
++hJ5c7lTj1oC0ezmLL/02k/0CgYA9fyFXx0iLYFqQKdDko/0RkrxClDFYX5gP0Hmt
++pZ7qnBAU7Nvoz1IfkUnAqrzbSSWig8Yhk0+sBfX56S5ee2X6fN4UBF4V4lUBxmwU
++xiPW5K8OUTB2fkGpMcUYIfceCR3oVaCj9I+wliqZ6UFsRlrbmznX4FqYJb9vhEA0
++jLroQQKBgHnopmgOQAtQRkF0c2wnby4xrNjkP86q/DfwCpfyNQ9QMREfz6UwZH4w
++qqQ6vWpJWVyjH3650PP+OYRsJmjRYVZ9b22K3+KwRjyErYlhsU7UOkiC4FRiYojB
++hN4kzsrk2R9DM8mwYI7+vgOkmV/nwdMA6LdBmenz/YwdqTXAToUy
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/ca.crt b/examples/puma/client_certs/ca.crt
+new file mode 100644
+index 0000000..c3d39dc
+--- /dev/null
++++ b/examples/puma/client_certs/ca.crt
+@@ -0,0 +1,19 @@
++-----BEGIN CERTIFICATE-----
++MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
++DQEBAQUAA4IBDwAwggEKAoIBAQDPVFa7U4cqfq2Nux7VuXIUhYtaiQwxEEZuDvGI
++tlSVzpENnqFLbqH0QsOuxGgIZofsrSf4BrCzh4AoL3qY+HgVRCmkD09FnoWjFTfT
++X6v7QaCtUsrb7RNASrrgyP7rB9y7sp9oc8FNJQA3gtJQxghffO9zGhnEvPt8EGGU
++axh29BYVxvQpX1Av0SkYjTgpRus1s7r50tpoDHXhKyAHP6WEEVaN/8x1p9eXqVCT
++XIhlJJ+dgwZz/Hfnb6gr97W5G16Ceo7ybS8syKBJf2D20DOL8kLAiNpjWm9spoJi
++oxHvFMdDB3nUqZyRO+QU8gSoQBVYYqRlEnOXvouzqslUVdbLAgMBAAGjIzAhMA8G
++A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
++AQC9iO5jvBDNgDmUq8+NfsAZngWLOG7IR+Ez5h3CzGU9yzcJgn8y6PMjzhgc20le
++WYzAHEG/KXFIfubUW/9iA8E6We0hm0LM1s9o7A9JAqsHcZ/pK2QmDW71JupU8o1z
++3Qcu7jRzPc7zYgNwaD4/ccpJTAPGg6keV3YGN2Z5RpWykOFzP7WswaMIcKQE869c
++Tyi8i71XkVrL+xx2pRiiNDOmfMkmm8TZ9tBP7n6BcRd556TTIxhjONvmamCraBQP
++msPnMtb8+H3/IsMsUw02/fQTJ91FVa3t914Y24+q5xmkasyrhinTNmsa/S939P6I
++JNNoAM6TUZrskKPtb/pMzaqn
++-----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/ca.key b/examples/puma/client_certs/ca.key
+new file mode 100644
+index 0000000..c689bd4
+--- /dev/null
++++ b/examples/puma/client_certs/ca.key
+@@ -0,0 +1,27 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIEpAIBAAKCAQEAz1RWu1OHKn6tjbse1blyFIWLWokMMRBGbg7xiLZUlc6RDZ6h
++S26h9ELDrsRoCGaH7K0n+Aaws4eAKC96mPh4FUQppA9PRZ6FoxU301+r+0GgrVLK
++2+0TQEq64Mj+6wfcu7KfaHPBTSUAN4LSUMYIX3zvcxoZxLz7fBBhlGsYdvQWFcb0
++KV9QL9EpGI04KUbrNbO6+dLaaAx14SsgBz+lhBFWjf/MdafXl6lQk1yIZSSfnYMG
++c/x352+oK/e1uRtegnqO8m0vLMigSX9g9tAzi/JCwIjaY1pvbKaCYqMR7xTHQwd5
++1KmckTvkFPIEqEAVWGKkZRJzl76Ls6rJVFXWywIDAQABAoIBAEBT3K02l2OZ9mNZ
++QZHyffDcFoa6quu2LwQK4uoWGFx6wQrGwyjSZLGS3YAmNFkW5umKODJ+cOjjC+Js
++CM/Zl/iRM5JRpbjmHHSjKrUMpCHLFP1yCLr/7c8u4JjKBD4MLHKYU1lnQPyclFqk
++3nhtWT+3VdwSpxghwq2Vr5ELQYX2WoHBDKj67yb2+yRVewjrmWd0f3Lm3KrPYDy2
++McOOOB6HcZNsyXDihPYviCOmthv0AEb+HUmEwYn5A/TcTL1IVpt8YG51/VrYWysl
++A4rD3t6L5yp3hTv05dezm+hU88hSv8w2M0CQDqrxVN6zMyQ7ixj4cCbTqBJwVjmj
++IxkWyzECgYEA2My20inP2nai+ANkY56QF+2Mvof1qEpZh9J7oPjzStG3jqfjqVWT
++ZkY25SLLGO7SB06XRAgFVrq5Xyb72pXENhV2KUzOHN+osERaAyZroFlRbJxfCL8s
++p24JKVN7oJPDOJnYYv/cEEKAT1/ocxKHbi6oDZb/tJA7UHfT3NBIuV0CgYEA9NFD
++uGuV53XfuyaGh/dHurGBKu8HBjt16COasSqMxH3U7rb4JRF56wB2pVAAE8AFivNd
++A2om4b0CQK/F7TJvQY6lBKUcy4lOshwoYR2Ga7x58BJNbS6Da1OTwmk12BKxt10x
++NgThGNjRL/A7x1M2r1CPvp9+WiJF9hdWWRy3RkcCgYBX1rGn+wrdD7490FoHRsJI
++/5VLyRhOJDmcHzq54MPqJ4hAg2NpQ2PiR0aMlglFw9VS4pPFG57WIfdjRw854/5I
++j299kkHcTv4w1LDHn/RxVl74K28Rwytbdui9Vra7O8MYFrUmf1XxPJByGIC8xuAa
++U0sBnpFh3iI6GyK6z6T3fQKBgQCWofvNCUVe+UQD3xx/pELaOEWFqTTlPMi7YMzZ
++nZinfdT6XFIqXKprUgmuhZ7GiCvg5wSgCTyLQMSWEJDz9UhHSgF27jDde0qUhIbD
++2mrO91T/xgMl3qy16OLNh/a9UCNQ82JIHpBxvVZY7LObXTQUgrkvTOttghER7iIP
++CoAqGQKBgQC+26VjLWtLGRqJvWnvDW5jS3/lFB/AZPvfeLNsSs4G9Fgrqx6qNoQu
++dVI39k/kMLSqLP1iMIR5cbujF5akpWTX0dJReoeOYXJuf9hkm1+kWNiHBbNTbfqN
++htxGidymslRrSsOv9zJys5zosfHvbcKbi1dPLlV+gPN1v4eXjtLOLw==
++-----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/client.crt b/examples/puma/client_certs/client.crt
+new file mode 100644
+index 0000000..79e7f6f
+--- /dev/null
++++ b/examples/puma/client_certs/client.crt
+@@ -0,0 +1,19 @@
++-----BEGIN CERTIFICATE-----
++MIIDBDCCAeygAwIBAgIBCzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/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=
++-----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/client.key b/examples/puma/client_certs/client.key
+new file mode 100644
+index 0000000..371a4a1
+--- /dev/null
++++ b/examples/puma/client_certs/client.key
+@@ -0,0 +1,27 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIEowIBAAKCAQEAzl14vsZCU7E1qf/a4Yxs/SbIf/PzPW3Thbhno3JAbsTUpf9z
++kdDRB8fCn+R8SnJVZhCRYhUA3lNdZIskQp1h2Ix9TZxjQSo29ixzik0fTd7nd4KC
++8WOpZUyDs0U2ugmqomJXP0e/AiFpN+3HmgTWJpDx2oETLcdl70+wRBkF2FDRJU/5
++KvArUnaGXrqW645GH3iXMadQRpEWBxFP/+aiz0FXqd9ZIWSoobf03dY/tIaxCrFe
++2+yljBB6eI/oHWs7Y861JN+nRcJrtp4LmeCdDXzQN7/yxDg+NVQy0sEltIMTgMyo
++Isb1UPD+IkepT9GKd09M6p63BX0SXr5YPhz9iQIDAQABAoIBAB+oJB0z4bnf/ej5
++uFSQS6nb+Lb0L9S1E9U4ECH5JVw4spxSXyK3w1ErujX4AX8UIfiZwwumSC9S34lM
++dQAJD5j+GDy/KFS3Sp4h/IlzQkGaV6y0Jy0rijFhdvSZwgbw862cY2DwOyNzB6aO
++QeflJQreglNwKIaFx6PZ+CLCKezgVkSmRDSjYWv/qYkpZmdEjCsI7FrYgxwmkLYr
++fO7bisPaW7vYF6S48y9Lv/e9K7qlOz4W7aAHAUUWd72271o5dJQrN5jlj/tKgBww
+++rDV1MsKNi1oqxjZnQ7rrJ/AAsc3FkaWPmUluhy9XbaZKSFJIC+TSV86US/I5QVW
++Kets+9kCgYEA19mtBjbBeZFCvR/iaFtvhlslkLiS0hRcEKO+JaRQhTB7VWTqeIv2
++Y1bEFh1t/8NinxtPCDi2Pl57M5ffKnauxl8QsggLebTFdwnj3kFmc9g0XFlpErYe
++xHUcJ4UXpubGZNdnau8GoUGby/zY/yWX7tGsbHBBjwwvS5AvkbYEhi0CgYEA9MAh
++473dsUynCMTzdvPC1tkC5MPLTGkJ89zoxnRgQbfAEtdTpBloNnDu+XAajEL0/YsN
++cxGohipESzBs+uM68M62m7BJEpDV9eRgRH80/4O2GBTPbutJAYxbJRMazvHzMA0p
++ed9Ss0HNcyFzTlgNpUEk6LCPB3Q6ZBCx9b06ak0CgYA2Hq3zUOdRw8ooAUaTQ9nC
++pjfVAXJOmiw7P9L9PSWzP2StFJB1iSJN5gNkSBy8dBDWM9KtDQskuCvL09hwnTFV
++K6DUApBeA6U/I4uuvlch1KPMQ97EgkVUnMhiYEx93H8B6cBUX3oaFIkrrEn8L0DY
++8Fl7FupZI4T4PT6wGiMoQQKBgFZZmxtQl3DATIZJhmRHaEyIz/6KHaXdwUcqf23V
++DUjiXX/IPJg+5oeenJGgvZ0S2oDBmIMqjbyYGPQ2J5z0ooznQYH4Vi+YrgRNCLHh
++937Wp14jqXPGy0Eild2kueadcmFXo3R+GB1qb+PYv2e6pUXSkAUQlcXZeehoA4Fh
++u8RZAoGBAMNlsWXiTAZkXCQnHy7hEt3rONumzHIwBhWrMoNRQAbZSM/WWEtZuMso
++QvhR9Fmz/fiaVvBcXzBui6ffkoSsyvyhigfaiF1AwhW1S1JMXttEiGaFO7pgysmw
++26goSWo9KKpTxUcAW33qKz1HBb6a51CeucpeO3PmQRUJ5CZmLG2Y
++-----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/client_expired.crt b/examples/puma/client_certs/client_expired.crt
+new file mode 100644
+index 0000000..6a6fefa
+--- /dev/null
++++ b/examples/puma/client_certs/client_expired.crt
+@@ -0,0 +1,19 @@
++-----BEGIN CERTIFICATE-----
++MIIDBDCCAeygAwIBAgIBFzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjMw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/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=
++-----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/client_expired.key b/examples/puma/client_certs/client_expired.key
+new file mode 100644
+index 0000000..371a4a1
+--- /dev/null
++++ b/examples/puma/client_certs/client_expired.key
+@@ -0,0 +1,27 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIEowIBAAKCAQEAzl14vsZCU7E1qf/a4Yxs/SbIf/PzPW3Thbhno3JAbsTUpf9z
++kdDRB8fCn+R8SnJVZhCRYhUA3lNdZIskQp1h2Ix9TZxjQSo29ixzik0fTd7nd4KC
++8WOpZUyDs0U2ugmqomJXP0e/AiFpN+3HmgTWJpDx2oETLcdl70+wRBkF2FDRJU/5
++KvArUnaGXrqW645GH3iXMadQRpEWBxFP/+aiz0FXqd9ZIWSoobf03dY/tIaxCrFe
++2+yljBB6eI/oHWs7Y861JN+nRcJrtp4LmeCdDXzQN7/yxDg+NVQy0sEltIMTgMyo
++Isb1UPD+IkepT9GKd09M6p63BX0SXr5YPhz9iQIDAQABAoIBAB+oJB0z4bnf/ej5
++uFSQS6nb+Lb0L9S1E9U4ECH5JVw4spxSXyK3w1ErujX4AX8UIfiZwwumSC9S34lM
++dQAJD5j+GDy/KFS3Sp4h/IlzQkGaV6y0Jy0rijFhdvSZwgbw862cY2DwOyNzB6aO
++QeflJQreglNwKIaFx6PZ+CLCKezgVkSmRDSjYWv/qYkpZmdEjCsI7FrYgxwmkLYr
++fO7bisPaW7vYF6S48y9Lv/e9K7qlOz4W7aAHAUUWd72271o5dJQrN5jlj/tKgBww
+++rDV1MsKNi1oqxjZnQ7rrJ/AAsc3FkaWPmUluhy9XbaZKSFJIC+TSV86US/I5QVW
++Kets+9kCgYEA19mtBjbBeZFCvR/iaFtvhlslkLiS0hRcEKO+JaRQhTB7VWTqeIv2
++Y1bEFh1t/8NinxtPCDi2Pl57M5ffKnauxl8QsggLebTFdwnj3kFmc9g0XFlpErYe
++xHUcJ4UXpubGZNdnau8GoUGby/zY/yWX7tGsbHBBjwwvS5AvkbYEhi0CgYEA9MAh
++473dsUynCMTzdvPC1tkC5MPLTGkJ89zoxnRgQbfAEtdTpBloNnDu+XAajEL0/YsN
++cxGohipESzBs+uM68M62m7BJEpDV9eRgRH80/4O2GBTPbutJAYxbJRMazvHzMA0p
++ed9Ss0HNcyFzTlgNpUEk6LCPB3Q6ZBCx9b06ak0CgYA2Hq3zUOdRw8ooAUaTQ9nC
++pjfVAXJOmiw7P9L9PSWzP2StFJB1iSJN5gNkSBy8dBDWM9KtDQskuCvL09hwnTFV
++K6DUApBeA6U/I4uuvlch1KPMQ97EgkVUnMhiYEx93H8B6cBUX3oaFIkrrEn8L0DY
++8Fl7FupZI4T4PT6wGiMoQQKBgFZZmxtQl3DATIZJhmRHaEyIz/6KHaXdwUcqf23V
++DUjiXX/IPJg+5oeenJGgvZ0S2oDBmIMqjbyYGPQ2J5z0ooznQYH4Vi+YrgRNCLHh
++937Wp14jqXPGy0Eild2kueadcmFXo3R+GB1qb+PYv2e6pUXSkAUQlcXZeehoA4Fh
++u8RZAoGBAMNlsWXiTAZkXCQnHy7hEt3rONumzHIwBhWrMoNRQAbZSM/WWEtZuMso
++QvhR9Fmz/fiaVvBcXzBui6ffkoSsyvyhigfaiF1AwhW1S1JMXttEiGaFO7pgysmw
++26goSWo9KKpTxUcAW33qKz1HBb6a51CeucpeO3PmQRUJ5CZmLG2Y
++-----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/client_unknown.crt b/examples/puma/client_certs/client_unknown.crt
+new file mode 100644
+index 0000000..ed467f1
+--- /dev/null
++++ b/examples/puma/client_certs/client_unknown.crt
+@@ -0,0 +1,19 @@
++-----BEGIN CERTIFICATE-----
++MIIDBTCCAe2gAwIBAgIBEzANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
++MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
++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
++-----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/client_unknown.key b/examples/puma/client_certs/client_unknown.key
+new file mode 100644
+index 0000000..efa436f
+--- /dev/null
++++ b/examples/puma/client_certs/client_unknown.key
+@@ -0,0 +1,27 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIEpQIBAAKCAQEAukIvTqRssT0E2SeutFV9bliCSgmKHsRo8002qZSCciwsGM9w
++JnuqWwxpRrZ+3SZEXGeIWRxx2scqjHWgBlDhas5XkuylwuS01MRKS4wbmiKhuwBI
++i3PXblgygSz+r5wuESt/bgRpQCFeOff95u8LC3NrWKXtsvVFLSLB+QJLrxxCLwwj
++61CUF5txJShZrOiK2DliK248o2Pj3e1LWc7mkve9m4bq02aEuvyVb7efgWLxISUL
+++kFaIi+xSFpRnNGOtzI94xLsfb7N0lcOBOP75E3I/RRMtnMWKB5klc2YeJre6d4f
++Dujd3h/JkRG4GXZ333SJugtu0+H/09/zZsEhTQIDAQABAoIBADYZfjsl6Aos8okO
++jSCFCkswOxu9HJimLOOqZDuqTp9R9Db6nZUX61nJx5RJ8pxSfp2mVsSnTeyhV9r3
++WVUsTeUjbO1YficXHe0E3J2H4waIk5hI00lqCsNaq8S4aHtibkD/dOJkNpvxdTh6
++Lw3SFc+sJRxZCasmsYKUK2ojwA7qs72mWAW8k4pZT9p2fn+1O5G0J7I4u77CsKNp
++3m2EYkYq70UuAPyESxah97QLynQxczxygyMkJyJjyrr7lnJRotu0UOw3cX4qOmP0
++s2gmTwBqsZ7IpyBSJHyEY4E62yfgweSoUIXtS6wWUj4WBToyAiX0zMC6XTMN27iM
++2/mHkAMCgYEA57VRh2Hj48scDoj5tFhijcqSiJyizW2CouYtF47NUi10CG7U+ATP
++HGcCJhWxIf+kzxUKaP/sgwO4ynttNz6/KMRkVW8TRazDLZCwHXCb1NEhiDuP/9lZ
++HUnIAvvI01HYJr7/4ktb7Ktxt1rA6WKcnM7Gzyrs5NdZPr4XTjiCcx8CgYEAzckR
++TG3te1UqzDs6FZba8+cGRMjoJcSahAcRj74H5YY2Oz3g8TTS144ppfkI0R3gAQ8x
++oe1DIa8XWswdcCTENnGN/D4C3qc+Cnvv2luE8d6POiO4oToRVYNycP3uCXCl7drw
++x84ky5PD4xHK5V9HDapzOz93+Q8nJ4Rq0HdgqhMCgYEA3hlEC9P+ICRZQWl0iLTL
++ywPoj4As4WJd/Q1LHbCpCGM/PLIX+6CIcb4fJihWwLMN491UPC9MIo0XvSawGmtP
++yqDtV6L/wyKFd5Cf76g4BrdrP+1v6xsIO3W0fX+hEUX7PbCJD/2SIHp5pvobvdnj
++Kr9de8i2h+gPyH9nUXgDOpsCgYEAycG+og6M7YScx0uyMQSMeuEgdkP7xzuwuo0r
++nKCVoWUqun56kkJWDVymXMGC8XO28ZLx+G5kiRvfa/f/TLnfXfmLWal6qs2RuDm2
+++YENIQ4xorDvDbOe1xZfF4T+4mZ9aGxl8Z+c17NyNKh3Itd9FFrvS0F44MkIfGgJ
++SYYhUd0CgYEA1S9NVhD4MVu75UxiFo01cZTMBw/MQpQcEE7YgjW4Af2MmPEnw49g
++KeNjinwOS/q2JmXwprHCbewv8AuVOqNENwARCUR+o+1S/X6WwW5xt8ZAYwrdm6HY
++G62HYnzYmRwSVpzMCMMTAG0BM5dxL3YalzVBY+NTx5EVjhrzhAERI30=
++-----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/server.crt b/examples/puma/client_certs/server.crt
+new file mode 100644
+index 0000000..1335881
+--- /dev/null
++++ b/examples/puma/client_certs/server.crt
+@@ -0,0 +1,19 @@
++-----BEGIN CERTIFICATE-----
++MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/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=
++-----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/server.key b/examples/puma/client_certs/server.key
+new file mode 100644
+index 0000000..ea6f467
+--- /dev/null
++++ b/examples/puma/client_certs/server.key
+@@ -0,0 +1,27 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIEogIBAAKCAQEAxqbRfVxcH5wKCTGfuZTVisUKUIWSTUOWkIoyIfBKVknREnVS
++N40aw72bs9GDh55F+R2IJ3y9F7TQXo0Y6PJ9tFXZqJMb2NHXYTfhQCSN/w5wqKIr
++WOR7wbA4JHjs6x/vHYnjFVbvbx43M+wceKsMBlQ1eDLzUkr5vjLGASmdgzTq8AUd
++5bNKiNq+ERyAUTcuwXWC6ndXNdr3vdEgcYnzPWtgM7eo1SpewqCqrlSeA1dzXThB
++8vCFkCNy7DYrJbCuGIIxm1D2garE2814LXztE/rhwdIGzonh44/Zc43cFhzJQUhc
++J/jOxFovgijHd5lvUfvqj6YoquC5yFVYEfsSwwIDAQABAoIBAC1UQohLC4BxAD9B
++0hMsWZ/tP2HJYO19hz1bM35YEPZoqKsAF28ypRFWUlGxdMR9ArWKHhf4mENxEH0K
++0EzTjIiacGzNiLSsiWuXLzCORtKVDnMEckS5+l1joyP7bgBnDI6eeLFVYZRm/iy8
++a3DDgx5sl7jiU3CLSDq05ka8osMd5/WcGSx0VaenhPNUY9m40h0tuTO8NJyz12rO
++Zdm/Uq94zEA3XdPuOgnZMUZVctZzy/2TGoqCWGT/MT1ko9PJ/9vwupyTo08gNqGG
++YQGDPk/GM4f5GarLD6Ap4l1RD+5RfCdoWRLLN7Q06cQ0Sxo1OQ27cPPBIeIDyv5b
++3lvfp0kCgYEA/mljvIyGVOlJclIuBiT8Mjb4yuJktPXZdbg+sI6Pm14yYvGR/1yg
++Kas8ZSPS4VEl8v/xC5vwKEeeAByVP1+cFW5EUvj1zNFgNvfytQumnyXFyrMA+Mib
++RfX2cL00V4Hvsy+kdzRjj/HpFCZDxGB5cwAnA4H24pNaxUDdUBF4OesCgYEAx+RP
++l2Hc+JFhv0gjyj46SZVM5D2yx+U33a5FNl/NwB6AdKJ4r7j9jZFKCzniCOjkvh0D
++a7AhnnB5fuMCR3qxcWMuTtdinrTydSQb6BFA5XbHgAsQvfp8AGJ+T1A9EAMFPA6R
++QKUSd8tEYo/OQZcddvdyELDq5T/eaCVDCXPzPIkCgYAT6BstvbElI7vjfhqr0GkL
++ZNHCzkQjBLmnRGtjVURXW9+FbnGGEbFWkVeAcnUlvDvD79LknacE/9WVHKdw9gI4
++ixA9jc1t4VQt+Oi80dSPz1zSp38D+G5t4vkNiUB3OGuREcFEsoy3zq32LahPzVyz
++aueilqDCydToalLm2PcXUQKBgH0jTUB0H6XtPchGHUHLWyodsZlhlr7VnPfG1cWI
++jIItljVuUSeRJAqwXi5Q+lShmDH8b9vG1AUgXK825oJhKRzW/nKVHERG+1KiXGYY
++BwygI5zhUIXefiqvfmugy9luSqSiagSSUtF0C0e4x2MAe42ys1IHr8X9Cfsg+Kq+
++UBQhAoGAEMLXpCq0PnwWRoUZYxwDDvLOoEyul0jghAspec8d31j0MBUNTn19YlmA
++jci2NHSY3TMywR/USSCN56aT6LstlMyRzmoJC5DYNJvEEkMHQam/BfFO9VT0rkMG
++n6BAyqoComrkP3mg4sn9dI262Rz4I83obXj4DyV0eayOuY2mhHU=
++-----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client_certs/unknown_ca.crt b/examples/puma/client_certs/unknown_ca.crt
+new file mode 100644
+index 0000000..5c50d8f
+--- /dev/null
++++ b/examples/puma/client_certs/unknown_ca.crt
+@@ -0,0 +1,19 @@
++-----BEGIN CERTIFICATE-----
++MIIDEDCCAfigAwIBAgIBETANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
++MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
++dDEUMBIGCgmSJomT8ixkARkWBHB1bWExDDAKBgNVBAMMA0NBVTCCASIwDQYJKoZI
++hvcNAQEBBQADggEPADCCAQoCggEBAKh5VmSGmeN97MEPb9Td++UYcWHhYVj+yxi9
++leDzcLpAgqtd+z0yBYCS2ULRQqomf8uIYODEuWxaepVNjjRN5Y22Hzlodnp+kJ3G
++CXQva6GtwxbTIxyZ21Yn8APPgb7OTHZ/js1EhZpJUSjum19PnSS8rPfQRkr6m2eg
++HKDkzV3jrJXTpNdvUhTi2NVVo0vNzLYV5Kj45vqirlTEesLxdxHtDNx8vanYHaJY
++JY7OryIJhPsxKYplSbQ7ydJuHtpx5SiFjRckw9ddhRzGjYsAQFE2eVBPjhiYJnDL
++tmEnb2e+tgRNiru9ttffpfzN4EG3/d9qnyZV9nua03yn+tqe0sECAwEAAaMjMCEw
++DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQAD
++ggEBAAp+1M6+Z8T/CA+C0288CRF27tXKn5Kd5Iffrx1Dg7I5HrFGJl87tkzLRoZi
++MKj+FfpF7fJ/QSyQt+UZa53R2vmJig6JUEQwfzXc5Bp+fusJgmkGPZQ1A5tnbwCZ
++TTuyy8Sy9reCWdJkmdDWyK3ah55mjiuOwZ+woA3RAoC9vCRtIT4w08NqrISBYp2i
++NeQCv3gooiQrbJuCUuo56Qm73juJ4T7GXElRMF+SupmhC2SHwFVGAbu0/g6Yc+ye
++i6/T36t/GTT0fG3kKfGfFMq3NCvY3WI3vcPzYtK9fN8QYVy3LjdnsjcTV2L3SaxG
++3fYURa9nn7mrxlMBX88UWLUIPlc=
++-----END CERTIFICATE-----
+diff --git a/examples/puma/client_certs/unknown_ca.key b/examples/puma/client_certs/unknown_ca.key
+new file mode 100644
+index 0000000..830cd91
+--- /dev/null
++++ b/examples/puma/client_certs/unknown_ca.key
+@@ -0,0 +1,27 @@
++-----BEGIN RSA PRIVATE KEY-----
++MIIEogIBAAKCAQEAqHlWZIaZ433swQ9v1N375RhxYeFhWP7LGL2V4PNwukCCq137
++PTIFgJLZQtFCqiZ/y4hg4MS5bFp6lU2ONE3ljbYfOWh2en6QncYJdC9roa3DFtMj
++HJnbVifwA8+Bvs5Mdn+OzUSFmklRKO6bX0+dJLys99BGSvqbZ6AcoOTNXeOsldOk
++129SFOLY1VWjS83MthXkqPjm+qKuVMR6wvF3Ee0M3Hy9qdgdolgljs6vIgmE+zEp
++imVJtDvJ0m4e2nHlKIWNFyTD112FHMaNiwBAUTZ5UE+OGJgmcMu2YSdvZ762BE2K
++u72219+l/M3gQbf932qfJlX2e5rTfKf62p7SwQIDAQABAoIBAAzm9fnO4Rwt+aKz
++ZvIbaf4aiBxh4U2qfa1QX5kRq7Fn3Vn4YZRHL2qwVFkso3laZ3ET6a9tAXJN35Nt
++lBVnXcwjhXKlEGXDKZobn3+5XfnMz+MAmnDHS6fmeRghnSMas3pjvHD17XFqaf/D
++fjynYTZ+CJUV6zw0wxAFkAu2Wg/1jrHWey9I/sO+xgq+IhxVM6O4JQHHtcR4vrSE
++vnjNF5NhxPYHLot+3n2kQ4Pfld5nJ9RHS7E9sZsoK4aQ3J1JFs70W6v+NaYHRrrY
++jVNG+uTRcYwCOgUShXsv9jwxxRToxito0/l7e3vlI5V2WVVG69CoKCqJjDFjy22C
++lNMAfa0CgYEAueRrHrNZFGnh+hvJ6gmR0KHB+pfQuC6Bub+ewOJco4e9k2rpWV5G
++RT7IGuOkYwj4wd/8er58YSIKD4hINkPEOU+Qy2j6VilIJ38wrB0nkrwURW3xGSrl
++gzzMOXgBz3JAMreNSNrfIk5y1mhqblUkG8XWMsmh3/zdSDu376zq80cCgYEA6AM2
++lnmQZezTLek6RjdNlU5VNBSw2fb/sLsfwkP2sB4I5W8ewy7iFCRg52qWFiJL3c+1
++1PkH03ZOJ4HgyTZXxaeFyUMpK+vA9nmPjA2vJno8c8Wc8BfaMKh5N9ckO8yYN0qO
++0BFaX7nmb6hIx3sGYyrFMbh6aeSzz6Ms03M1PbcCgYBZDlI3WgqyGevV65w3EDCY
++N/Z7fGHU6wrhFykSFR/2hCBRUKXMV7roj6REJYzqmTC7iPgnQbzKuAkD2fFmdd66
++6iBfIsLTpmFX8ro5qpn71TkM7hfUS9W6otTgL1sGrCCPa5o3Lgw6HkUr7MgYZZev
++6n6sxCZV7YmBgoKjQz8oHwKBgGxHo6BSl7uZ7W0N3i6K/OBjsIwf4/G1vttCWa4W
++ffjv64L4e0johoaT+83FBsrJstKQb/I3Txm3qv3xNXFytT//0QZ/G6Xt3x6o2P+q
++G0Y/4hq97WJ4H1J6LiiLddOaxqd3WnNsxdrLLeqKhXzjw7VgbqunxynInMqZAwCk
++UgK9AoGAUzFOXlnloBSpVCJYv9yR4BzJndK1ivULYI6J3UXKfgTO7F1J1GyLAL8o
++0LaRoB8aUKrh6wd2sB+5y68GxJ+pUJ+xAjY9hxWNMeuYKniBzWaA2vHOpicmkkYq
++IL0vHDK0GMuaZR4IaBPsm8Pb/Wbi8Ei0pcpYnQelRTrOdewy/iQ=
++-----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/encrypted_puma_keypair.pem b/examples/puma/encrypted_puma_keypair.pem
+index 0c1bd78..d876594 100644
+--- a/examples/puma/encrypted_puma_keypair.pem
++++ b/examples/puma/encrypted_puma_keypair.pem
+@@ -1,30 +1,30 @@
+------BEGIN RSA PRIVATE KEY-----
+-Proc-Type: 4,ENCRYPTED
+-DEK-Info: AES-256-CBC,90F30BF02BE2889D8DA5B8168E8BC346
+-
+-QxHwMvAj+xu2Qxe3joiBRrTneQAnby1vpLZb+AnsPbwUWC1TuSeQJdRNs9qYlYwg
+-Ow4/plNp1cPPcjEY2TQlTNtr2ur/Exy11Bs0TLcPxkiQfm+pT/uok2+Y8Qs8WMDm
+-3MLqMPw0wiqnOoLa8j/oUDC2VsutItCtIsld04NgJYOyQTOdNhZ284x4WLp6vUUy
+-atWFOWWfRTDGMzXVKnpY8RQw09D/NcHxRzdmWYelVNQpZMfFAMYygNqofoWDrS3Z
+-XX04fOSxdQg3QwjPkpwD/XH8XT0hGkQaKaAXl5TbCdOOuPtagcDZgt0f4MQJUhEq
+-HqR2bHACS4MvLk/N6l1DvoqZErepAt5uVSRclREfxnqxgXhxvhMz9fe7z0uCJzQU
+-Panj8sg3ytP2oAOAg9kPFYfUr+weUOIBXwioHqEnA3K1j2ADJnZvByIqekQ863vl
+-2f0iweHMJp23gs6FFGA0brLDY78un2L8EPQC9wgPFSZpjFmXZU7ur05bm8fndnn6
+-jGy/RLQ9N+fXBAALmwL+nj0Q5luxdQqx6ouCiDKB2ehz3LO/KMD3QI5ysT7GpY2F
+-2Out0Ud4e2XdS+5CDs28LCBnFejaxlIvJBxXu5PhtJ+7Plm4g1uIMdRspgO+Wukw
+-5/eNMgWm3Q7+1NGlA4kg3HW6K7GV/QIITYWKk7ETX06oD4Uj/XUxinrADT48IMYQ
+-iGcSECrs9uc3MNEGA3AHDqTvmCFsBZwjtx2JZX3HwwgXUxYSX52d07fctJJe3wYX
+-hQi9b4EEyGb2uOMWH3gMLzJaLDM89sgwRz0YNHlQK2wV7mfkmjjNHVGix6M+dfo6
+-kbXZD+rertIqytuaE++uVQEjBHk/yMPK9Yn/jA4TJlHsxNyZwrbYnHYgeGs0//fK
+-fe+ez1A67pvdS1/xAvFBuicqcI+D/Ib1kY3FIZBcnEpoNOCSBjtdZR06JeCKiD7S
+-QL5yNLgb0I5LrrO0D0Rr3jjCHpwe6WSEvO0Og6ktzXMKCTldk7YiQP1/Oy4BZBbM
+-EQh2OyqVLXAQdpgQ+J8xTI62khyqnvDelorcn1xQZbBLH7oS7pturxuFgVTW4RXL
+-SHq9GLfD4dzzIDo+fSII7PjTYwJiKFYWUZKQGboWkPHhgx3LR3geB6i+4HjuRt70
+-mRKA1aitwIZsKKkuiTtlUhBN8gLctGJpoP92yMcmADLDLmysWIDb1G/Ogo1a1qLI
+-2N5pbJUFDrjZ82j2xLtFiVEt17cQ+7x2mxMdb5DaxliZy05XhM6SbnOETBwhIm04
+-qV5IjZCCIqY3eEOsgeLz6vdjiohn2P2eXbgokl1vRQnzSwYaCTo64pIN4spgl+jN
+-WNsD1kQBgyvQPXoQntiiwi5CLlmVlE9RY32DYZJs0RazxcN5mBC9qP9JAVHOhUGR
+-JhaQfPl2GVtKyzz1dkvvXYjPFu7TKkt3Qtu59YmRfDu85JSzZhSFbssKu7lzNJv1
+-wno95r0fg2uG0dvCMB1MhSaRVBnReyubPvIzycU9PYkaS23I88ZzPsxCGMlJwxCC
+-A9AlbH46bfzrToF/UgbRTbpX7kNjDcDOFb01E47b2h2Tm8bYg7winVFS1qdWr6CG
+------END RSA PRIVATE KEY-----
++-----BEGIN ENCRYPTED PRIVATE KEY-----
++MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQISBM1VRFFvlsCAggA
++MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBAKCsPjHKrhK1EnlPvxcBeWBIIE
++0DwRydTdGeqyWPblEhdZZYpjbCMtTEDucl9Non/a6yXAO+igJCSPRze5OxAp/Smt
++iGk4LFcGTj/OlQWghqP0rBN6PPctjWRogh1t6hLfASBkmALg9Rsy5pnm103rwvJ2
++s9hDDwavJ5guGFm6KE9Gd3ijbD0pd6JXftu3qry2jajsLEn0pkBFfTTotj45nMNz
++ByONJcs9daHduSyKmn6LimemgzK4ylRwjaycwIqmByNbN9psrLDYvgSndeDCnOk5
++x1IwDzzBJfprjgc/ldQ+XKX/7naVN4KXiQ40cUHCzZciZzzx1M1GPk5zJlJavSmT
++BZHbTbj0M+txYArnxExBjaaA4mc/fk2JMhgJ4eWU4UHJMeS2dE7l4rBLDusmRs/r
++lG4zLEeK1vlSb8pxMIOkbm699WZQJyzcSF/RmyvVUVUJFt3swm2duWQN/8U1U269
++uqiORRShsPaIXtGbdyklhMEVRb9jAB9nkvx4H9SYwT/YQU4oebxGZGWP8LctXJMi
++aAfFAQWs3b1PWBJ0tZee+qjmzevsQ7CdDPfVfvMz2YHGtcNgHljQDnkehFsmrp/w
++ulPwSVe3pOh9ce2Y7pIejsm+V8a/AVdpmgPGslWqOjNPdUHwBbg3ckuGV1TpuCK3
++ku6QR65Mpx1+MBBa+P49+7QhCJXQk63F8rAc1ms2ggIDAbvf7K19UCIngiqGGts/
++srlZMRB3dd+2U5CZ9jr3FC6czeb4mqFuDD/TZFnupvQ6f27ho+6Wx8DhOLGjdZYt
++kwKMbvI6eHjId5buFApcShQdkkv6hQq9smrgvL9OpkVCjT2diYnxeyH0nznNDPyE
++OUwqZ1lcNT0BKtv1EAirt7oRM8uK1xKgJfWCB4FVBaz7yBAE+hW21hKaJxU2hm+w
++u6TKBtEg7YVCF7VPadT1tfcPUaO3MtGZ80iesjgi/2+zNC5gr7595KteKSJoC5pj
++pI+HM8Yx0YlKu/bYLkxcltQEdLoMqjk/Zk+EruNvS2j71pvNRpIQ1qhVBH9P11G5
++xMebXxiG/oDF3XTdbM54+yX9orElyfIKmAk8lz/YmK+9OpW/SVmFv73owJEvEvxE
++fZgEZmyavG3G+WosaJBCBG5blSRY1f68DeaBrMqZdYyyw2YC8q22xZW9u/DyzkOI
++IPafwTStUDAl0CJnNMOZIG144QLUcR5YI5RBinNC7qAvcXd+bZPH0mhzP2nWt1A/
++nB6n2ar71PkRh9/uv4j2ySD1L2hmd98QAXBZNDc6CGfgUYqY5LqUG+XfgHKAjKiH
++ysRzv5867WwqJoZ98YOVTqVpm895pCaJwg2BWTCX3N3nxuLkPDEUi1Jy5r5BsMRc
++cC1LDRZM+9+btOBU3DDMp/37V1EqGbh40waBJBJdRZ7V/yCwEgi4ioLc9Z5AGsJh
++gQptVJXGzbfjRrxyjlu7Lim5XJOq82ARTwIIyDwEJaI1B9UREFCH594fze+4AfKe
++ftFmibsBpqlaWBedYCpqBInK9KcRLjXf1L6cA2yRto3I4JP1jKo1vMSa4uVTMft0
++hHa7L53vf6+jF0nS3EkTk80PcMET9WyC5LeafSGn5MqYa7XepVyu7BF+WlSH61uO
++aDJls27YgbLjkGRh9NNETCafXGRclSHag+qHNk92c1vC
++-----END ENCRYPTED PRIVATE KEY-----
+diff --git a/examples/puma/keystore.jks b/examples/puma/keystore.jks
+index f1909ec..e36f314 100644
+--- a/examples/puma/keystore.jks
++++ b/examples/puma/keystore.jks
+@@ -1,17 +1,16 @@
+-þíþí\0\0\0\ 2\0\0\0\ 1\0\0\0\ 1\0\ 4puma\0\0\ 1sÊü2\ 2\0\0\ 5\ 20\82\ 4þ0\ e\ 6
+-+\ 6\ 1\ 4\ 1*\ 2\11\ 1\ 1\ 5\0\ 4\82\ 4ê¬È`   \ eÄÁ\9f\7f\ fs\86Oª°G\1avãÞ6y\b\1cd©S{?v\8c®.9Qqz\14Ñ\8bÍNºÚ¶ÞõrýI«Rnõ&\11ªÖ\1ê\92ÇÅü\9b\ 5¿\ 1±QQ\13\f¡Á}+\99è\ 2N\10\1awõ!hJn`ûU+Ö19\93\ 1yþ¨\89\92Õ
+-¤ïÓØoK(\ 6¾³½Y¾\9e@%`\96åÏûéIÌVéò\ 4\9d\8a\8e¼­ön¡\8eú\eM\0ûjL\8bý³       \83ÙÑÜð\19Ñ\eàÿ\9dÖqØC<þï\81"\81æ?dã\88ô ÒÞãɦU\84\11þÙ\9d|íjÍB\9c\99\99N\8eP2ä\92\bô\12\19Ì\9e-Õ0kh\r\90mæºo\10\v\8d\1d\8c\87\9fÙzp»æ'aXÅ«Eô\8b¡êÓ\ 3éÒÜ~<\8e\14\1cý\1dòD\9d«Né/Â`:}³d\18\16\ 3»@\8ed!?üõħÛ#.T\90
+-iÚHBqº\95^â¼açsØ\1a!o\1ej¦2þ&åNnjþ_LËä\8f\vèT½oøÙ°\F½\18\95ÃJ\97e/Ø©\17¥M~\10\9aÏÂâ\1di\8aÑð\ 15
+-\18jÕ   w\17ÄÜJsÎFi       
+-Ï!\8fǼP*Ï\9f)![\at\ f\9f z\89\7f7\19Ò=.FY;\86à\94<Hq)U\8aøü\98þ\ e[»¼5Ë%=,\ 64«,Ö\9a5mï\9d½\82S°3ösofÎ×x(6\1fP»ý7ã»­'\8f\9b\95\ 6µ81\9a\1eyu\9d\ 1\91ÝxB¾K2o[~õñ}\14ßô\99Ùw+ÞA½5S ÕÑïzÞ³>¹åìùW\1dbÎ#\96¨ª¦,#;¡,çm\ 5#,ÐO\16çb\18Ï\9fÄj`j®\9câêѯQ\99Ù\9c@dÎ\8dÞC{(ª6\rÕÓ<B\17?¹ä5üö\90µ\ 2ÙÂô¶\1fÇ\95\9a~\13!kÊ
+-ïQ\9fxñjUÉ\82\81\85\96\84!a¶\81\9bv\14        \85\16\91iS\17²\14Uãß¡Ìë&}Þ³\8f\ e\18ógh¦tïóØ\1e´ý÷\99ß\88¢9T±>\r\88ì\9b¸¦kÓÐcµaÒ\8d\17êú\ 1sÝ$Èf\877\98\97\1f2\vWºÌQbñôÓ\10\83¯¦\89\1c 1\83P=ÜX¬ex\02H^\8dÈ,-Ò\96\1f¡3RhðàkG">åy}Q"\ 32óÒY5Û;:ð8/B!\95\9cfÈ¢\9fèÃG\ 3l\13\b\ 3\97M\12\1c\1dzx\87ÐíZ\82Ý\17Ç_è·Õ£ûøÜë\r\18iëIdKÕ*;Ï\18\r6A^Kîo\15\1aÐ\10bèë9ÙÉ\13Äë\13\aÑEàd\ 4¬®Vþ¥¹»å£(\8a\96Þ¶âµ\e«\8cµ,á³çV?à\ fð\17½\9c¬@¬J\95á0ý\83A7\0\ 1\95âRk£Ç@ìÞÑ 3\9e\1a\83fc­í9"\ 5¯a!¢\89\1fo]?O\10\ 4ãb
+-/Z\8fÒ12YfÌ~¥Ï=q¬ÖIT}\02e¹gQ¸Æ±]\80ØÂ0v'õ\R\9c1\ f\85¡_Mø\88¨éJý´þéÓV
+-\1e\86\80ÐèlÇ7t¯×>uVÚ\95cÇÚr¸J\9aÇÀßÒB^\89\82\9d¼\10Lx%K5\93\96NwEPy¾\84EGèÝ}u\8fn\91¡\17/.ñéwê ð|[×\87Ýü\86{¤Ç\11\88.ML¸±h÷\fé¹ô#Í\8f\9bã\97h\9f#½:\11÷\94\ 5\1fX@áPlÔÃÕiÜU<
+-î\r`ýÔ§Z<Ùêi?D©\7f\1d\9e\b\92\13%\17\81+©êï\1d"À3\85[³W_骬òJ´xöÓù\139\81ì¡P+?+çZùÔKÃF1öWÙ£o2§\9eD¹+h/\ 2\83q~\83H#\89\ 3\12(\88\14¯\1a\85ä©yñ\9bÌ\15\7frµ¿dJØ\1d oÅUÞû1_2!?¨\fí6û\89æÃ\ 4ë\17Òá\7f\80\80Ú¡Å}9\9a°\10Õq\83Ñ\X\0Õõwö\9b«¿W\90ÊäP\0\0\0\ 1\0\ 5X.509\0\0\ 3\860\82\ 3\820\82\ 2\ 3\ 2\ 1\ 2\ 2\ 1\ 20\r\ 6   *\86H\86÷\r\ 1\ 1\v\ 5\0091\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\ 3\f\ 2CA0\1e\17\r200801000000Z\17\r240801000000Z0H1\v0  \ 6\ 3U\ 4\ 6\13\ 2US1\ e0\f\ 6\ 3U\ 4
++þíþí\0\0\0\ 2\0\0\0\ 1\0\0\0\ 1\0\ 4puma\0\0\ 1\91C\94)\7f\0\0\ 5\ 20\82\ 4þ0\ e\ 6
+++\ 6\ 1\ 4\ 1*\ 2\11\ 1\ 1\ 5\0\ 4\82\ 4êÝ\9dË\9fmÍü\86\14\91Å\10\aÞ{\96ç\98ÚÁ.¼¡\82ºýû[9G\7fÍ}çD\1fu\ 1\8a¨\eëò{\80ÿ\98ìÎäÂ\87ÍÑ&éð\ 3¼)\8b\8b±\8f²Ìâa\8fß5v©Ù\1eíqÝlﳡ\ 1\14\9fµ¾\98RϺYÇ|\ 6\95RrÏ\86 úL¾v÷\ 5zô§Äy+¯`,ô\eÖ\90òJ19\1aJ\vß5ØÜNÏ7x:ËÌæ\15\92Ã\7f¸ÒæÍ´\92\ 3qõþ´\eÈåÀÝ`\13o2\ 3?w\89¬l@¦\80Ŭ¼âü\88§¨\8d§rÿ\8c\19¥±®hs¸\8dßÚ\85Ég£\ 5ó\1a\84ÆàÔas\8aé_t!{a\ e'=\96\bX]¡\ 3l\]iq¶¤ó\11~~K4°s94çl\90¹\99\be1À*Á\96BBw\ 5ß\95Cåq^tgl{\80îkº(¼Ï%§u\ 4©3\88\12úÂëjùUêt\97\f\92\0ã\9c9#\87Lgº\93'°M\7f-Êá\8aü\80¥ôû±H
++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\0\0\0\ 1\0\ 5X.509\0\0\ 3\860\82\ 3\820\82\ 2\ 3\ 2\ 1\ 2\ 2\ 1\ 20\r\ 6       *\86H\86÷\r\ 1\ 1\v\ 5\0091\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\ 3\f\ 2CA0\1e\17\r240801000000Z\17\r280801000000Z0H1\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\0\ 3\82\ 1\ f\00\82\ 1
+-\ 2\82\ 1\ 1\0¿ikH/\94×p\81ïîi\93\14ò\ 4±÷y\fÝvá\9cb:\12Ë \15\81¦ü3Ë9;´O0@ÎE^±Fá\9f6\ 4HãB¤Ç\81\98\9c\1d*}Zé¬\12.E¬¢\1c!{mªâÝp\19\14\12¯MþcÕd       `ä\9aù!ãóY§ÌÒ\ 4Ý*Tu,ßÔ\1dÅZ0u­ãò³Ú6½ÂU!h©rïå\ 6Ô\97G\85\r\ 5UQ2Íõ\84üU92h\1duø­&*\97o\1dÌ\85¸\1e2\ 5ËÂw\88\86H\8a\9fï\bå\10\84iðö½\v«Qò\0%
+-.\0>\æ\9e\ 6(w|\e\\bD¦ÈïIp\96  ×\87(?ð\ 2\0sÕ¦Àã#gH\88[à¡E\90c'ø^øf7\82dݼî\ÿ×È\10.}:ÜEÕ(\81\ 2\ 3\ 1\0\ 1£\81\850\81\820\f\ 6\ 3U\1d\13\ 1\ 1ÿ\ 4\ 20\001\ 6      `\86H\ 1\86øB\ 1\r\ 4$\16"Ruby/OpenSSL Generated Certificate0\1d\ 6\ 3U\1d\ e\ 4\16\ 4\14ò\ f"e\99\80CÁõ\9dF>¥Xkèc\8däô0\v\ 6\ 3U\1d\ f\ 4\ 4\ 3\ 2\ 5 0\13\ 6\ 3U\1d%\ 4\f0
+-\ 6\b+\ 6\ 1\ 5\ 5\a\ 3\ 10\r\ 6 *\86H\86÷\r\ 1\ 1\v\ 5\0\ 3\82\ 1\ 1\0}\98\b\92\11Nñ®ð[ïK¢tÕ/T\v¾\94´n
+-\82Ô+ÖÜ\ 3B^¸\82\u\a\8b\9aw\91}xk{0\9c\ 2
+-²¨m¾\1f\12w|¹eyÎån,ç\9d^Ãh  §&\18&\96\1a=\7f\r\85Äð8\89\9eCBð\80--\a£\85húCÕ\13\16á\1f\85ÊfES&\8b\94Ö\986\9eÉót?%\83{"¬\8e¨½¡zª\ 1\92\81£ÐÅ[\19   Q8s§\15ÝZ\8d\92õ­ìE\89&X\1d\96d\ 6Ê\8a7õwnó£14gÚKîÂ\877\17A[µ\aût~\91J~EB\10«Í\11\ et¿ðôÔGt\86\ 4\ f9ª \16ñL§G\94\aFõÆ\92\90Øë!ÈâµÓ\8f(»q¯ùð0û\e\\vÎ4O@Ã2×»Þ̬^Ø\18\8dmv\ 3J\9bë\95ñ#£1u[3\ e³ág
+\ No newline at end of file
++\ 2\82\ 1\ 1\0ó\95Í\93@bâ\97¯É8Ý\ 5ÏøUú$VyñþØ<m$&0\9f\ 3\1f\ 5\95\19%ºÀ\a\93»\7fÉ­p¶"\bÇÿ©bÌÕ3Ü\91êäÚÛ\ fR\95\87~çSøéuôÐb´Üê\19ì­\141ãÁ\91²b\9a\95ÞGÌCè\88@mÞ!-4A\92\15\94b![¡ó\88ÈB\14¸\11g}Dcf\8dÆ<\90\8avH¤\1d»¨\ e\19WEÌ\ 2\91\8d{\10M®r¸\fÛ\93\bâ\17p~b\9b0à­w\9aä\84 Ø\8dÇ@£ö²ù\ f'Ý`\96É©öÖôË\1aBgr6\84z#\12Z\10q\7fÀ$2j®baåf\ eÏO>`R\8d®\ 4÷®­3ð\ 2tÀ÷òº@|t¨\9f\9aĤ\b\19\93íÊàôuüsÇÜ\1fÛÿ\95\9bàÌè\12\1f\ 2\ 3\ 1\0\ 1£\81\850\81\820\f\ 6\ 3U\1d\13\ 1\ 1ÿ\ 4\ 20\001\ 6     `\86H\ 1\86øB\ 1\r\ 4$\16"Ruby/OpenSSL Generated Certificate0\1d\ 6\ 3U\1d\ e\ 4\16\ 4\14ò\ f"e\99\80CÁõ\9dF>¥Xkèc\8däô0\v\ 6\ 3U\1d\ f\ 4\ 4\ 3\ 2\ 5 0\13\ 6\ 3U\1d%\ 4\f0
++\ 6\b+\ 6\ 1\ 5\ 5\a\ 3\ 10\r\ 6 *\86H\86÷\r\ 1\ 1\v\ 5\0\ 3\82\ 1\ 1\0Z¦µ3_çò4=¼âhÝ¡þ#ÃÃÉ\85@3­7¨\13XQ\v3ö!ÿCmÙBK\90îüo9~á¾.IÀn«A:QÿèJ\róò\bñÜæ[>\16/\8e£Ï£t\1c\16ʱF\L/\10\18ó\14ë(\13j
++Ä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
+diff --git a/examples/puma/puma_keypair.pem b/examples/puma/puma_keypair.pem
+index c8057c8..1aded78 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 f8ffc7f..d928a19 100644
+--- a/examples/puma/server.p12
++++ b/examples/puma/server.p12
+@@ -1,17 +1,13 @@
+-0\82    ò\ 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\ 400\82\ 4,\ 2\ 1\00\82\ 4%\ 6       *\86H\86÷\r\ 1\a\ 10\1c\ 6
+-*\86H\86÷\r\ 1\f\ 1\ 60\ e\ 4\bGsÎ~è±\173\ 2\ 2\b\0\80\82\ 3øÐËáÊ:\96ï\91\0²ïGÍ\87Ô\fÔ\ eBøc\ 3
+-\98\80mJ*'Ì<\90\vã|\1c^îè\8d\8e!ÊAi¹V`\f\ e^
+-\e\ 6ë²ÔGeÃTj\e \1e\13\eȶ\801áÆUñg\bí"\1cö;\b´\12,5"W¥SÌ>\e´ã;*Âx£ËM¶õ6u%shL\7f§¶í\7f\ 3Klp\8c·n\ 6¿¾\1dº%\1dü|-÷¼×Gëç\bi\8ec6d\1dÚ©Ú'¥E\8bÚE:ÓéGËg\86á\1f#Mtüï\ 4´ÒgJt\12ñ \ 2I\87Ö×@ìQp¸\9eõ?·æ÷\958{U}_V\8cÅja!°¢\ e\1a©ÿÓUÙqú\9e\97\96WP\ e\15~UÔ\11­¯\80¹\99\11\ eJR9äÕI\85 b¶¹\ 4Y­©D\8a1ß§1\a`\89]ch;\11ãÀ\91¦µ\83\164'\88\ 4\ 5/%VÞ\ 36\9c\10\b¯>\85}­±¿É=¾\92z\92gÛ|J\14\9e gS\884lUðÌͼPôÍó\9f¶Øè£\1f\9fV\9ah+¥Õ§oHß|(púûº\81\95ÃÈ¡Cü\81À¦-¾uF÷¹\15\12:Mh\84^8wÇCögÌiÅÔY\82\90\1e\1c_\85M\9d¼     ÃÀÞ'\83w\94¬ýß\85b\ 1\ 6Ú\93\14Õ\8dbµ}{÷ìdõy\ f\ 6µÀ_GB\awl?¥!\12sE©ïª-\9b\81?\1cí&\1fX¼ü\ 69TU|Ï6\13¡w\ eüÀÄ-ö=ä\ 4\b$®ÉÐÁ\Û\12U\89*É}xñ\\12Á¸ÆÀ\99\13s¥ùë¡/æ'-=\90¡\8bONñÁzV/0©³\8d"À)bÆ\1aùå¤Ð\ 1÷´.\9b\b½KÛhx\b\12Ùan\90\88ôEÅj[\7f\98\ 5£"\99¼×¬\9a\88%0&\86\98iP\ 4»u\1aC·cäG\19\9e\18ºtÍ\0÷̲\f\13k\8f\18
+-i\9e\1e: èdó\14º&x\8e\87÷Ð\8c\ 2\8cûÇÅî\88Wx¹ÊÜ4ÝÓ¹  \90ôà[®´õ[\r\97³á\85,\95ÿS8ó¯\98\90£Ê·\9aÊ}\17Ï\99~\82^;R\1c\e¥\95\9cû\ 4\91®N©\99ÿßñz¶Gg\96r\14\9e-u\18TP¬\ 2ã0Ó*Úø¬¹n"Kò<àåµ¥\v\82#ßù ~\12Æd¤\ 3öMÊ\ 3\ 3¼\1eá\8eÇÿ#\0Äçåû\9ck¦åßñ\10\ 38\8e\1f¼ã¬Ã\8b\9dÒ믤¹[jüí§¸\ 2d-"ÏÃð_\1eFu¼\80ãÄ,£ó²\ 5¿C\89å\8f\8bÍv@m\ 3b\99{\13Ï\1fqÚÿ¿äú»i\81'¦ÃÄ\11 ï\95\ eÔKNaÍ]\98\ eùm û_-¾1å\8asW(ï\95 ¹\81\82q<&\ 3\93\96Òkf\f\14á\11\98P)ã¥LÞ\8c\9b\8c\9e<M@m<Æ#w(\vË®¡¬6ÄB\9eµ¥é«°\bº]ú\ 5l\Ò\8ex\17ûw\1dåÛ3ÅòI¡Kµ\8e\8e
+-§Ü\8fo\b^\ 40\84\10\9a°WìÉ\87ñ\85\7f\9bÓ¹\9d\ej¶1\bºa¥\83Æ\98'ÁØ«ÀD^Î\1cıä4;qv·r®\1f\8a_\83úÖØ¹û4G£åNÀaÖ\119jg.\11ê0\82\ 5Z\ 6    *\86H\86÷\r\ 1\a\ 1 \82\ 5K\ 4\82\ 5G0\82\ 5C0\82\ 5?\ 6\v*\86H\86÷\r\ 1\f
+-\ 1\ 2 \82\ 4î0\82\ 4ê0\1c\ 6
+-*\86H\86÷\r\ 1\f\ 1\ 30\ e\ 4\b\19\1aHëqd2\ 1\ 2\ 2\b\0\ 4\82\ 4È\7fQåvºs\ 4¾±\9a+ÜP_é÷U\9dý¬w}¶¼_£NÛD\8a\98+d­Aä\18\90ìäm\9cï©\8câ\19:Hé\ 5\9céµÓ¹ßØ;\b\88ÀÊW\7fxmáòÝÃyô}»1e¥ÊÕ³"$Æ\8c\b\83\82\81P/y\89k\ 5\e\ 6·¸\16\92h\85`\83/e*|\9f^s¼\94¤ÊÈ\89¹¼E.\13Ì¥â¢ü\15\10\10\98æÔÞ×oÛæJ¾Æ\98\82\15¾ÓÃÙKòo\96ÁàF\1cS\94\15Õ¤QízMs.¬ö\92\87\0ëKÜH\v\ 6\8bk*Ýjô\9dï\8fFôO\92î\9cÃ\19Q¤³pT\fuÕÂÆ\9d@\98\14°m«HíjnnZ\88IÕ^#åÝáý
+-\86\a¬\ 2Dá#\95÷Êöø\14­(\1fS\v\1f´üÞÊ\9d§à]$¿\8bP\10W\89DjT çÞY²@\a8Öß\98Ð\ 3±"4å\rlíT>\96P\94Âè9$\92²8Õ\94Z\95\9c\14Òó\98\97nP¹XÿÏEzÉ¡w\bB¯$\8aôfÿ´\83×5ýõi\ f¸M\10\ 6D2V,3ýή\14Î\11ñ,îmÓS*e\94*K¦t|ÂU\0¯Â «[ú?{¥\93.\{ß\15\94é\a\82¾ô\bU1\878üâà\99õc\f·o,n.K\0,\9e»[ÀÌs7\8a\f£\1e\9e_\ e½³\13QÜ&Ð\7f\1aE\8fѲPÕ\8b\95/²Û\9f\89\82\v×Í×\85õ(\92LL2\e¡ÛÅýZQÑ|=5*\82n\90\9f{àÞÜÚO\11}\88?\81.I\bØcú裧j]ÒIÉ\19i\12GKãÔÁè\9fV"\ 6ËÞ\8b7Îoà\96Ó\16à ã\90\r::^M.\95\80G]³\7f\f^ôè\91j\92\94©WN«2ëÂ,\8a3g¯\0\98Ul®ª o1áóiY5ë\95üt°\ 4¿¸
+-\9c³\1f\15Üèļ\80\ 4©^ZPFÈ\18oWDÞÝ\
+-c[\8a\»o\8bïp"\85\ e§|ØF\1e|µôé\1aO/°é\ 2\87³ Ã°ç\19F\a\11Â\8ce\9eW\7fcR÷¶¹ÿcV\9b<\8c\11BÓÞ\94s¹Àø\10è\ 5\ræ\16B        \9fM%^\ 2ø¼-£'ã8I¸ \16ç±Åk\ 4Kï<\8e£\91cf0×\11þ \80$ªÈaF\18\1f\0\1c£é\1d\1aH\82\84\95nZ¡\ f\9a»\0M\8bxÞÀ¨¹#w8Àü5\ 6\84\86ô7G¤yÇT«òúü\9d\f²è¢¸-å{\ 6V*9ÝÀ[XC\1dÉ\8a\16§pw\81ß\ 5r¾_ô\8c\ 6\f¢Ø\ 6\ 4\ fm\9aiHÇ\8e\13p\12±8Ë\17Â]dà\f\8d\83K;dr
+-®\84$é&hàÿ\ eü\9d
+-+ Ó¶Ë·åL#=Î\1cutêÇ@B:A}ñ~è°}\9d\154k&ó>3ŹC\8a©\9bJ¬Ðø\8eBÇðh1\ 2Ì$\85\9dÐñÔð\98\80ÿÒdëÁ1»Ê÷Þÿ£\ e÷® 1êbzÃi\93ÊèÅ\8eÖ\12\9fúìBÁõøû%®Þd\12<%´\ 2\88¿\1f<7      m\81
+-\1cg\15èá\9bÎ\9cH²x\9c\87s\9dnw\91b
+-¦ë\16¯¿°¨ù¡'
+-\19<¬ä\16öO\ 1\85ha£\ 1Ð\ve\ae\1e\8d\r£\9eÒXK\f\ 5\1aæ\97\7f<]\98Y\83>²Ö\8cg^9ùÁ\r\84$\8bÎl!Tx\14«NcÿìTâ`h\8b\80\915·W.\9b§\\9b\1dî\9f¨²pU-2\18\18ËiÁv¶\83^ÜôÀ8ÆÔ\95\0    \1c\19>¼ÓP*3\bä\0w\17ª\0dæÞ¢Úuã¶\ 6ö\1e½`èIà\18²Ì\v\85µpYÓæ\14ÞxÚøo9¡*\18$\ e+5\86¾\16hE\94\83\8d.v±hDoPr¾xË£1P\8e\0«\96\90\81'ô¦tìô2\ 5À°\1c\98\8f\8c¼îú\1cßâ\98øïa\87\ f1>0\17\ 6      *\86H\86÷\r\ 1 \141
+-\1e\b\0p\0u\0m\0a0#\ 6 *\86H\86÷\r\ 1 \151\16\ 4\14\99èÓ§w\rw1Ó¶\v÷\8bg\91Á¸ñG\8d010!0  \ 6\ 5+\ e\ 3\ 2\1a\ 5\0\ 4\14ú\1a\90\b\11\8f\11\fZYö²¤µ\15Tßp\ 4\ba\93ciyÑkn\ 2\ 2\b\0
+\ No newline at end of file
++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\00\82\ 4h\ 6       *\86H\86÷\r\ 1\a\ 10W\ 6    *\86H\86÷\r\ 1\ 5\r0J0)\ 6  *\86H\86÷\r\ 1\ 5\f0\1c\ 4\bùØ{T¸ÌÝ\13\ 2\ 2\b\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10\91\10¯²8\Ã]}Ì\9b\98{\84<)\80\82\ 4\0ÜTHâÏ9ô{#CÀ¼Æ­>üO̱]\ 2¼fT\83®\1f[éªèǨè\11\8eçÁs\87V\1c:\8f·\1e!°þ\99\0^\vY*\Üa\fõ\1aö& \0à\8dHUty,¨w\7fw ®\ 5|z\92k\7fj¯$\85õ\7f÷»V\8aÂr³,+ö0z³\10øRÞe}Fm.òû»,:øÜ\ 5]\87\16\11´µ\ 3dT\82a\96Ã\88\12Á{#,ô ð/ÐzArÊÕìH¿\14±h\1aî\81j\r±ÿ²ö&'\87$\85k\86\85òÉ.\18\.tØ6D+ß\88Ï\17\85\17\9d²\ e®¥#¿Y;Î-Ñbji\rb³£ <¿½\JJ¤k\162%\fàÃb´wíÕ½þ\8c\1dÊBjðõ¿I¡ê\83M\85ËIÖÜìñèS\1d.\91\8d@\8a\9bÆ0È&V\87¼¾¢ RgXA\8bXUhHæÁ+Ji\ 4¥ºW\9c\85ògvò4(ù|ãl¢¿=\8a\ 4c\93nygï\12«PÊ\ e2\v\11¼\80³¿â\95\ 2)7©yÊd\98,\89`Æîv|Ãf*\82÷©VHæ»\13¥\19\ÿ(\9anq\véfÕ\93\88\ 4\7fæ'\82"Ã×å¢\17±\8e¯\97\9døm!\89\1dà\82Û!ö\18\8f9p\17¸Q\1cc\8c¢£\17 \ fn\fØ)4ææWýD\84\8eçäi\13\0Xy\93ì\8dÿ¾3¢mÛ\ 4Á%\ 5F\8e\90·\v\ 4F,(w\96U˸\9a\13\0ï- Q˵\86K¡ò\ 6<È·È¢ï=í·Ý \0S7\18\9d\9d\87\92ì6Ù\15^y\ 4\92Aίc»\ e-«-\9a÷\fLLc\87\1e\8a¿B||-*\ 6øÕú Yõ.\9e\12'MÞ¸N\7f\11Ryù\99b\1dË<ÞþËç \8a\91´\1f¶|\8e\17\85/24\a\98l\86ó+\15µ@ïVéô\ 5÷TûÛìP¢\bÝ   RöþI£·Õ\14\80\94óc\91ÂBµÙn\97¯b\94È_÷¸õ\ fóWxçä\7fì42y\94\15Ê\8d]Æ./Ï·c¬é}ã\a[\15\v»çàè\o¯×\92\1ad9þük4\19Yv¢¼\aÀ\8aÕí˧í_ë3[´\10Ì¥\15\89û1\92o¦vá,\0aæ>\aW\85>î^\1d7èÂ\88Âk\88¬\96¾K-{o\19µ¨\18A;'Ê\11\86\87\1f\8f9p©\96ù\8a\9e÷\ 5í\92à¦â\1f\ 4u6Ò|\11q"\ 2È¡² SïS\1c£\b·,Åw\94\b4ÖÇàßf£Ð\ 5âó\83.\9c¹6G\18\bìò\10v@U·xf$rýÃ\ 5ëý¬Ì\9c\14¬"NÒ9\15\84²dn¦Þ\17\83¼\15\1aÍ\98x¶Ï\13\rÌcê¹s\15)nX_Æ"\16[;+\82çìS:;íjv\15\99¾cr\12\91g<ãZ\8e\9cI°É8u\95\r7+\16}DüµønB\83Óô¯D{øë\ 4\ 2\ f¥\83Q8\11®·§\8eV¹rJ\ 57I2èlC\ 2ʲ4¥0öÈ\83ÍÌ\9f\16RPRëÐ_ð\86\15h\8cI\ 5C\ fó\1f\93\9aua\97\0ZØêwº\av¡ÇÑwDôEO.X\96·\12ö\10\v\12ë/&ä×ÚÞ?ÉGY¸ Xßâgé\12R\92:Mk\87±Tϱc
++\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\00\f\ 6\b*\86H\86÷\r\ 2    \ 5\00\1d\ 6   `\86H\ 1e\ 3\ 4\ 1*\ 4\10­l\9fï\14rRQ\83\9eqÈïÕv\92\ 4\82\ 4Ð\15éZ~knÔ´(\a\94³ä\10[_\b£¥ù\15_"\9a\8dö<oÖ~7¦\9fS¨áÈ
++\1cIj\1d,éð\98Öµ==¨æ±fñ¡Ö$/£`ÑAS¡Lm-úÕs\8a\18»¶j\ fvÍß`\80.\12ÓD{ý¨\91m=q1\0\ fº\ eê¯\1d\8a\80\88\ 3²oX\89OÔ°Aç\b\93\13\ 1
++\ 14`G|\11O4áP=&\83\9f¬\0y8_ÚÃIÅÂBO    \85\15ôÀù!\18\ 4i3:Í\83[£>ðïB\16]_dÆ£\85\95+¬=o%\97îV\80}T*Ä55ä\9e·ÿ1`\bôpx 2\1d¼¶{ORÈr\82v¤Å3\rZëÅ\a\98ý0À\11&õ·Í`
++\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\0\88\18·º¢B8Î\ 4!YÚ\92\8d\9f\e\vÉýÏ 
++½XH\0T\16u¥ê\9b\ 6û^A\ e®\96\9f\ 6þî] á)w\90¹ ¥²©­Äð\8dâ6\1e\14\19÷\9e¶ÑV^\11    mã\ 6·Y%Û\1aï´\10¼\92õÚ躯À¼ly6\13\16ÎOÐþuÝ\1f\96SoI}\94T5~\88ç_g~e       :HOfr÷X"µ.D\84c¿*\ 4æ\8f\ 67SRý\90 àÅ¡\ 2\11ã\8e\ 1\17×sCúm\9d\e\rvüÁo¾\8a©²ÌS\b'p\0Ú\7fï¬ÊÂ>T\fàÂRi¶2\9eá\85X\19R©X±C6½f\86S'\ f?     \e#\bñ|&  Ô\88e`ð\08\r#\1fùJ¤Û÷Þ±\vÅç´\ 6ðýû|\19v³FµN}äm\96q$\1e\1c³\81\ræa׬ðK\1e\97E\8a+Y\17(\81´?ÿIÍØAÃç?¡\96Üç/}\1fÑÊ}Ád¯\17\ 5J¯3\87ëæo±ö\86\94ó\v\88üi¾,@èx\8e\16õäOhê@\19+Z¦Ê3,       \10¦{{õ¾Õ-®òþt\ 3Ï&ªÏÞòÀ\9a[t%¤íäªvëÛùÚ´¸ÍÒÛ\9c\ØBj\eié?êº*\1e[V5Ý=^H\ 3\9c>DÃÏ=\v-s\ \15 q\18\9cKX<$²ñG\8c\ 4\9bóÓ\1eqG¯án¸<¨EW\18Û\ 4yX\a\14jyä÷\91ÓÕ\ef\10\95¼\86ת\0©òD\10õVBQ0DR\12´V6áj~ö\18\93æØ|3\80Â8Àðm»¸¸\17\93\ 2s{\93$\88ó'Jñ¸b¶ÚÒ¦¦´\14×áýÄn\8b\9d)3Ø>ç;ÑÂÙQ\v.ã|\ 5\93B\11\ 5¿Ô\81ë~\84H\aÁ_èÏài        ¹qÁȺ¥Ø\8d¸\86\99ÞÜù}h\ 1VDò[Fm½\85SbP<1\9fÌõ|¨Ê\97àYÌ\97\1f\160TIÜ\94a\eË`\15xÇ:´Â\93Ûw\1d\_b\85\8bê{§âe\1f\1c\13\ 21±w\96\8ahúü\91;S\13ÍÏ\8f]\83\b8\93\95\rÂxþ×Fl0<ýóJ\90ؤñaX#\90ÐÑæÉ¢xãß?û\13÷\99dÈY\9f½\89\8aØQ+ª8\84\ 2ÚÈÏ\ e\9d,\ 6\95³ì\9a _\9d:\87<q¨ò¹Ù\eÈ\9d\7fkAÎ\7f4]k~ãM±ËÍÒ:Ü£Æë(X>\89¡<WϦ\8fñ\18½s}­âVd%ÿA6=\ 6R^}ö\1e½|)·'Ò(§MrYâñ\9e\84m»I¤÷\1e\v×§¸\13\82\8bi">MÓ\12\8fa>ê(Lµ\ 2RÌlÙ§^vfið\0V\82¥</\8cÕ\8c\92\8f\80ÑÛ¹Å\10¨\95\18/j\171>0\17\ 6  *\86H\86÷\r\ 1 \141
++\1e\b\0p\0u\0m\0a0#\ 6 *\86H\86÷\r\ 1 \151\16\ 4\14Ô\97S9ÓW\88\ 1w#½\93\19\ 5Á\92ø\1el00A010\r\ 6        `\86H\ 1e\ 3\ 4\ 2\ 1\ 5\0\ 4 ´\r\86\10öX(»6#¹È\1aÚ+Ç\90a®OÁ\13Jº}¤\15ä\9f¯I\8c\ 4\bØ\ba\82\ fÈ^\97\ 2\ 2\b\0
+\ No newline at end of file
diff --git a/patches/0011-Fix-path-of-certs-useb-by-test_example_cert_expirati.patch b/patches/0011-Fix-path-of-certs-useb-by-test_example_cert_expirati.patch
new file mode 100644 (file)
index 0000000..5bf6bf0
--- /dev/null
@@ -0,0 +1,30 @@
+From: Lucas Kanashiro <kanashiro@debian.org>
+Date: Thu, 19 Sep 2024 17:44:55 -0300
+Subject: Fix path of certs useb by test_example_cert_expiration.rb
+
+Forwarded: not-needed
+---
+ test/test_example_cert_expiration.rb | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/test/test_example_cert_expiration.rb b/test/test_example_cert_expiration.rb
+index 5e04d49..186d2f3 100644
+--- a/test/test_example_cert_expiration.rb
++++ b/test/test_example_cert_expiration.rb
+@@ -14,11 +14,11 @@ class TestExampleCertExpiration < Minitest::Test
+   # Explicitly list the files to test
+   TEST_FILES = %w[
+     puma/cert_puma.pem
+-    puma/client-certs/client.crt
+-    puma/client-certs/ca.crt
+-    puma/client-certs/client_unknown.crt
+-    puma/client-certs/server.crt
+-    puma/client-certs/unknown_ca.crt
++    puma/client_certs/client.crt
++    puma/client_certs/ca.crt
++    puma/client_certs/client_unknown.crt
++    puma/client_certs/server.crt
++    puma/client_certs/unknown_ca.crt
+     puma/chain_cert/ca.crt
+     puma/chain_cert/cert.crt
+     puma/chain_cert/intermediate.crt
diff --git a/patches/0011-disable-minitest-extensions.patch b/patches/0011-disable-minitest-extensions.patch
new file mode 100644 (file)
index 0000000..cf1d2c9
--- /dev/null
@@ -0,0 +1,41 @@
+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(-)
+
+--- a/test/helper.rb
++++ b/test/helper.rb
+@@ -16,7 +16,6 @@
+ require_relative "minitest/verbose"
+ require "minitest/autorun"
+ require "minitest/pride"
+-require "minitest/proveit"
+ require "minitest/stub_const"
+ require "net/http"
+ require_relative "helpers/apps"
+@@ -110,12 +109,9 @@
+ Minitest::Test.prepend TimeoutEveryTestCase
+ 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
+@@ -215,7 +211,7 @@
+   PROJECT_ROOT = File.dirname(__dir__)
+   def self.run(reporter, options = {}) # :nodoc:
+-    prove_it!
++    #prove_it!
+     super
+   end
diff --git a/patches/0012-disable-cli-ssl-tests.patch b/patches/0012-disable-cli-ssl-tests.patch
new file mode 100644 (file)
index 0000000..889a8c4
--- /dev/null
@@ -0,0 +1,26 @@
+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(-)
+
+--- a/test/test_pumactl.rb
++++ b/test/test_pumactl.rb
+@@ -255,12 +255,12 @@
+   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
diff --git a/patches/0013-fix-test-term-not-accepts-new-connections.patch b/patches/0013-fix-test-term-not-accepts-new-connections.patch
new file mode 100644 (file)
index 0000000..4226609
--- /dev/null
@@ -0,0 +1,22 @@
+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(-)
+
+--- a/test/test_integration_single.rb
++++ b/test/test_integration_single.rb
+@@ -112,7 +112,7 @@
+     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
diff --git a/patches/0014-disable-test-failing-on-amd64.patch b/patches/0014-disable-test-failing-on-amd64.patch
new file mode 100644 (file)
index 0000000..74906aa
--- /dev/null
@@ -0,0 +1,23 @@
+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(-)
+
+--- a/test/test_puma_server.rb
++++ b/test/test_puma_server.rb
+@@ -1566,7 +1566,7 @@
+     end
+   end
+-  def test_command_ignored_before_run
++  def __test_command_ignored_before_run
+     @server.stop # ignored
+     @server.run
+     @server.halt
diff --git a/patches/0015-disable-different-output-test.patch b/patches/0015-disable-different-output-test.patch
new file mode 100644 (file)
index 0000000..7148472
--- /dev/null
@@ -0,0 +1,13 @@
+Output changed from 'OK' to '::Rack::URLMap is loaded'
+
+--- a/test/test_url_map.rb
++++ b/test/test_url_map.rb
+@@ -9,7 +9,7 @@
+   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
diff --git a/patches/0016-disable-test-failing-on-arm64.patch b/patches/0016-disable-test-failing-on-arm64.patch
new file mode 100644 (file)
index 0000000..7916853
--- /dev/null
@@ -0,0 +1,13 @@
+this test is failing on arm64 buildd (sometimes on other archs as well)
+
+--- a/test/test_plugin_systemd.rb
++++ b/test/test_plugin_systemd.rb
+@@ -32,7 +32,7 @@
+     @sockaddr = nil
+   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
diff --git a/patches/0017-disable-test-failing-on-armhf.patch b/patches/0017-disable-test-failing-on-armhf.patch
new file mode 100644 (file)
index 0000000..9e9c286
--- /dev/null
@@ -0,0 +1,13 @@
+https://ci.debian.net/packages/p/puma/testing/armhf/42745746/
+
+--- a/test/test_integration_ssl_session.rb
++++ b/test/test_integration_ssl_session.rb
+@@ -122,7 +122,7 @@
+     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
diff --git a/patches/0018-disable-test-failing-with-ruby3.2.patch b/patches/0018-disable-test-failing-with-ruby3.2.patch
new file mode 100644 (file)
index 0000000..ead113c
--- /dev/null
@@ -0,0 +1,192 @@
+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(-)
+
+diff --git a/test/test_cli.rb b/test/test_cli.rb
+index 686f2ec..b20a9e5 100644
+--- a/test/test_cli.rb
++++ b/test/test_cli.rb
+@@ -101,7 +101,7 @@ class TestCLI < Minitest::Test
+     t&.join
+   end
+-  def test_control_clustered
++  def __test_control_clustered
+     skip_unless :fork
+     skip_unless :unix
+     url = "unix://#{@tmp_path}"
+diff --git a/test/test_integration_pumactl.rb b/test/test_integration_pumactl.rb
+index e383764..fc4fdd4 100644
+--- a/test/test_integration_pumactl.rb
++++ b/test/test_integration_pumactl.rb
+@@ -34,11 +34,11 @@ class TestIntegrationPumactl < TestIntegration
+     @server = nil
+   end
+-  def test_stop_unix
++  def __test_stop_unix
+     ctl_unix
+   end
+-  def test_halt_unix
++  def __test_halt_unix
+     ctl_unix 'halt'
+   end
+diff --git a/test/test_integration_single.rb b/test/test_integration_single.rb
+index 226e8f4..a57cd73 100644
+--- a/test/test_integration_single.rb
++++ b/test/test_integration_single.rb
+@@ -246,7 +246,7 @@ class TestIntegrationSingle < TestIntegration
+     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:')
+diff --git a/test/test_plugin_systemd.rb b/test/test_plugin_systemd.rb
+index b9ded19..e813da0 100644
+--- a/test/test_plugin_systemd.rb
++++ b/test/test_plugin_systemd.rb
+@@ -37,7 +37,7 @@ class TestPluginSystemd < TestIntegration
+     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
+diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb
+index 8c6f3f6..9ea0c47 100644
+--- a/test/test_puma_server.rb
++++ b/test/test_puma_server.rb
+@@ -593,7 +593,7 @@ class TestPumaServer < Minitest::Test
+     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"
+@@ -606,7 +606,7 @@ class TestPumaServer < Minitest::Test
+     assert_equal "HTTP/1.1 408 #{STATUS_CODES[408]}\r\n", data
+   end
+-  def test_timeout_data_no_queue
++  def __test_timeout_data_no_queue
+     test_timeout_in_data_phase(queue_requests: false)
+   end
+diff --git a/test/test_rack_handler.rb b/test/test_rack_handler.rb
+index 59fbcd3..e93d41c 100644
+--- a/test/test_rack_handler.rb
++++ b/test/test_rack_handler.rb
+@@ -308,7 +308,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
diff --git a/patches/0018-update-certs-from-upstream.patch b/patches/0018-update-certs-from-upstream.patch
new file mode 100644 (file)
index 0000000..eeea700
--- /dev/null
@@ -0,0 +1,597 @@
+From 0b6b91080db31e7c51b2a430efee2c2827b050f8 Mon Sep 17 00:00:00 2001
+From: Kartikey Tanna <tannakartikey@gmail.com>
+Date: Sat, 10 Aug 2024 21:01:12 +0530
+Subject: [PATCH] CI: update client certs example files (#3440)
+
+Certs regenerated with
+
+    ruby examples/puma/client-certs/generate_client_test.rb
+---
+ examples/puma/client-certs/ca.crt             | 28 +++++------
+ examples/puma/client-certs/ca.key             | 50 +++++++++----------
+ 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/server.crt         | 30 +++++------
+ examples/puma/client-certs/server.key         | 50 +++++++++----------
+ examples/puma/client-certs/unknown_ca.crt     | 28 +++++------
+ examples/puma/client-certs/unknown_ca.key     | 50 +++++++++----------
+ 12 files changed, 238 insertions(+), 238 deletions(-)
+
+diff --git a/examples/puma/client-certs/ca.crt b/examples/puma/client-certs/ca.crt
+index a69ea6fb60..5ca5ad462a 100644
+--- a/examples/puma/client-certs/ca.crt
++++ b/examples/puma/client-certs/ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDDjCCAfagAwIBAgIBAzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
+-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA4MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwggEiMA0GCSqGSIb3
+-DQEBAQUAA4IBDwAwggEKAoIBAQDIHxrFcS2JkRQbXLFosb32unVkVuwHSPSt6Dpl
+-2jUQHP/bceAx/d9waHYf8rlbCFAIoduZDOc7XCJUidgcG5NfLJyQpkkWOU8CGWH+
+-Ipl4AE8auYCcy/0T7BQqaRC41HPmrJG1CC40rqcY47lUO2haI+vj5TZFHNhAbRat
+-rR1iD1veis2gBZtrMzd4IlpvEHGv6ghfnSc20za4exmapjp/uAAIOXpeFX8QHumA
+-bty4dd+iHpKjDzUrhG9Qa5v28ii2K1AcbczUQ7FzSp2/GoRSjF+WY6i86N9Z1M97
+-2PEgy0IG5l6JHu1P0/rd00hN0h0Owzv3V5ldMLZap7+pVFQTAgMBAAGjIzAhMA8G
++DQEBAQUAA4IBDwAwggEKAoIBAQDAvPDst3Kqf1OV6XPD2G/2t4r83772/mXpde4a
++dliadJSuOvbW+eQC/SNk/0Ghi4VZCmsnciV0tyUqjCZq6QR1KvdvWyIXlubYwGIG
++x/fwUbBFlh4W6uuxi6noJg+yOl5CF2LLIa6nEA7Nl29GjH6oFEzGUt4hIl3Ieb4+
++BdD6CsOHPl82yg8dNDBE85YwXRGoTv/yWUouZMzAwFbXzOJJGTI08FxOZeNf//jk
++wnoWEybaLjwE0cliDHZWV5Ou9HIJMrzi7VGRyRwOzUeV0Jsx3IhAT3zSnJlQ+i0W
++W/qjuHXW/Y10ygV5w5VsP8CWPjgiFQbZRFrj2dmV3N1T1+9jAgMBAAGjIzAhMA8G
+ A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IB
+-AQA3GWpy4bYLOHLENDTUBeclF6cDdYiautD6gxd1SDLMWOhAUF7ywwT87OAJdr1I
+-+W1TUv5BRG21rNm1QsZfLbStdKA1mpiET/9nYN7m1YauL5hI3yD49TGuO9/sxcE5
+-zNW7D3VBVNq+pyT21/TvLAgxCNvjjm7byzyIOcoRUyZx8WhCf8nUT6cEShXqEg4Q
+-iUBSLI38tiQoZneuVzDRlXBY0PqoB19l2Kg9yThHjPTVhw5EAQSDKXCCvaxAbVw6
+-ZPLNnOdK6DvqEZ3GC5WlaHQdmLxmN4OfV6AEtpgqgGY9u8K1ylTr3ET7xLK7bhcA
+-oZsggEVZr1Ifx9BWIazRNwlw
++AQAJDqGMwN7PWFvFkQFOXb6y474x29oVHjt7GdMTHeuowUZFn3fTSfWW5+yIkkyf
++qFXk/VFyi28YLA5hqfiMCy+rIJE99mbg4WV2EjtokmotXkytvGA2VAv2ZfGnFW4+
++WoAYDIuFLs4SrLZ8bjZ9+HIlTBkDaa6e9I2rzsnk4jpO7Ed2X8elUFTSS6jNkSbF
++fspY2cJaomj3pVt3ba/qt1MiNgcwKieOirYt2rUGZVlveMLEzt7lyIa2C6sV3tP8
++BO+7B7c2n2rU0rTdUiZRzC+wcv34zJrnq6Y9CoeWSeVyf6DN7TT0NEh94iIAYStU
++pr8/EoadU91J6bnCruGwWYuf
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/ca.key b/examples/puma/client-certs/ca.key
+index 59bc391a20..47efb33baa 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/client.crt b/examples/puma/client-certs/client.crt
+index 9703ebdbde..4284c64f9d 100644
+--- a/examples/puma/client-certs/client.crt
++++ b/examples/puma/client-certs/client.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBCzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
+-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
+-IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
+-ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
+-E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
+-FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
+-u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAApaKvnGiRqs
+-Vz4B06f/mDLmN7gb0e/evEypB2S06fp9f/oWWHXHCxpx9bKbiHFNNiinoc97/Spb
+-GzylHV/n9j8GEtZmJMiSJZubN8vpn1Jg0Usz3ZtAy0fe9ephjBIXPpwrsGF6Oz3u
+-U/b2zTpJX3oJ3Eq6Q9hLplYU3bNHfrw6PAbzbB91zVTFsqZUTctKrMRgp68FA4fw
+-VWQkb4QwLK1UVJIT/nR3v7nJDktgpR4mfdrtWbWxOGm/ed2oOilpqVhVN99P+bUn
+-3cFkQ6PSYK8En9jJhBMe/zQqpSyy09Tfi/Zy6nzZv0ah53bpeCFLZFi+0CU8HwPr
+-MuD1XQN72zg=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxZ0Nt+SANz6B1NevcV8DuKi9m5/j
++4/Clc5eqS5TkYjZ71SYjV2j0Cy7PtdDXcUZSUMdg8dTww9zbxS0GQUg2lUltbbkO
++nWcWgLp0COCPjunld1sHI+rZcMaLlG9qdVSxvKmzBjavaur+Eb3O1tA7gZLjV9kJ
++tDjUDN5Eur8HH9BdpjNkf+vv5VnGfrFplYcsGYOXdTYUlgrbDfxidHIBlebEaD47
++acHzLxcWrdlmDdGhLZ5eir3reaRyeZwAQESO11pIN3sp0aS6IYcIPaRdA+saYNBu
++QCRr4j7EauGPdxwX+RhoJ3Yg09vz1Rj/jesvl3grU7Hk9oeG5JjPUDEYQwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAEFT7Qmph1wU
++seHb5nCXL4ZF76dJQWjqm18jWYnLZcW6hGrq8VPyVgE3znWlK58UKFVo0r70QQe2
++H+vjtWL+9uw5l1pKsnwve3mz+cC5uhK7SjvDaE+nA6vKXbgL4ANodyHq4i+Kc2/k
++o4Y+drmfscTWAWbwp0KENMsQzr61pV27hIH1CUIo2/6DQuf8mTjIGd/bgWeUEq0X
++aoHgsjMiPXI4j1IezdEFLLE3s5QbFqgPPrA6JnMMiH4G1xB6Vx5B8Ho0qlzZyeWe
++pNA1jAsrsXYou5tv7nYwjnQPUEGhkOJ9rHbRod9MpTVCnZDyZz9miUQm6BrzdqUz
++ycTxmpjng7U=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client.key b/examples/puma/client-certs/client.key
+index 15820eed73..39ee1cccea 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 cd20e04895..e98ef7c173 100644
+--- a/examples/puma/client-certs/client_expired.crt
++++ b/examples/puma/client-certs/client_expired.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBFzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMTkw
+-ODAxMDAwMDAwWhcNMjAwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjMw
++ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkS
+-IBz8ZgyyhSW1lU/tcsNEJakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+yc
+-ofy+2OOu4un+44qIGX82i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MH
+-E4yX547E6XmmJ9lp8z9FnBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+Vv
+-FbUIndC+UiD0kYPxTwSDCpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslS
+-u7CFInqbswq5LnGFRIVSg3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAHDfDovSTCmM
+-sxDCfTGQUYwnvOohTP0hjUHB6BzNAPVKYoBiq064m/JoDFmOGGtF3CqhWqtE2psl
+-eOK8fA/QomyFaIAowhx8qrswMP7T/rRldAG+9QHBYZGkPtbB8evK6XqrMEQTf2Ux
+-FlN3p7BZl9rhtuManMb+Wud3HfLYjXn2nTRvkOTi93MP05Vrho8KegZ9Kj4wY1rK
+-gOnkbI6bv+1r9yjsZuUKPH/OjFkpmAoOab5hX5R5CmEefGAet2KPCNrApuwfvRHT
+-x9jVwtOYBHq3DVcBDBu+O38L+WlKGeXvUK4AzvxQaVUysCG3DA1zrvyI3Y8Jy2Jk
+-KfmWZWlvXlM=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxZ0Nt+SANz6B1NevcV8DuKi9m5/j
++4/Clc5eqS5TkYjZ71SYjV2j0Cy7PtdDXcUZSUMdg8dTww9zbxS0GQUg2lUltbbkO
++nWcWgLp0COCPjunld1sHI+rZcMaLlG9qdVSxvKmzBjavaur+Eb3O1tA7gZLjV9kJ
++tDjUDN5Eur8HH9BdpjNkf+vv5VnGfrFplYcsGYOXdTYUlgrbDfxidHIBlebEaD47
++acHzLxcWrdlmDdGhLZ5eir3reaRyeZwAQESO11pIN3sp0aS6IYcIPaRdA+saYNBu
++QCRr4j7EauGPdxwX+RhoJ3Yg09vz1Rj/jesvl3grU7Hk9oeG5JjPUDEYQwIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAGHuetf+9YQx
++KGemHFuRz4SLHMQ5+Mz0U2cpJ8wXMH4dRSK0M/7te+pVuAVY+AUDRq0AReimWT8n
++QFbZ3RPi+hij5Sf8McdDrV/wgepriUv96kH+hWzhyWW3QxsaTx7nj87szbZLBx4J
++bcvWPJvx9ci1EM8YQDZ/WjREUxUeD994A0z18JihJt+hOxSm+SS84f/+lxqn00Zz
++Yp3FpcZ9fxStviCtXgBZtUOgN2cINBrj4Y55aBBVPscyBmTwABk/Z+fMzegk/VZI
++0rMFRbmpXt/cdbjEnaZ+uOKxSdIYQy+CY6JRFD5VRPqPC6f6x9DGVakp95s2dWj6
++CP427o/8ND4=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client_expired.key b/examples/puma/client-certs/client_expired.key
+index 15820eed73..39ee1cccea 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-----
+-MIIEowIBAAKCAQEAoywLJRT7wZM1P3Abg9NIT+NJ8TkSIBz8ZgyyhSW1lU/tcsNE
+-JakIl22XAeLEHfMknMzDqvU1G256hqM+/Tgohreat+ycofy+2OOu4un+44qIGX82
+-i2PCt+afVvbGhPpHioyAJRDXZd9V4FtESH+6As7m+6MHE4yX547E6XmmJ9lp8z9F
+-nBMi1a6C01bI6mZhMuReLl2bS0FWjqrwNN3PpizBD+VvFbUIndC+UiD0kYPxTwSD
+-CpEq/To0FrNCdAj94Y4oZVuvx8B1mHiqwkqmlOLUZslSu7CFInqbswq5LnGFRIVS
+-g3bu4bgCbCEmJhfqxp5MODT4VBXa2sCOnG7BBwIDAQABAoIBAGsjyE2Y8ZWxKw10
+-dxyf5qNOAoc5igU8Ax6ex7lVgV2BFdB9FooD63hCpRy/4TYpKKksam4eg7h3Wkx9
+-dCagcTvD4vtRiadzZXzUQ0kLjCmsFKFpPk9YOcq2y3k2oDNAgykeCCZOYKCrfJ/M
+-TZGtDF47rL8d1M+pSTTqMbF8BvWyZ3hTKkB4dNbF4uNQ5EPD8fgkmPOMR9Ul5R3X
+-XvrzDWYJb0+qElbtP4Y570KQTmbBpTj2soFb2fLuPv4NpBTNx3xIja4fs7wYP46M
+-k1dI+wQnrC512rpacowOtWKlqx3yBrtKNjg39faPHQQpfPqkJNYZZPVA9rc255SG
+-l4B7y4ECgYEA1v+8z4r+lkrX/t0L2WmuHHjE6no+1c3C4RdHkkUYvgUWdE7fjRGH
+-fpcfZu/aTcnTj+LAkZpEty8gDZKqb8tpliMbpnkzx7Li4AYQof5QYcWQb9rJYihT
+-70fJgLN2QQCAD7VC00AuUam7D8r4o4uImmrOxa5jqZFHztphKXMU4p8CgYEAwkoc
+-vZ/LRcbiKm72/CJ8RI9YgkQanFye/6cYwsVyrydmaevxdCq68hcafPSHwJSraEK9
+-zo2T6qaZZr1zdwdSFutsBfOw6g7MMPfxtUPtmHJnwoFsEBSjwSwddwi/RLXiZGUK
+-I31z1sRO4XoLzhvESZZP9aCURT3MSwqFTWsasJkCgYEApyKpoeHYpfdK0FsAciRA
+-cOvFkM41eLn7LEaPofrLEDUeTo5eJOkinttWUwxUdbJXH/zTXJ1Dm/Arh8Gjc0L7
+-MvbZ8OE5yp2a1zJ/zZ7I2CjgbsPzV7YoAdSZpc5dOIzuAMgVSeoT1/INdGqCPYkk
+-SX6MfYpi+Zfx7bFAZRuMedsCgYA2Qrp6HumHSD8buLfTvNHV1+7RGrIP3zIslf8t
+-TjV0Q12v0UwytEhXmio0oZpUJ3Ejghg+Wn3n97U540kfAfVkH0Wg9+j9xTozpttj
+-U2BExhbCVKDYcNs29NoZx2CbkOx0O1+0f7HdVh/tisdHPav5HTihkcI3AEZQ4tRN
+-xc7DaQKBgFtj7G/nbhU1Rr1d7HJk8to88zHvUPPWI8AaqyQKDKD2nOSAysA0v9h6
+-z7FG0SidXeCZF8NnlxRcR6+Zf/oDgx/akKGXGGGifgAIjkq53CQewNyg8iQda0cF
+-3wU8z+qAajPnhXEZ7T/OO1pRUUQRvM1obOLVORTzP+ZTD9/RZu4F
++MIIEogIBAAKCAQEAxZ0Nt+SANz6B1NevcV8DuKi9m5/j4/Clc5eqS5TkYjZ71SYj
++V2j0Cy7PtdDXcUZSUMdg8dTww9zbxS0GQUg2lUltbbkOnWcWgLp0COCPjunld1sH
++I+rZcMaLlG9qdVSxvKmzBjavaur+Eb3O1tA7gZLjV9kJtDjUDN5Eur8HH9BdpjNk
++f+vv5VnGfrFplYcsGYOXdTYUlgrbDfxidHIBlebEaD47acHzLxcWrdlmDdGhLZ5e
++ir3reaRyeZwAQESO11pIN3sp0aS6IYcIPaRdA+saYNBuQCRr4j7EauGPdxwX+Rho
++J3Yg09vz1Rj/jesvl3grU7Hk9oeG5JjPUDEYQwIDAQABAoIBAAdVbZxnp6slL+FL
++wzA5vqQcPbPS/7ybrNrjg9zmi4E/lLc+K+1DBlzh4bCALcv/jZoqLrqwKeKYRYmw
++Quf/pj2Xv4QPwZntfk7MXKELCxjaglBnJEEyJoatFPdZw9bTNqi8mC8WBCA7f1lT
++iiO7ukbz7L77stn+3+kTA0mg7EKYbWTO3UVk14Yhp5jPEvPLOUHrnu9i6VfaW8+Q
++DaYgdw/D+bgIC4E8/zMPuXS/WyZBmqk64uA156OrMMIKYXCN0CV/HpOWIKDd6uEt
++1o0Zv9cvHGU2gM4amicrlsVPAtC6vyW43xphetQVK0yzb69qJ3BYfZComScCSl78
++xYIr2MECgYEAykpIlEVNhjEfjqQn7yKhwP160exPRaLFI6EN4S6gUY+n5K4JvxLV
++9XG8ahachAi9b8jcRJfr0ld1tpZfshQeOAjOEm6H7sRO95i6j9lRDIymgqsYPeAs
++HzniU93F26bW3FW+uxohG+ozXOxNxzh+9GbWm7v/JKcFbPWO6W9O6YMCgYEA+hTl
++GowuJgb5kSZNpdz+QN6B5r4E9SXclWsoF8CSE1yarSI0iNXOxYtdmhqQfAhVKX/S
++UTKcgOz53jq5SAWZd86bf+YIK+nS5pwFJNe5eK5Acbakc5rIXQgH4+erOS6/qJlL
++3uq2M3bgkB3RaDSrheL6KSUymr2PLucunXxlmkECgYAod0+piWuGqpD7gc8TQURG
++TO6iy7jX30W8aN1T7HXZmvkk/8OnW2c9oDDmr/tDVlQ+5llZx2I/Q4uiqNYf03Jw
++FyLSARZkJxT85qp7WCekcQZmIT/KMOvimzuxNy37UJauoOB0oTd6VBFOR18PuTd8
++QI4xvRu/A0JMl5qtC70nbQKBgEyVtYupvkA7Bpai6kiPIvXurk1hh9cjXygLBt4v
++RQzU4TGANiJph8cLZQDafcDeNGZfFKN1ImSBLgwWY8Ngo50DEq/aXEpGcyXYReMA
++hXYltuqcCkS09AM5gGEVA2ShomQZfhioPGAKWb8IwqZs6tI3rnCHSbYFsyGj/qyP
+++fWBAoGAdXbQ70PKP2BZdjc45JnXZ//RAV2bNHOGH7FWpDna4TzLV0j/XgglBFGI
+++Nos1KXkgVkAg8GS8reKylDW0hogtRnQfwF0QWt+1A6G8YBYY2rgj41D2xADHAmW
++lKQpYW83b4WVUsNMVhXItsZbi63ASaHWPnrmFCNKmxK5Q2DYiDM=
+ -----END RSA PRIVATE KEY-----
+diff --git a/examples/puma/client-certs/client_unknown.crt b/examples/puma/client-certs/client_unknown.crt
+index 8cdfc87bb9..35aee5fe6c 100644
+--- a/examples/puma/client-certs/client_unknown.crt
++++ b/examples/puma/client-certs/client_unknown.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBTCCAe2gAwIBAgIBEzANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTIw
+-MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
++MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowPzETMBEGCgmSJomT8ixkARkWA25l
+ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIw
+-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKQo9ve3XI5fiKE5AKI3Qm7aeGwy
+-uIR5RBo58Na4saBSfCaKZvNwzuEimKN6S4ShUlV0egKwCs/KvzbhQJpIxVsLQCGs
+-AQDxdOGP1FyizQvzDhzL7BC2I/Dp3A5V6uXkxo1qTqoBdTYeJ/mdIVgZ7bgTnUdu
+-uY9KErU/ugR8MbqZyQel/04PSmkCTdhzP41w0xvmc7Jgab0vJ0oXU4knXIyKsLeq
+-BkL6fevPW4fdaU+ppXBvpsgWfACk/WZs+DyhPndcX7JNrcnYIIAJy75wivqw2RDB
+-m59XNhoDwbR21EkcZnlQL59pv4ASA7DrJs+tFoGqsCs7DyEioePNp6ZraSkCAwEA
+-AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQBMbPmIekCi
+-TMLtclXtkhKUefb9hoALhABwRbTbzPjz+MGJX2BMwLt8bAs6AMY8jEazvfm9+G0m
+-1liBAGWFojSzAykNIq/zAG2tgDVolQp3x4JcyFDJ0cuR8DIdll2CCnLM2jP8Nek8
+-wSyuWDsm1U5kmos/dP/ialCvvCLHULoSCBhsyBFKmH2ViXdW09Wg4jSQ4RIToBBn
+-w/VbObeKA8NBUW6/7w6MS1oeFL3PlZJ205zVrZ68nqm/ckYyaBAdlQNTmlThNSQ5
+-eL7w2QgfYDM72Sk4/rjZsW0kH+V0ZqmIuyVBE6jo5EulGPLo2eQEfPmhEdbo5rFi
+-foV+QKM8z3K0
++DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL8T32Ccdy9cqrIzBxQwpctfg3tq
++UACte2mIMahjwNCLLeH31XwjeiOvcoHTtCJdDmpWC5Dmw/1KhzHqlXBgdDxjtwdU
++8YTZyhd1veOTxzl0CSCMz6G+9Q5awB9lc8qX86cYpa/K2A5mUjHwFeHu+S6XPSVE
++MPOw1UIeQXg2l9XMpqLDPqCUXjFeedvlbT6o3adSsY0zEA5jXPb5OlX/HnrTH53M
++HrZ7xlQ4hC6WA0x7/ZD1HFW2kudypuRQyn0M5tQUnr/fzfuZjI0JJ5PdRXHKkbOE
++085EWXRoG8NEqrw9Z+vtmDLwQ5x6vuZ7d2mCRgEsWThd2wneQODCRNd6Nq8CAwEA
++AaMSMBAwDgYDVR0PAQH/BAQDAgSwMA0GCSqGSIb3DQEBCwUAA4IBAQAie8hC6sra
++yuXtn1MSVXORfcL5GbA9c3Q4nNYU5Wj9ok/UhDE65sphZ/wR/bIPMUJx2jGuvzPQ
++ljRVZrL36FcDugl1V9J+fyQPvUE1A4SBa4EwohfdqFhp5tu2oQxjIvpqOJUhkeTZ
++MdRrlQHJTbFnxx4glcnAdhm55MvSe5ZXWNMPkBniRVyenXnkzn931An6s3xWz129
++JHRPbGW8d/9adrnX8VRAxOKkX9XHuVmfF8PHxCK6IVZyfgJRUxl7w/gAIPlfh65b
++K5UmxFhkMVQKN1a0YFHx2bFwvI6yEl5w7osVnpTcp7GKxc37GYnWbFD+XBLMAYB2
++Zy+0Aoo1DPP0
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/client_unknown.key b/examples/puma/client-certs/client_unknown.key
+index 96b41acf9e..0fe340ba30 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/server.crt b/examples/puma/client-certs/server.crt
+index 5c3c334edd..eb222dd12b 100644
+--- a/examples/puma/client-certs/server.crt
++++ b/examples/puma/client-certs/server.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDBDCCAeygAwIBAgIBBzANBgkqhkiG9w0BAQsFADA4MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjAw
+-ODAxMDAwMDAwWhcNMjQwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTELMAkGA1UEAwwCQ0EwHhcNMjQw
++ODAxMDAwMDAwWhcNMjgwODAxMDAwMDAwWjA/MRMwEQYKCZImiZPyLGQBGRYDbmV0
+ MRQwEgYKCZImiZPyLGQBGRYEcHVtYTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjAN
+-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXOg3gTrGJfVft9cSrfGRnEZezDB
+-L93fcLwJAoaXGxbEg1RW/fOrSpSNemuqOvbzczV7m5eYTf1lHPBJsndbYyijIR1+
+-Fp4tjFDp76SC3hxCIc3uYXIz0qQwSOAi1z15zobS4xF29jlsXWtfBl9fivjzdj/f
+-pbZ+JPYOrlcJAf6Xmr3xh//13rOI0ytBMlWf51z/iAZBLm2wvbt+nR7B6koAdTgM
+-Coe+gOtcLWYY5ApJ4qB9knGdxWoF5p7guHHw2aGTM0jyhgBowfVkFRiE2JUmODae
+-g+dHsd8ogWbqhGyZTredJF/NRrLKU0h+t7ldKHvXEZy4qyqQlvKoTpODqQIDAQAB
+-oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAI/bcQP4Hu9O
+-OtaaIjVxN8+9jXUOrMpSogmZ4bRKImispt9SA+sbxec7iOMM2pG3Py2yi0hWGzii
+-hSebWIsM1JuPj7ks9l8nGRxpGeInJwTkJorG4ZLEypoS2wW3fQZGx3o4da5V+U2Z
+-HEY0wQTbPBqqnyeZ16ZFNVCzw8y9l7y7CEFjvUO3sq0pne9r7Z+XVgjGyBdBYkJS
+-0kcqPBXFCMHrWH5UlacYlM5cqgoVztOp2STGmR3XR7a34oueeA10QSP+jzeYvWA1
+-wTYA762uU2ReCdujfNbf8V1tZWAH36KldM3hhDNWeveAGxxj1h2R9T/k2kHl/a7D
+-I3VdS59vjJY=
++BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyRkU1+VG6T2kAEDtJ0jz8jXH84hF
++g/qTy6PqrSIimARWDso5n9F7tsuVCIGH/Sr+sLI1u6p2ceYCv2UxP0WriO00AN+6
++0qHM4jtj2pvAOFcTWVmsk7VL+2k8mmP4VmxRbi7+qLh4b5iv7J3ySmlgEQ6NLT8M
++CpIxc9XRH85HW88ztaii5CsMqBC5Usc3SXqmrN7SC6P3eUjMvWk5WC1eDmWbm2Bj
++djLPJOGuAf/auWf7ElQ1wIkcBYAZPm5dr/km8wppevgX5swri86ISYgKHx5Uq2l0
++dzjylJDxhTRPz7+zaqf2aiMrvJZnrwbTXW4WXNWW2yIx2wHXlH+ZYDUp9wIDAQAB
++oxIwEDAOBgNVHQ8BAf8EBAMCBLAwDQYJKoZIhvcNAQELBQADggEBAF+1r5JAnGRA
++z6wWGwERvh5fdYEfQix8Vqj0s7oIHJXd6N2JyF7EKO5mgtAzOo/V4huIn10fUrWf
++gn5Pbu9l8tZyj3Rz3jvPTW0RD3QbtlmC/el9MG88/MD2uAk8EjGRVeDEoTLBZIsR
++adxOyuitCFa9HT+HCxfhPU/UTOpwtzC0pGh2AcdY9Y7SYGn7W/5isGyYcFbItX8m
++n9ui2lppaoIfbsBnnJgG+WZbaDM/3ZRxWUkUwMZZE17g/hxYx7O5ohtbnFP0hSix
++033vjp/VzfffM5wS9kIeQUZBi1ADWjvXzNs49iYGzZNJoDSYmrkLmvn08820VE6Y
++EfY6tKvZ9oA=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/server.key b/examples/puma/client-certs/server.key
+index 75a358ff5c..e3998f7efe 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/unknown_ca.crt b/examples/puma/client-certs/unknown_ca.crt
+index 419487f839..782a656688 100644
+--- a/examples/puma/client-certs/unknown_ca.crt
++++ b/examples/puma/client-certs/unknown_ca.crt
+@@ -1,19 +1,19 @@
+ -----BEGIN CERTIFICATE-----
+ MIIDEDCCAfigAwIBAgIBETANBgkqhkiG9w0BAQsFADA5MRMwEQYKCZImiZPyLGQB
+-GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTIw
+-MDgwMTAwMDAwMFoXDTI0MDgwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
++GRYDbmV0MRQwEgYKCZImiZPyLGQBGRYEcHVtYTEMMAoGA1UEAwwDQ0FVMB4XDTI0
++MDgwMTAwMDAwMFoXDTI4MDgwMTAwMDAwMFowOTETMBEGCgmSJomT8ixkARkWA25l
+ dDEUMBIGCgmSJomT8ixkARkWBHB1bWExDDAKBgNVBAMMA0NBVTCCASIwDQYJKoZI
+-hvcNAQEBBQADggEPADCCAQoCggEBAJXBTI7itz3JCkNRpR3Jdas/HK2+WLoy3cck
+-taH0OUHPxSEDteNCRlwR07cEWThl6QMQROHEJLCVPIjCLXmu2uwJ6SjPb7keRXJb
+-mOHWo0ZXyc0xnLIv8anWXFAlMconvtpSoYgyNUFwYQdhWTv3I9HrdqCrez70+DXy
+-q3gsTgvixwUIUm+/kWs6zfIHCtwiAusM2Xjrc9Aa/+5JTa3rsdXUXxyrakoKr2ED
+-0BrhWRmopM+xf7V42dNpwuFnrtqDfmyPKtzZbv5J8w6oq7BGC2+CL7MYo1fnonWP
+-kxRZCYzp/qtkhotHHypnpZuQh2puOwnisGykA8rSX/hltCklx5ECAwEAAaMjMCEw
++hvcNAQEBBQADggEPADCCAQoCggEBAJqExahUjGL5w22yAuI/XCu1QKap5xl4vbBj
++pU9SJI+TLKlEN5d86oLxSzBjZOB+ori7h6Pc6Act1nV0FytBn+NMrNnG/Y9U3Rad
++gwm78X+AxuxMIcM2HRFckHzbATRT9+7r37FKLSJPVFUkXd3V0zx4LaY8/Z+13Yjg
++B7E0SiCN0dQ4OF99wSOepQRbuEhtLfn5pe4OpUnoMTIMOGjAYCzx4W2qPQLwaYJy
++x1qiAMuDgoAqSbrUWwhPh3h84OOnIriN60xQoi5hUjlDenysKB8cEClf0lR5G9Az
++oTFSIRiLQVFScuNo6KOJpE2eV3dlon4ZSAy6cTWyoKwboYtTY5UCAwEAAaMjMCEw
+ DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQAD
+-ggEBAFH23fStJpmaYUwqIhuWfId4a75eJvp5zpedU4e9Adl+a87u+iNrppa34fPs
+-Ni1XhrGYbh4gTSRmy39R1JW3O5LUDJ6LlDkZOgduiMyLvVksmD70MPuyaBrPmIWE
+-mauOzk3TtvKI4+wBEzLAdYUhliAtMyRJaUN5Bbe+q3P9tL7Hsh9uKusJ5jyMetI7
+-8lLZqKHvE4MDV3AqS6OLLlTC1WdTKR9fqdHYwyh8+DFMBm7PuZjFP9tjDiQwhfEX
+-zbj9J8ba94BA8jmh3Z8a/S0rzcF33KPn+DWyrnyLWWSWKTLHN9TpVHRlhQ4OEOYZ
+-LVu0+VBx8eIwdLZplDfQ9sGUjCs=
++ggEBABiF3rt8D2ylEVaSoeqeM/b+RGfRKEOBeGSNd+W1IY1w4Yf/t2jYibg5Aq/u
++9Z8HToevJVRIzAXci3KwHQGB0Qtw/YVtlaYHlbzHZyazcEU1oYKPThltInwuaXOJ
++WcEOVTOPDpqTcQfVP6ov0rQpVkbE/GAR/yqVnMmVa5wlvbLpuAoPddPBSQMI2vAQ
++njc9gxpaXQmfBj+WguGwUeDMuGA/LxgS14MB9Bqu1wK7rpUlsR/5THawW1ehvScc
++6YFpdL8qNW/cuo2LApqmaR63aRTirodXFYPOsbWcQGs4qsDXXqJmcm3wnezBS3NC
++iXteduNO8ov/lY6DBwd1+2r9PRc=
+ -----END CERTIFICATE-----
+diff --git a/examples/puma/client-certs/unknown_ca.key b/examples/puma/client-certs/unknown_ca.key
+index d9e3a62037..c947337287 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/patches/series b/patches/series
new file mode 100644 (file)
index 0000000..e841531
--- /dev/null
@@ -0,0 +1,13 @@
+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
+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
+0018-update-certs-from-upstream.patch
+0018-disable-test-failing-with-ruby3.2.patch
diff --git a/puma.1 b/puma.1
new file mode 100644 (file)
index 0000000..47a94c3
--- /dev/null
+++ b/puma.1
@@ -0,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).
diff --git a/puma.docs b/puma.docs
new file mode 100644 (file)
index 0000000..b43bf86
--- /dev/null
+++ b/puma.docs
@@ -0,0 +1 @@
+README.md
diff --git a/puma.examples b/puma.examples
new file mode 100644 (file)
index 0000000..e39721e
--- /dev/null
@@ -0,0 +1 @@
+examples/*
diff --git a/puma.lintian-overrides b/puma.lintian-overrides
new file mode 100644 (file)
index 0000000..e723424
--- /dev/null
@@ -0,0 +1,4 @@
+# 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/]
+repeated-path-segment lib [usr/lib/x86_64-linux-gnu/rubygems-integration/3.1.0/gems/puma-5.6.7/lib/]
diff --git a/puma.manpages b/puma.manpages
new file mode 100644 (file)
index 0000000..8c2d587
--- /dev/null
@@ -0,0 +1,2 @@
+debian/puma.1
+debian/pumactl.1
diff --git a/pumactl.1 b/pumactl.1
new file mode 100644 (file)
index 0000000..67e70d6
--- /dev/null
+++ b/pumactl.1
@@ -0,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).
diff --git a/ruby-tests.rake b/ruby-tests.rake
new file mode 100644 (file)
index 0000000..67a5a4a
--- /dev/null
@@ -0,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 --git a/rules b/rules
new file mode 100755 (executable)
index 0000000..da15652
--- /dev/null
+++ b/rules
@@ -0,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
diff --git a/salsa-ci.yml b/salsa-ci.yml
new file mode 100644 (file)
index 0000000..33c3a64
--- /dev/null
@@ -0,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
diff --git a/source/format b/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/source/lintian-overrides b/source/lintian-overrides
new file mode 100644 (file)
index 0000000..362d49e
--- /dev/null
@@ -0,0 +1,2 @@
+# no signed tarballs by upstream
+puma source: debian-watch-does-not-check-gpg-signature 
diff --git a/upstream/metadata b/upstream/metadata
new file mode 100644 (file)
index 0000000..cbe22a2
--- /dev/null
@@ -0,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 --git a/watch b/watch
new file mode 100644 (file)
index 0000000..b06856f
--- /dev/null
+++ b/watch
@@ -0,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@