Changelog for Falcon 4.4.0#

Summary#

This release contains a handful of long-requested features – a RegexConverter field converter, an application-wide error reporter, and a new allow_multiple keyword argument for the query string parameter helpers, along with a number of bug fixes. As usual, the newest CPython runtime, 3.15, is fully supported (including binary wheels).

The error reporter also serves as groundwork for the native OpenTelemetry integration that has been on our roadmap for a while. We are hoping to ship that integration as part of Falcon 4.5.

This release would not have been possible without the prototypes, fixes, and feature pull requests submitted by our community. Sincere thanks to our supporters and contributors!

Changes to Supported Platforms#

  • CPython 3.15 is now fully supported. (#2593)

New & Improved#

Fixed#

  • As prescribed by PEP 3333, WSGI servers tunnel non-ASCII characters in the request path via ISO-8859-1, and Falcon has long decoded PATH_INFO back to UTF-8. The SCRIPT_NAME variable was, however, used verbatim when populating req.root_path. This has been fixed, and the tunneled SCRIPT_NAME is now decoded in the same way as the request path. (#2667)

  • When decoding with unquote_plus=False, the cythonized variant of falcon.uri.decode() mistook a literal plus sign followed by two hexadecimal digits for a percent-encoded byte. This has been fixed, and a literal plus is now preserved just like in the pure-Python case. (#2670)

  • When a route was only served by a catch-all on_request() responder, with no HTTP methods explicitly mapped via on_get(), on_post(), etc., the default OPTIONS responder rendered an empty Allow header, misleadingly indicating that the resource allows no methods at all. The Allow header is now omitted when the list of allowed methods is empty. (#2671)

  • When a simulated ASGI request bubbled up an unhandled exception, the test client’s lifespan task was left pending, emitting a stray "Task was destroyed but it is pending!" warning upon garbage collection. Such orphaned lifespan tasks are now cancelled cleanly. (#2745)

Contributors to this Release#

Many thanks to all of our talented and stylish contributors for this release!