Change log#
To be included in the next release#
v11.1.3.dev34+g75196e333 /UNRELEASED DRAFT/#
(2025-12-08)
Bug fixes#
Fixed prompting for the encrypted private key password interactively, when the password in not set in the
private_key_password attributein thepyOpenSSL TLS adapter. Also improved the private key password to accept theCallabletype.– by @jatalahd
Related issues and pull requests on GitHub: #798.
The
cheroot.ssl.builtinSSL adapter now responds with a400 Bad Requesterror to plaintext HTTP requests on HTTPS ports by detecting them before the SSL handshake, matching the behavior ofcheroot.ssl.pyopenssl. Previously, such requests would fail during the SSL handshake without sending an HTTP response.– by @julianz-
Related issues and pull requests on GitHub: #800.
Plaintext HTTP error responses on HTTPS ports now reliably send complete messages to clients using
sendall()instead of buffered writes that may not flush before the connection closes.– by @julianz-
Related issues and pull requests on GitHub: #800.
Deprecations (removal in next major release)#
Deprecated
bind()method from theAdapterinterface and respective implementations. Previouslybind()was doing nothing in thebuiltin TLS adapterbut was being used in thepyOpenSSLAdapterto wrap the socket. Socket wrapping is now done exclusively in thewrap()method subclass implementations. A side-effect of this change is that thessl_adapterargument ofprepare_socket()is also deprecated.– by @julianz-
Related issues and pull requests on GitHub: #801.
Contributor-facing changes#
The documentation environment is now set up to use sphinx-issues for GitHub-related URL roles – by @webknjaz.
The linting is now set up to demand that
typingis always imported as a module under the name of_t– by @webknjaz.This is enforced by @sirosen’s flake8-typing-as-t plugin for flake8.
Related commits on GitHub: @7676d50.
Read the Docs is now configured to build the documentation using
tox, same as the CI – by @webknjaz.Related commits on GitHub: @d489f7f.
Released versions#
v11.1.2#
(2025-11-07)
Bug fixes#
The “service unavailable” thread is now turn down properly when the server is shut down – by @itamarst.
This fixes a regression in Cheroot originally introduced in v11.0.0 that would manifest itself under Python 3.12 and older. In certain conditions like under CherryPy, it would also lead to hangs on tear-down.
v11.1.1#
(2025-11-03)
Packaging updates and notes for downstreams#
v11.1.0#
(2025-11-03)
Features#
Contributor-facing changes#
Added missing
__all__andIS_WINDOWSdefinitions to.pyistub files for mypy.– by @julianz-
Related issues and pull requests on GitHub: #774.
Made
test_http_over_https_errorcompatible with Solaris – by @mtelka.Related issues and pull requests on GitHub: #776.
Increased timeout values
test_client.server_instance.timeoutandhttp_request_timeoutto make related tests more stable.Related issues and pull requests on GitHub: #777.
v11.0.0#
(2025-09-21)
Features#
Removals and backward incompatible breaking changes#
Packaging updates and notes for downstreams#
Declared Python 3.12 and Python 3.13 as supported officially – by @webknjaz.
Related issues and pull requests on GitHub: #696.
Related commits on GitHub: @5db4f63.
The minimum version of the
setuptools-scmbuild dependency has been set to 7. The Git archives are now produced by it natively, instead of relying on a third party plugin which is no longer being used.– by @serhii73
Related issues and pull requests on GitHub: #628.
The packaging metadata has been migrated to the
pyproject.toml-based PEP 621 declaration – by @jaraco and @webknjaz.As a part of this update, the minimum version of the
setuptoolsbuild backend was bumped to 61.2. Moreover, any compatibility shims that existed insetup.cfgandsetup.pyhave been removed for good.Related issues and pull requests on GitHub: #690.
Contributor-facing changes#
The test infrastructure has been updated to stop using the
pytest-forkedplugin – by @jaraco and @webknjaz.This plugin was causing problems with upgrading to modern versions of Pytest and it is not going to be fixed anytime soon.
It was used in a test that interacts with the system resource limits under *NIX environments in hopes to isolate the side effects caused by the preparatory code.
It is possible that this will have an effect on the test sessions and we may have to look for alternative solutions for test process isolation.
Related issues and pull requests on GitHub: #502, #511, #680, #681, #703.
The test infrastructure has been updated to start using the upstream reusable workflow
reusable-tox.ymlfrom https://github.com/tox-dev/workflow – by @webknjaz.This chance allows us to de-duplicate the commonly used CI shape.
Related issues and pull requests on GitHub: #743.
v10.0.1#
(2024-04-22)
Bug fixes#
Fixed a flaw where internally unhandled exceptions could crash the worker threads and eventually starve the server of its processing resources. It is no longer and issue and the unhandled errors are now logged and suppressed except for a few expected exceptions that are used for normal interruption requests.
– by @cameronbrunner and @webknjaz
Related issues and pull requests on GitHub: #310, #346, #354, #358, #365, #375, #599, #641, #649.
Fixed compatibility with Python 3.8 in the built-in TLS adapter that relies on
ssl.Modern Python versions communicate specialized exceptions
ssl.SSLEOFErrorandssl.SSLZeroReturnErrorwhere the older versions errored out in a very generic way.
Packaging updates and notes for downstreams#
Started signing the package distribution artifacts in CI/CD with Sigstore and uploading them to GitHub Releases – by @webknjaz.
The change log management is now implemented through the Towncrier tool – by @webknjaz.
The contributors are now expected to include change log fragment files in their pull requests.
These news snippets can link one or more issues or pull requests, and be of one or more of the following categories:
bugfix: A bug fix for something we deemed an improper undesired behavior that got corrected in the release to match pre-agreed expectations.feature: A new behavior, public APIs. That sort of stuff.deprecation: A declaration of future API removals and breaking changes in behavior.breaking: When something public gets removed in a breaking way. Could be deprecated in an earlier release.doc: Notable updates to the documentation structure or build process.packaging: Notes for downstreams about unobvious side effects and tooling. Changes in the test invocation considerations and runtime assumptions.contrib: Stuff that affects the contributor experience. e.g. Running tests, building the docs, setting up the development environment.misc: Changes that are hard to assign to any of the above categories.
Related issues and pull requests on GitHub: #654.
Contributor-facing changes#
Started type-checking the project with MyPy against a range of versions instead of just one — Python 3.8–3.12 – by @webknjaz.
The project how has a
.git-blame-ignore-revsletting GitHub know which auto-formatting revisions to ignore. It is also possible to integrate it locally, if one wants to do so.– by @webknjaz
The project adopted the
autopep8tool to assist with automatic code formatting. It is chosen overblackbecause it is less intrusive which is important to the maintainer as it promotes inclusivity.autopep8is integrated into thepre-commitcheck runner and is configured to only correct PEP 8 violations, avoiding changes to compliant snippets.– by @webknjaz
Related commits on GitHub: @65ba7e6.
The continuous integration and pull request merges have been set up to only merge pull requests through merge queues – by @webknjaz.
Related commits on GitHub: @a7149e0.
Documented the upgraded release process – by @webknjaz.
Related commits on GitHub: @df0d1a0.
The change log management is now implemented through the Towncrier tool – by @webknjaz.
The contributors are now expected to include change log fragment files in their pull requests.
These news snippets can link one or more issues or pull requests, and be of one or more of the following categories:
bugfix: A bug fix for something we deemed an improper undesired behavior that got corrected in the release to match pre-agreed expectations.feature: A new behavior, public APIs. That sort of stuff.deprecation: A declaration of future API removals and breaking changes in behavior.breaking: When something public gets removed in a breaking way. Could be deprecated in an earlier release.doc: Notable updates to the documentation structure or build process.packaging: Notes for downstreams about unobvious side effects and tooling. Changes in the test invocation considerations and runtime assumptions.contrib: Stuff that affects the contributor experience. e.g. Running tests, building the docs, setting up the development environment.misc: Changes that are hard to assign to any of the above categories.
Related issues and pull requests on GitHub: #654.
v10.0.0#
(2023-05-20)
v9.0.0#
(2022-11-19)
#252 via #339: Cheroot now requires Python 3.6 or later. Python 3.5 and Python 2.7 are still supported by the maint/8.x branch and stabilizing bugfixes will be accepted to that branch.
v8.6.0#
(2022-01-03)
Significant improvements:
#384 via #385, #406: Exposed type stubs with annotations for public API – by @kasium.
#401 (related to the #352 effort): Started reusing the the
expriration_intervalsetting as timeout in the low-levelselect()invocation, effectively reducing the system load when idle, that is noticeable on low-end hardware systems. On Windows OS, due to differentselect()behavior, the effect is less significant and comes with a theoretically decreased performance on quickly repeating requests, which has however found to be not significant in real world scenarios. – by @MichaIng.
Internal changes:
Implemented a manual-trigger-based release workflow.
Integrated publishing GitHub Releases into the workflow.
Migrated the docs theme to Furo (created by @pradyunsg).
Attempted to improve the stability of testing.
Configured the CI to test the same distribution as will be shipped.
Improved the linting setup and contributor checklists.
Stopped running tests under Ubuntu 16.04.
Tweaked the distribution packages metadata to satisfy strict checks.
Implemented distribution build reproducibility using a pip constraints lock-file.
Added per-environment lock-files into the tox test environments.
v8.5.2#
(2021-01-18)
#358 via #359: Fixed a regression from #199 that made the worker threads exit on invalid connection attempts and could make the whole server unresponsive once there was no workers left. – by @cameronbrunner.
v8.5.1#
(2020-12-12)
cherrypy/cherrypy#1873 via #340: Resurrected an unintentionally removed feature of interrupting a server main thread by externally assigning an exception to the
HTTPServer.interruptproperty – by @liamstask.#350: Fixed the incarnation of an earlier regression of not resetting the serving state on
SIGINToriginally fixed by #322 and #331 but reintroduced by the changes in #311 – by @liamstask.
v8.5.0#
(2020-12-05)
#305 via #311: In
ConnectionManager, process connections as they become active rather than waiting for atickevent, addressing performance degradation introduced in v8.1.0 – by @liamstask.#341 via #342: Suppress legitimate OS errors expected on shutdown – by @webknjaz.
v8.4.8#
(2020-11-24)
#317 via #337: Fixed a regression in 8.4.5 where the connections dictionary would change size during iteration, leading to a
RuntimeErrorraised in the logs – by @liamstask.
v8.4.7#
(2020-11-15)
v8.4.6#
(2020-11-15)
v8.4.5#
(2020-08-24)
#312 via #313: Fixed a regression introduced in the earlier refactoring in v8.4.4 via #309 that caused the connection manager to modify the selector map while looping over it – by @liamstask.
#312 via #316: Added a regression test for the error handling in
get_conn()to ensure more stability – by @cyraxjoe.
v8.4.4#
(2020-08-12)
#304 via #309: Refactored
ConnectionManagerto useget_map()and reorganized the readable connection tracking – by @liamstask.#304 via #309: Fixed the server shutdown sequence to avoid race condition resulting in accepting new connections while it is being terminated – by @liamstask.
v8.4.3#
(2020-08-12)
#282: Fixed a race condition happening when an HTTP client attempts to reuse a persistent HTTP connection after it’s been discarded on the server in
HTTPRequestbut no TCP FIN packet has been received yet over the wire – by @meaksh.This change populates the
Keep-Aliveheader exposing the timeout value for persistent HTTP/1.1 connections which helps mitigate such race conditions by letting the client know not to reuse the connection after that time interval.
v8.4.2#
(2020-07-28)
v8.4.1#
(2020-07-26)
Prevent
ConnectionAbortedErrortraceback from being printed out to the terminal output during the app start-up on Windows when built-in TLS adapter is used (#302 via #306) - by @mxii-ca.
v8.4.0#
(2020-07-23)
Converted management from low-level
select()to high-levelselectors(#249 via #301) - by @tommilligan.This change also introduces a conditional dependency on
selectors2as a fall-back for legacy Python interpreters.
v8.3.1#
(2020-07-13)
v8.3.0#
(2020-02-09)
cherrypy/cherrypy#910 via #243: Provide TLS-related details via WSGI environment interface.
#248: Fix parsing of the
--bindCLI option for abstract UNIX sockets.
v8.2.1#
(2019-10-17)
cherrypy/cherrypy#1818: Restore support for
Nonedefault argument toWebCase.getPage().
v8.2.0#
(2019-10-14)
Deprecated use of negative timeouts as alias for infinite timeouts in
ThreadPool.stop.cherrypy/cherrypy#1662 via #74: For OPTION requests, bypass URI as path if it does not appear absolute.
v8.1.0#
(2019-10-09)
v8.0.0#
(2019-10-09)
v7.0.0#
(2019-09-26)
#224: Refactored “open URL” behavior in
webtestto rely on retry_call. Callers can no longer passraise_subclsorssl_contextpositionally, but must pass them as keyword arguments.
v6.6.0#
(2019-09-25)
Revisit #85 under #221. Now
backports.functools_lru_cacheis only required on Python 3.2 and earlier.cherrypy/cherrypy#1206 via #204: Fix race condition in threadpool shrink code.
v6.5.8#
(2019-09-05)
v6.5.7#
(2019-09-03)
#198 via @9f7affe: Fix race condition when toggling stats counting in the middle of request processing.
Improve post Python 3.9 compatibility checks.
Fix support of abstract namespace sockets.
v6.5.6#
(2019-08-19)
v6.5.5#
(2019-04-25)
#99 via #186: Sockets now collect statistics (bytes read and written) on Python 3 same as Python 2.
cherrypy/cherrypy#1618 via #180: Ignore OpenSSL’s 1.1+
Error 0under any Python while wrapping a socket.
v6.5.4#
(2019-01-01)
#113: Fix
cheroot.ssl.pyopensslunder Python 3.#154 via #159: Remove custom license field from dist metadata.
#95: Fully integrate
trustmeinto all TLS tests. Also remove all hardcoded TLS certificates.Fix invalid input processing in
cheroot._compat.extract_bytes().Fix returning error explanation over plain HTTP for PyOpenSSL.
Add a fallback for
os.lchmod()where it’s missing.Avoid traceback for invalid client cert with builtin
ssladapter.Avoid deprecation warning with
OpenSSL.SSL.Connection.Fix socket wrapper in PyOpenSSL adapter.
Improve tests coverage:
Client TLS certificate tests
PEERCREDSlookup
v6.5.3#
(2018-12-20)
#149: Make
SCRIPT_NAMEoptional per PEP 333.
v6.5.2#
(2018-09-03)
#6 via #109: Fix import of
cheroot.ssl.pyopensslby refactoring and separatingcheroot.makefile’s stream wrappers.#95 via #109: Add initial tests for SSL layer with use of
trustme
v6.5.1#
(2018-09-02)
#93 via #110: Improve UNIX socket FS access mode in
cheroot.server.HTTPServer.prepare()on a file socket when starting to listen to it.
v6.5.0#
(2018-08-29)
cherrypy/cherrypy#1001 via #52 and #108: Add support for validating client certificates.
v6.4.0#
(2018-08-01)
#68 via #98: Factor out parts of
cheroot.server.HTTPServer.start()intoprepare()andserve()
v6.3.3#
(2018-07-10)
Fix bug with returning empty result in
cheroot.ssl.builtin.BuiltinSSLAdapter.wrap()
v6.3.2#
(2018-06-16)
v6.3.1#
(2018-05-21)
cherrypy/cherrypy#1618: Ignore OpenSSL’s 1.1+
Error 0under Python 2 while wrapping a socket.
v6.3.0#
(2018-05-17)
#87: Add
cherootcommand and runpy launcher to launch a WSGI app from the command-line.
v6.2.4#
(2018-04-19)
Fix missing
resolve_peer_credsargument incheroot.wsgi.Serverbeing bypassed intocheroot.server.HTTPServer.#85: Revert conditional dependencies. System packagers should honor the dependencies as declared by cheroot, which are defined intentionally.
v6.2.3#
(2018-04-14)
#85: Skip installing dependencies from backports namespace under Python 3.
v6.2.2#
(2018-04-14)
#84 (cherrypy/cherrypy#1704): Fix regression, causing
ModuleNotFoundErrorundercygwin.
v6.2.1#
(2018-04-10)
#83: Fix regression, caused by inverted check for Windows OS.
Add more URLs to distribution metadata
v6.2.0#
(2018-04-10)
#37: Implement PEERCRED lookup over UNIX-socket HTTP connection.
Discover connected process’ PID/UID/GID
Respect server switches:
peercreds_enabledandpeercreds_resolve_enabledget_peer_credsandresolve_peer_credsmethods on connectionpeer_pid,peer_uid,peer_gid,peer_userandpeer_groupproperties on connectionX_REMOTE_PID,X_REMOTE_UID,X_REMOTE_GID,X_REMOTE_USER(REMOTE_USER) andX_REMOTE_GROUPWSGI environment variables when enabled and supportedPer-connection caching to reduce lookup cost
v6.1.2#
(2018-04-08)
#81: Fix regression introduced by #80.
Restore
storing bound socketin Windows broken by use ofsocket.AF_UNIX
v6.1.1#
(2018-04-07)
#80: Fix regression introduced by @68a5769.
Get back support for
socket.AF_UNIXin stored bound address incheroot.server.HTTPServer.bind_addr
v6.1.0#
(2018-04-05)
#67: Refactor test suite to completely rely on pytest.
Integrate
pytest-testmonandpytest-watchStabilize testing
cherrypy/cherrypy#1664 via #66: Implement input termination flag support as suggested by @mitsuhiko in his wsgi.input_terminated Proposal.
#73: Fix SSL error bypassing.
#77 via #78: Fix WSGI documentation example to support Python 3.
#76: Send correct conditional HTTP error in helper function.
cherrypy/cherrypy#1404 via #75: Fix headers being unsent before request closed. Now we double check that they’ve been sent.
Minor docs improvements.
Minor refactoring.
v6.0.0#
(2017-12-04)
Drop support for Python 2.6, 3.1, 3.2, and 3.3.
Also drop built-in SSL support for Python 2.7 earlier than 2.7.9.
v5.11.0#
(2017-12-04)
cherrypy/cherrypy#1621: To support
webtestapplications that feed absolute URIs togetPage()but expect the scheme/host/port to be ignored (as cheroot 5.8 and earlier did), provide astrip_netlochelper and recipe for calling it in a subclass.
v5.10.0#
(2017-11-23)
Minor refactorings of
cheroot/server.pyto reduce redundancy of behavior.Delinting with fewer exceptions.
Restored license to BSD.
v5.9.2#
(2017-11-23)
#61: Re-release without spurious files in the distribution.
v5.9.1#
(2017-11-17)
#58: Reverted encoding behavior in wsgi module to correct regression in CherryPy tests.
v5.9.0#
(2017-11-16)
cherrypy/cherrypy#1088 and #53: Avoid using
SO_REUSEADDRon Windows where it has different semantics.cheroot.tests.webtestadopts the one method that was unique in CherryPy, now superseding the implementation there.Substantial cleanup around compatibility functions (
_compatmodule).License unintentionally changed to MIT. BSD still declared and intended.
v5.8.3#
(2017-08-11)
Improve HTTP request line validation:
Improve HTTP version parsing
Fix HTTP CONNECT method processing:
Respond with
405 Method Not Allowedifproxy_mode is FalseValidate that request-target is in authority-form
Improve tests in
test.test_core#44: Fix EPROTOTYPE @ Mac OS
v5.8.2#
(2017-08-07)
Fix #39 regression. Add HTTP request line check: absolute URI path must start with a forward slash (“/”).
v5.8.1#
(2017-08-05)
CI improvements:
Add basic working Circle CI v2 config
Fix URI encoding bug introduced in #39
Improve
cheroot.test.helper.Controllerto properly match Unicode
v5.8.0#
(2017-08-01)
CI improvements:
Switch to native PyPy support in Travis CI
Take into account PEP 257 compliant modules
Build wheel in AppVeyor and store it as an artifact
Improve urllib support in
cheroot._compat
v5.7.0#
(2017-06-24)
CI improvements:
Don’t run tests during deploy stage
Use VM based build job environments only for
pyenvenvironmentsOpt-in for beta trusty image @ Travis CI
Be verbose when running tests (show test names)
Show
xfail/skip details during test run
#34: Fix
_handle_no_sslerror handler calls#21: Fix
test_conntests:Improve setup_server def in HTTP connection tests
Fix HTTP streaming tests
Fix HTTP/1.1 pipelining test under Python 3
Fix
test_readall_or_closetestFix
test_No_Message_BodyClarify
test_598fail reason
#36: Add GitHub templates for PR, issue && contributing
#27: Default HTTP Server header to Cheroot version str
Cleanup
_compatfunctions from server module
v5.6.0#
(2017-06-20)
Fix all PEP 257 related errors in all non-test modules.
cheroot/test/*folder is only one left allowed to fail with this linter.cherrypy/cherrypy#1602 and #30: Optimize chunked body reader loop by returning empty data is the size is 0.
cherrypy/cherrypy#1486: Reset buffer if the body size is unknown.
cherrypy/cherrypy#1131: Add missing size hint to
SizeCheckWrapper.
v5.5.2#
(2017-06-18)
#32: Ignore
"unknown error"and"https proxy request"SSL errors.Ref: sabnzbd/sabnzbd#820
Ref: sabnzbd/sabnzbd#860
v5.5.1#
(2017-06-18)
Make AppVeyor list separate tests in corresponding tab.
#29: Configure Travis CI build stages.
Prioritize tests by stages.
Move deploy stage to be run very last after all other stages finish.
#31: Ignore “Protocol wrong type for socket” (
EPROTOTYPE) @ OSX for non-blocking sockets.This was originally fixed for regular sockets in cherrypy/cherrypy#1392.
Ref: https://forums.sabnzbd.org/viewtopic.php?f=2&t=22728&p=112251
v5.5.0#
(2017-05-02)
#17 via #25: Instead of a read_headers function, cheroot now supplies a
HeaderReaderclass to perform the same function.Any
HTTPRequestobject may override the header_reader attribute to customize the handling of incoming headers.The server module also presents a provisional implementation of a
DropUnderscoreHeaderReaderthat will exclude any headers containing an underscore. It remains an exercise for the implementer to demonstrate how this functionality might be employed in a server such as CherryPy.#26: Configured TravisCI to run tests under OS X.
v5.4.0#
(2017-03-19)
#22: Add “ciphers” parameter to SSLAdapter.
v5.3.0#
(2017-03-12)
#8: Updated style to better conform to PEP 8.
Refreshed project with jaraco skeleton.
Docs now built and deployed at RTD.
v5.2.0#
(2017-03-02)
v5.1.0#
(2017-01-22)
Removed the WSGI prefix from classes in
cheroot.wsgi. Kept aliases for compatibility.#1: Corrected docstrings in
cheroot.serverandcheroot.wsgi.#2: Fixed
ImportErrorwhen pkg_resources cannot find the cheroot distribution.
v5.0.1#
(2017-01-14)
Fix error in
parse_request_uricreated in @68a5769.
v5.0.0#
(2017-01-14)
Initial release based on cherrypy.cherrypy.wsgiserver 8.8.0.