tag:github.com,2008:https://github.com/tornadoweb/tornado/releasesRelease notes from tornado2025-08-08T18:10:29Ztag:github.com,2008:Repository/301742/v6.5.22025-08-08T18:10:29Zv6.5.2: What's new in Tornado 6.5.2<h2>Aug 8, 2025</h2>
<p>Bug fixes</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Fixed a bug that resulted in WebSocket pings not being sent at the configured interval.
- Improved logging for invalid ``Host`` headers. This was previouisly logged as an uncaught
exception with a stack trace, now it is simply a 400 response (logged as a warning in the
access log)
- Restored the ``host`` argument to ``.HTTPServerRequest``. This argument is deprecated
and will be removed in the future, but its removal with no warning in 6.5.0 was a mistake.
- Removed a debugging print statement that was left in the code.
- Improved type hints for ``gen.multi``."><pre class="notranslate"><code>
- Fixed a bug that resulted in WebSocket pings not being sent at the configured interval.
- Improved logging for invalid ``Host`` headers. This was previouisly logged as an uncaught
exception with a stack trace, now it is simply a 400 response (logged as a warning in the
access log)
- Restored the ``host`` argument to ``.HTTPServerRequest``. This argument is deprecated
and will be removed in the future, but its removal with no warning in 6.5.0 was a mistake.
- Removed a debugging print statement that was left in the code.
- Improved type hints for ``gen.multi``.
</code></pre></div>bdarnelltag:github.com,2008:Repository/301742/v6.5.12025-05-22T17:57:59Zv6.5.1: What's new in Tornado 6.5.1<h2>May 22, 2025</h2>
<p>Bug fixes</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Fixed a bug in ``multipart/form-data`` parsing that could incorrectly reject filenames containing
characters above U+00FF (i.e. most characters outside the Latin alphabet)."><pre class="notranslate"><code>
- Fixed a bug in ``multipart/form-data`` parsing that could incorrectly reject filenames containing
characters above U+00FF (i.e. most characters outside the Latin alphabet).
</code></pre></div>bdarnelltag:github.com,2008:Repository/301742/v6.5.02025-05-15T20:18:40Zv6.5.0: What's new in Tornado 6.5.0<h2>May 15, 2025</h2>
<p>Security Improvements</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Previously, malformed ``multipart-form-data`` requests could log multiple warnings and
constitute a denial-of-service attack. Now an exception is raised at the first error, so there
is only one log message per request. This fixes
`CVE-2025-47287 <https://github.com/tornadoweb/tornado/security/advisories/GHSA-7cx3-6m66-7c5m>`_.
General Changes
~~~~~~~~~~~~~~~
- Python 3.14 is now supported. Older versions of Tornado will work on Python 3.14 but may log
deprecation warnings.
- The free-threading mode of Python 3.13 is now supported on an experimental basis. Prebuilt
wheels are not yet available for this configuration, but it can be built from source.
- The minimum supported Python version is 3.9.
Deprecation Notices
~~~~~~~~~~~~~~~~~~~
- Support for ``obs-fold`` continuation lines in HTTP headers is deprecated and will be removed in
Tornado 7.0, as is the use of carriage returns without line feeds as header separators.
- The ``callback`` argument to `.websocket_connect` is deprecated and will be removed in
Tornado 7.0. Note that ``on_message_callback`` is not deprecated.
- The ``log_message`` and ``args`` attributes of `tornado.web.HTTPError` are deprecated. Use the
new ``get_message`` method instead.
Type Annotation Changes"><pre class="notranslate"><code>
- Previously, malformed ``multipart-form-data`` requests could log multiple warnings and
constitute a denial-of-service attack. Now an exception is raised at the first error, so there
is only one log message per request. This fixes
`CVE-2025-47287 <https://github.com/tornadoweb/tornado/security/advisories/GHSA-7cx3-6m66-7c5m>`_.
General Changes
~~~~~~~~~~~~~~~
- Python 3.14 is now supported. Older versions of Tornado will work on Python 3.14 but may log
deprecation warnings.
- The free-threading mode of Python 3.13 is now supported on an experimental basis. Prebuilt
wheels are not yet available for this configuration, but it can be built from source.
- The minimum supported Python version is 3.9.
Deprecation Notices
~~~~~~~~~~~~~~~~~~~
- Support for ``obs-fold`` continuation lines in HTTP headers is deprecated and will be removed in
Tornado 7.0, as is the use of carriage returns without line feeds as header separators.
- The ``callback`` argument to `.websocket_connect` is deprecated and will be removed in
Tornado 7.0. Note that ``on_message_callback`` is not deprecated.
- The ``log_message`` and ``args`` attributes of `tornado.web.HTTPError` are deprecated. Use the
new ``get_message`` method instead.
Type Annotation Changes
</code></pre></div>
<ul>
<li><code>tornado.concurrent.chain_future</code> is now typed as accepting both asyncio and concurrent Futures.</li>
<li><code>tornado.gen.multi</code> and <code>multi_future</code> now take <code>Sequences</code> and <code>Mappings</code> instead of<br>
<code>List</code> and <code>Dict</code>.</li>
<li><code>tornado.httputil.RequestStartLine</code> and <code>.ResponseStartLine</code> now have type annotations for<br>
their attributes.</li>
<li><code>.HTTPHeaders</code> now has type annotations for its elements.</li>
<li>The <code>autoescape</code> argument to <code>tornado.template.BaseLoader</code> is now marked as optional.</li>
<li><code>tornado.routing._RuleList</code> is now a <code>Sequence</code> for more flexibility.</li>
<li><code>.RequestHandler.SUPPPORTED_METHODS</code> is now typed to support overriding in a subclass.</li>
<li>Types for <code>.RequestHandler.get_body_argument</code> and <code>get_query_argument</code> are improved and now<br>
match the <code>get_argument</code> method.</li>
<li><code>.RequestHandler.get_cookie</code> now has more accurate types.</li>
<li>The return type of <code>.UIModule.render</code> may now be either <code>str</code> or <code>bytes</code>.</li>
</ul>
<p><code>tornado.httputil</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Support for ``obs-fold`` continuation lines in HTTP headers is deprecated and will be removed in
Tornado 7.0, as is the use of carriage returns without line feeds as header separators.
- Request start lines may no longer include control characters.
- Method names containing invalid characters now return error code 400 instead of 405.
- Header names are now restricted to the set of characters permitted by the RFCs.
- Control characters are no longer allowed in (incoming) header values.
- Handling of trailing whitespace in headers has been improved, especially with ``obs-fold``
continuation lines.
- The ``Host`` header is now restricted to the set of characters permitted by the RFCs. It is now an
error to send more than one ``Host`` header, or to omit a ``Host`` header for a request that is
not using HTTP/1.0.
`tornado.ioloop`
~~~~~~~~~~~~~~~~
- Fixed a bug in which `contextvars` that were set when the event loop was created were not
available inside the event loop on Windows.
`tornado.netutil`
~~~~~~~~~~~~~~~~~
- `.bind_unix_socket` now supports the Linux abstract namespace.
`tornado.platform.twisted`"><pre class="notranslate"><code>
- Support for ``obs-fold`` continuation lines in HTTP headers is deprecated and will be removed in
Tornado 7.0, as is the use of carriage returns without line feeds as header separators.
- Request start lines may no longer include control characters.
- Method names containing invalid characters now return error code 400 instead of 405.
- Header names are now restricted to the set of characters permitted by the RFCs.
- Control characters are no longer allowed in (incoming) header values.
- Handling of trailing whitespace in headers has been improved, especially with ``obs-fold``
continuation lines.
- The ``Host`` header is now restricted to the set of characters permitted by the RFCs. It is now an
error to send more than one ``Host`` header, or to omit a ``Host`` header for a request that is
not using HTTP/1.0.
`tornado.ioloop`
~~~~~~~~~~~~~~~~
- Fixed a bug in which `contextvars` that were set when the event loop was created were not
available inside the event loop on Windows.
`tornado.netutil`
~~~~~~~~~~~~~~~~~
- `.bind_unix_socket` now supports the Linux abstract namespace.
`tornado.platform.twisted`
</code></pre></div>
<ul>
<li><code>TwistedResolver</code> has been deleted. It was already deprecated and scheduled for removal<br>
in Tornado 7.0, but due to the adoption of RFC 8482 it no longer works for most<br>
domain names. This class was primarily intended to provide thread-free non-blocking<br>
DNS resolution. If that is still required, <code>tornado.platform.caresresolver</code> is the<br>
next best option, although it has its own limitations which differ from TwistedResolver,<br>
and it is also deprecated. Most users should switch to the default resolver, which uses<br>
threads.</li>
</ul>
<p><code>tornado.web</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- The set of characters allowed in (outgoing) HTTP headers now matches the RFCs. Specifically, tab
characters are now allowed and DEL is not.
- Invalid ``If-Modified-Since`` headers are now ignored instead of causing a 500 error.
- ``%`` characters in the log message of `tornado.web.HTTPError` are no longer doubled when no
additional arguments are passed. This matches the behavior of `logging.LogRecord`. A new method
``get_message`` has been added to ``HTTPError`` to allow access to the fully-substituted message;
directly accessing ``log_message`` and ``args`` is deprecated.
`tornado.websocket`"><pre class="notranslate"><code>
- The set of characters allowed in (outgoing) HTTP headers now matches the RFCs. Specifically, tab
characters are now allowed and DEL is not.
- Invalid ``If-Modified-Since`` headers are now ignored instead of causing a 500 error.
- ``%`` characters in the log message of `tornado.web.HTTPError` are no longer doubled when no
additional arguments are passed. This matches the behavior of `logging.LogRecord`. A new method
``get_message`` has been added to ``HTTPError`` to allow access to the fully-substituted message;
directly accessing ``log_message`` and ``args`` is deprecated.
`tornado.websocket`
</code></pre></div>
<ul>
<li>Some bugs involving <code>ping_interval</code> and <code>ping_timeout</code> have been fixed. Setting the<br>
<code>ping_timeout</code> greater than the <code>ping_interval</code> is no longer supported. The default<br>
<code>ping_timeout</code> is now equal to the <code>ping_interval</code>.</li>
<li>The <code>callback</code> argument to <code>websocket_connect</code> is deprecated and will be removed in<br>
Tornado 7.0. Note that <code>on_message_callback</code> is not deprecated.</li>
</ul>bdarnelltag:github.com,2008:Repository/301742/v6.5.0b12025-04-29T20:36:54Zv6.5.0b1: Merge pull request #3492 from bdarnell/relnotes-6.5<p>Prepare for release 6.5b1</p>bdarnelltag:github.com,2008:Repository/301742/v6.4.22024-11-22T02:37:18Zv6.4.2: What's new in Tornado 6.4.2<h2>Nov 21, 2024</h2>
<p>Security Improvements</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Parsing of the cookie header is now much more efficient. The older algorithm sometimes had
quadratic performance which allowed for a denial-of-service attack in which the server would spend
excessive CPU time parsing cookies and block the event loop. This change fixes CVE-2024-7592."><pre class="notranslate"><code>
- Parsing of the cookie header is now much more efficient. The older algorithm sometimes had
quadratic performance which allowed for a denial-of-service attack in which the server would spend
excessive CPU time parsing cookies and block the event loop. This change fixes CVE-2024-7592.
</code></pre></div>bdarnelltag:github.com,2008:Repository/301742/v6.4.12024-06-06T18:12:16Zv6.4.1: What's new in Tornado 6.4.1<h2>Jun 6, 2024</h2>
<p>Security Improvements</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Parsing of the ``Transfer-Encoding`` header is now stricter. Unexpected transfer-encoding values
were previously ignored and treated as the HTTP/1.0 default of read-until-close. This can lead to
framing issues with certain proxies. We now treat any unexpected value as an error.
- Handling of whitespace in headers now matches the RFC more closely. Only space and tab characters
are treated as whitespace and stripped from the beginning and end of header values. Other unicode
whitespace characters are now left alone. This could also lead to framing issues with certain
proxies.
- ``tornado.curl_httpclient`` now prohibits carriage return and linefeed headers in HTTP headers
(matching the behavior of ``simple_httpclient``). These characters could be used for header
injection or request smuggling if untrusted data were used in headers.
General Changes
~~~~~~~~~~~~~~~
`tornado.iostream`
~~~~~~~~~~~~~~~~~~
- `.SSLIOStream` now understands changes to error codes from OpenSSL 3.2. The main result of this
change is to reduce the noise in the logs for certain errors.
``tornado.simple_httpclient``"><pre class="notranslate"><code>
- Parsing of the ``Transfer-Encoding`` header is now stricter. Unexpected transfer-encoding values
were previously ignored and treated as the HTTP/1.0 default of read-until-close. This can lead to
framing issues with certain proxies. We now treat any unexpected value as an error.
- Handling of whitespace in headers now matches the RFC more closely. Only space and tab characters
are treated as whitespace and stripped from the beginning and end of header values. Other unicode
whitespace characters are now left alone. This could also lead to framing issues with certain
proxies.
- ``tornado.curl_httpclient`` now prohibits carriage return and linefeed headers in HTTP headers
(matching the behavior of ``simple_httpclient``). These characters could be used for header
injection or request smuggling if untrusted data were used in headers.
General Changes
~~~~~~~~~~~~~~~
`tornado.iostream`
~~~~~~~~~~~~~~~~~~
- `.SSLIOStream` now understands changes to error codes from OpenSSL 3.2. The main result of this
change is to reduce the noise in the logs for certain errors.
``tornado.simple_httpclient``
</code></pre></div>
<ul>
<li><code>simple_httpclient</code> now prohibits carriage return characters in HTTP headers. It had previously<br>
prohibited only linefeed characters.</li>
</ul>
<p><code>tornado.testing</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- `.AsyncTestCase` subclasses can now be instantiated without being associated with a test
method. This improves compatibility with test discovery in Pytest 8.2."><pre class="notranslate"><code>
- `.AsyncTestCase` subclasses can now be instantiated without being associated with a test
method. This improves compatibility with test discovery in Pytest 8.2.
</code></pre></div>bdarnelltag:github.com,2008:Repository/301742/v6.4.02023-11-29T03:19:42Zv6.4.0: What's new in Tornado 6.4.0<h2>Nov 28, 2023</h2>
<p>General Changes</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Python 3.12 is now supported. Older versions of Tornado will work on Python 3.12 but may log
deprecation warnings.
Deprecation Notices"><pre class="notranslate"><code>
- Python 3.12 is now supported. Older versions of Tornado will work on Python 3.12 but may log
deprecation warnings.
Deprecation Notices
</code></pre></div>
<ul>
<li><code>.IOLoop.add_callback_from_signal</code> is suspected to have been broken since Tornado 5.0 and will be<br>
removed in version 7.0. Use <code>asyncio.loop.add_signal_handler</code> instead.</li>
<li>The <code>client_secret</code> argument to <code>.OAuth2Mixin.authorize_redirect</code> is deprecated and will be<br>
removed in Tornado 7.0. This argument has never been used and other similar methods in this module<br>
don't have it.</li>
<li><code>.TwitterMixin</code> is deprecated and will be removed in the future.</li>
</ul>
<p><code>tornado.auth</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- The ``client_secret`` argument to `.OAuth2Mixin.authorize_redirect` is deprecated and will be
removed in Tornado 7.0. This argument has never been used and other similar methods in this module
don't have it.
- `.TwitterMixin` is deprecated and will be removed in the future.
``tornado.autoreload``"><pre class="notranslate"><code>
- The ``client_secret`` argument to `.OAuth2Mixin.authorize_redirect` is deprecated and will be
removed in Tornado 7.0. This argument has never been used and other similar methods in this module
don't have it.
- `.TwitterMixin` is deprecated and will be removed in the future.
``tornado.autoreload``
</code></pre></div>
<ul>
<li>Autoreload can now be used when the program is run as a directory rather than a file or module.</li>
<li>New CLI flag <code>--until-success</code> re-runs the program on any failure but stops after the first<br>
successful run.</li>
</ul>
<p><code>tornado.concurrent</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Fixed reference cycles that could lead to increased memory usage.
``tornado.escape``
~~~~~~~~~~~~~~~~~~
- Several methods in this module now simply pass through to their equivalents in the standard
library.
``tornado.gen``
~~~~~~~~~~~~~~~
- This module now holds a strong reference to all running `asyncio.Task` objects it creates. This
prevents premature garbage collection which could cause warnings like "Task was destroyed but it
is pending!".
``tornado.ioloop``
~~~~~~~~~~~~~~~~~~
- `.IOLoop.add_callback_from_signal` is suspected to have been broken since Tornado 5.0 and will be
removed in version 7.0. Use `asyncio.loop.add_signal_handler` instead.
- The type annotation for `.IOLoop.run_in_executor` has been updated to match the updated signature
of `asyncio.loop.run_in_executor`.
- Fixed reference cycles that could lead to increased memory usage.
``tornado.locale``
~~~~~~~~~~~~~~~~~~
- `.format_timestamp` now supports "aware" datetime objects.
``tornado.platform.asyncio``"><pre class="notranslate"><code>
- Fixed reference cycles that could lead to increased memory usage.
``tornado.escape``
~~~~~~~~~~~~~~~~~~
- Several methods in this module now simply pass through to their equivalents in the standard
library.
``tornado.gen``
~~~~~~~~~~~~~~~
- This module now holds a strong reference to all running `asyncio.Task` objects it creates. This
prevents premature garbage collection which could cause warnings like "Task was destroyed but it
is pending!".
``tornado.ioloop``
~~~~~~~~~~~~~~~~~~
- `.IOLoop.add_callback_from_signal` is suspected to have been broken since Tornado 5.0 and will be
removed in version 7.0. Use `asyncio.loop.add_signal_handler` instead.
- The type annotation for `.IOLoop.run_in_executor` has been updated to match the updated signature
of `asyncio.loop.run_in_executor`.
- Fixed reference cycles that could lead to increased memory usage.
``tornado.locale``
~~~~~~~~~~~~~~~~~~
- `.format_timestamp` now supports "aware" datetime objects.
``tornado.platform.asyncio``
</code></pre></div>
<ul>
<li>The shutdown protocol for <code>.AddThreadSelectorEventLoop</code> now requires the use of <code>asyncio.run</code> or<br>
<code>asyncio.loop.shutdown_asyncgens</code> to avoid leaking the thread.</li>
<li>Introduced <code>.SelectorThread</code> class containing the core functionality of<br>
<code>.AddThreadSelectorEventLoop</code>.</li>
<li>The <code>close()</code> method of <code>.AddThreadSelectorEventLoop</code> is now idempotent.</li>
</ul>
<p><code>tornado.web</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- `.StaticFileHandler.get_modified_time` now supports "aware" datetime objects and the default
implementation now returns aware objects.
``tornado.websocket``"><pre class="notranslate"><code>
- `.StaticFileHandler.get_modified_time` now supports "aware" datetime objects and the default
implementation now returns aware objects.
``tornado.websocket``
</code></pre></div>
<ul>
<li>Unclosed client connections now reliably log a warning. Previously the warning was dependent on<br>
garbage collection and whether the <code>ping_interval</code> option was used.</li>
<li>The <code>subprotocols</code> argument to <code>.WebSocketClientConnection</code> now defaults to None instead of an<br>
empty list (which was mutable and reused)</li>
</ul>bdarnelltag:github.com,2008:Repository/301742/v6.4.0b12023-11-16T03:10:17Zv6.4.0b1: What's new in Tornado 6.4.0<h2>In Progress</h2>
<p>General Changes</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Python 3.12 is now supported. Older versions of Tornado will work on Python 3.12 but may log
deprecation warnings.
Deprecation Notices"><pre class="notranslate"><code>
- Python 3.12 is now supported. Older versions of Tornado will work on Python 3.12 but may log
deprecation warnings.
Deprecation Notices
</code></pre></div>
<ul>
<li><code>.IOLoop.add_callback_from_signal</code> is suspected to have been broken since Tornado 5.0 and will be<br>
removed in version 7.0. Use <code>asyncio.loop.add_signal_handler</code> instead.</li>
<li>The <code>client_secret</code> argument to <code>.OAuth2Mixin.authorize_redirect</code> is deprecated and will be<br>
removed in Tornado 7.0. This argument has never been used and other similar methods in this module<br>
don't have it.</li>
<li><code>.TwitterMixin</code> is deprecated and will be removed in the future.</li>
</ul>
<p><code>tornado.auth</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- The ``client_secret`` argument to `.OAuth2Mixin.authorize_redirect` is deprecated and will be
removed in Tornado 7.0. This argument has never been used and other similar methods in this module
don't have it.
- `.TwitterMixin` is deprecated and will be removed in the future.
``tornado.autoreload``"><pre class="notranslate"><code>
- The ``client_secret`` argument to `.OAuth2Mixin.authorize_redirect` is deprecated and will be
removed in Tornado 7.0. This argument has never been used and other similar methods in this module
don't have it.
- `.TwitterMixin` is deprecated and will be removed in the future.
``tornado.autoreload``
</code></pre></div>
<ul>
<li>Autoreload can now be used when the program is run as a directory rather than a file or module.</li>
<li>New CLI flag <code>--until-success</code> re-runs the program on any failure but stops after the first<br>
successful run.</li>
</ul>
<p><code>tornado.concurrent</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Fixed reference cycles that could lead to increased memory usage.
``tornado.escape``
~~~~~~~~~~~~~~~~~~
- Several methods in this module now simply pass through to their equivalents in the standard
library.
``tornado.gen``
~~~~~~~~~~~~~~~
- This module now holds a strong reference to all running `asyncio.Task` objects it creates. This
prevents premature garbage collection which could cause warnings like "Task was destroyed but it
is pending!".
``tornado.ioloop``
~~~~~~~~~~~~~~~~~~
- `.IOLoop.add_callback_from_signal` is suspected to have been broken since Tornado 5.0 and will be
removed in version 7.0. Use `asyncio.loop.add_signal_handler` instead.
- The type annotation for `.IOLoop.run_in_executor` has been updated to match the updated signature
of `asyncio.loop.run_in_executor`.
- Fixed reference cycles that could lead to increased memory usage.
``tornado.locale``
~~~~~~~~~~~~~~~~~~
- `.format_timestamp` now supports "aware" datetime objects.
``tornado.platform.asyncio``"><pre class="notranslate"><code>
- Fixed reference cycles that could lead to increased memory usage.
``tornado.escape``
~~~~~~~~~~~~~~~~~~
- Several methods in this module now simply pass through to their equivalents in the standard
library.
``tornado.gen``
~~~~~~~~~~~~~~~
- This module now holds a strong reference to all running `asyncio.Task` objects it creates. This
prevents premature garbage collection which could cause warnings like "Task was destroyed but it
is pending!".
``tornado.ioloop``
~~~~~~~~~~~~~~~~~~
- `.IOLoop.add_callback_from_signal` is suspected to have been broken since Tornado 5.0 and will be
removed in version 7.0. Use `asyncio.loop.add_signal_handler` instead.
- The type annotation for `.IOLoop.run_in_executor` has been updated to match the updated signature
of `asyncio.loop.run_in_executor`.
- Fixed reference cycles that could lead to increased memory usage.
``tornado.locale``
~~~~~~~~~~~~~~~~~~
- `.format_timestamp` now supports "aware" datetime objects.
``tornado.platform.asyncio``
</code></pre></div>
<ul>
<li>The shutdown protocol for <code>.AddThreadSelectorEventLoop</code> now requires the use of <code>asyncio.run</code> or<br>
<code>asyncio.loop.shutdown_asyncgens</code> to avoid leaking the thread.</li>
<li>Introduced <code>.SelectorThread</code> class containing the core functionality of<br>
<code>.AddThreadSelectorEventLoop</code>.</li>
<li>The <code>close()</code> method of <code>.AddThreadSelectorEventLoop</code> is now idempotent.</li>
</ul>
<p><code>tornado.web</code></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- `.StaticFileHandler.get_modified_time` now supports "aware" datetime objects and the default
implementation now returns aware objects.
``tornado.websocket``"><pre class="notranslate"><code>
- `.StaticFileHandler.get_modified_time` now supports "aware" datetime objects and the default
implementation now returns aware objects.
``tornado.websocket``
</code></pre></div>
<ul>
<li>Unclosed client connections now reliably log a warning. Previously the warning was dependent on<br>
garbage collection and whether the <code>ping_interval</code> option was used.</li>
<li>The <code>subprotocols</code> argument to <code>.WebSocketClientConnection</code> now defaults to None instead of an<br>
empty list (which was mutable and reused)</li>
</ul>bdarnelltag:github.com,2008:Repository/301742/v6.3.32023-08-11T14:45:47Zv6.3.3: What's new in Tornado 6.3.3<h2>Aug 11, 2023</h2>
<p>Security improvements</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- The ``Content-Length`` header and ``chunked`` ``Transfer-Encoding`` sizes are now parsed
more strictly (according to the relevant RFCs) to avoid potential request-smuggling
vulnerabilities when deployed behind certain proxies."><pre class="notranslate"><code>
- The ``Content-Length`` header and ``chunked`` ``Transfer-Encoding`` sizes are now parsed
more strictly (according to the relevant RFCs) to avoid potential request-smuggling
vulnerabilities when deployed behind certain proxies.
</code></pre></div>bdarnelltag:github.com,2008:Repository/301742/v6.3.22023-05-14T01:38:10Zv6.3.2: What's new in Tornado 6.3.2<h2>May 13, 2023</h2>
<p>Security improvements</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="
- Fixed an open redirect vulnerability in StaticFileHandler under certain
configurations."><pre class="notranslate"><code>
- Fixed an open redirect vulnerability in StaticFileHandler under certain
configurations.
</code></pre></div>bdarnell