This repository was archived by the owner on Mar 16, 2023. It is now read-only.
Tags: wildfoundry/tornado
Tags
What's new in Tornado 5.0
Mar 5, 2018
-----------
Highlights
~~~~~~~~~~
- The focus of this release is improving integration with `asyncio`.
On Python 3, the `.IOLoop` is always a wrapper around the `asyncio`
event loop, and `asyncio.Future` and `asyncio.Task` are used instead
of their Tornado counterparts. This means that libraries based on
`asyncio` can be mixed relatively seamlessly with those using
Tornado. While care has been taken to minimize the disruption from
this change, code changes may be required for compatibility with
Tornado 5.0, as detailed in the following section.
- Tornado 5.0 supports Python 2.7.9+ and 3.4+. Python 2.7 and 3.4 are
deprecated and support for them will be removed in Tornado 6.0,
which will require Python 3.5+.
Backwards-compatibility notes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- Python 3.3 is no longer supported.
- Versions of Python 2.7 that predate the `ssl` module update are no
longer supported. (The `ssl` module was updated in version 2.7.9,
although in some distributions the updates are present in builds
with a lower version number. Tornado requires `ssl.SSLContext`,
`ssl.create_default_context`, and `ssl.match_hostname`)
- Versions of Python 3.5 prior to 3.5.2 are no longer supported due to
a change in the async iterator protocol in that version.
- The ``trollius`` project (`asyncio` backported to Python 2) is no
longer supported.
- `tornado.concurrent.Future` is now an alias for `asyncio.Future`
when running on Python 3. This results in a number of minor
behavioral changes:
- `.Future` objects can only be created while there is a current
`.IOLoop`
- The timing of callbacks scheduled with
``Future.add_done_callback`` has changed.
`tornado.concurrent.future_add_done_callback` can be used to
make the behavior more like older versions of Tornado (but not
identical). Some of these changes are also present in the Python
2 version of `tornado.concurrent.Future` to minimize the
difference between Python 2 and 3.
- Cancellation is now partially supported, via
`asyncio.Future.cancel`. A canceled `.Future` can no longer have
its result set. Applications that handle `~asyncio.Future`
objects directly may want to use
`tornado.concurrent.future_set_result_unless_cancelled`. In
native coroutines, cancellation will cause an exception to be
raised in the coroutine.
- The ``exc_info`` and ``set_exc_info`` methods are no longer
present. Use `tornado.concurrent.future_set_exc_info` to replace
the latter, and raise the exception with
`~asyncio.Future.result` to replace the former.
- ``io_loop`` arguments to many Tornado functions have been removed.
Use `.IOLoop.current()` instead of passing `.IOLoop` objects
explicitly.
- On Python 3, `.IOLoop` is always a wrapper around the `asyncio`
event loop. ``IOLoop.configure`` is effectively removed on Python 3
(for compatibility, it may be called to redundantly specify the
`asyncio`-backed `.IOLoop`)
- `.IOLoop.instance` is now a deprecated alias for `.IOLoop.current`.
Applications that need the cross-thread communication behavior
facilitated by `.IOLoop.instance` should use their own global variable
instead.
Other notes
~~~~~~~~~~~
- The ``futures`` (`concurrent.futures` backport) package is now required
on Python 2.7.
- The ``certifi`` and ``backports.ssl-match-hostname`` packages are no
longer required on Python 2.7.
- Python 3.6 or higher is recommended, because it features more
efficient garbage collection of `asyncio.Future` objects.
`tornado.auth`
~~~~~~~~~~~~~~
- `.GoogleOAuth2Mixin` now uses a newer set of URLs.
`tornado.autoreload`
~~~~~~~~~~~~~~~~~~~~
- On Python 3, uses ``__main__.__spec`` to more reliably reconstruct
the original command line and avoid modifying ``PYTHONPATH``.
- The ``io_loop`` argument to `tornado.autoreload.start` has been removed.
`tornado.concurrent`
~~~~~~~~~~~~~~~~~~~~
- `tornado.concurrent.Future` is now an alias for `asyncio.Future`
when running on Python 3. See "Backwards-compatibility notes" for
more.
- Setting the result of a ``Future`` no longer blocks while callbacks
are being run. Instead, the callbacks are scheduled on the next
`.IOLoop` iteration.
- The deprecated alias ``tornado.concurrent.TracebackFuture`` has been
removed.
- `tornado.concurrent.chain_future` now works with all three kinds of
``Futures`` (Tornado, `asyncio`, and `concurrent.futures`)
- The ``io_loop`` argument to `tornado.concurrent.run_on_executor` has
been removed.
- New functions `.future_set_result_unless_cancelled`,
`.future_set_exc_info`, and `.future_add_done_callback` help mask
the difference between `asyncio.Future` and Tornado's previous
``Future`` implementation.
`tornado.curl_httpclient`
~~~~~~~~~~~~~~~~~~~~~~~~~
- Improved debug logging on Python 3.
- The ``time_info`` response attribute now includes ``appconnect`` in
addition to other measurements.
- Closing a `.CurlAsyncHTTPClient` now breaks circular references that
could delay garbage collection.
- The ``io_loop`` argument to the `.CurlAsyncHTTPClient` constructor
has been removed.
`tornado.gen`
~~~~~~~~~~~~~
- ``tornado.gen.TimeoutError`` is now an alias for
`tornado.util.TimeoutError`.
- Leak detection for ``Futures`` created by this module now attributes
them to their proper caller instead of the coroutine machinery.
- Several circular references that could delay garbage collection have
been broken up.
- On Python 3, `asyncio.Task` is used instead of the Tornado coroutine
runner. This improves compatibility with some `asyncio` libraries
and adds support for cancellation.
- The ``io_loop`` arguments to ``YieldFuture`` and `.with_timeout` have
been removed.
`tornado.httpclient`
~~~~~~~~~~~~~~~~~~~~
- The ``io_loop`` argument to all `.AsyncHTTPClient` constructors has
been removed.
`tornado.httpserver`
~~~~~~~~~~~~~~~~~~~~
- It is now possible for a client to reuse a connection after sending
a chunked request.
- If a client sends a malformed request, the server now responds with
a 400 error instead of simply closing the connection.
- ``Content-Length`` and ``Transfer-Encoding`` headers are no longer
sent with 1xx or 204 responses (this was already true of 304
responses).
- When closing a connection to a HTTP/1.1 client, the ``Connection:
close`` header is sent with the response.
- The ``io_loop`` argument to the `.HTTPServer` constructor has been
removed.
- If more than one ``X-Scheme`` or ``X-Forwarded-Proto`` header is
present, only the last is used.
`tornado.httputil`
~~~~~~~~~~~~~~~~~~
- The string representation of `.HTTPServerRequest` objects (which are
sometimes used in log messages) no longer includes the request
headers.
- New function `.qs_to_qsl` converts the result of
`urllib.parse.parse_qs` to name-value pairs.
`tornado.ioloop`
~~~~~~~~~~~~~~~~
- ``tornado.ioloop.TimeoutError`` is now an alias for
`tornado.util.TimeoutError`.
- `.IOLoop.instance` is now a deprecated alias for `.IOLoop.current`.
- `.IOLoop.install` and `.IOLoop.clear_instance` are deprecated.
- ``IOLoop.initialized`` has been removed.
- On Python 3, the `asyncio`-backed `.IOLoop` is always used and
alternative `.IOLoop` implementations cannot be configured.
`.IOLoop.current` and related methods pass through to
`asyncio.get_event_loop`.
- `~.IOLoop.run_sync` cancels its argument on a timeout. This
results in better stack traces (and avoids log messages about leaks)
in native coroutines.
- New methods `.IOLoop.run_in_executor` and
`.IOLoop.set_default_executor` make it easier to run functions in
other threads from native coroutines (since
`concurrent.futures.Future` does not support ``await``).
- ``PollIOLoop`` (the default on Python 2) attempts to detect misuse
of `.IOLoop` instances across `os.fork`.
- The ``io_loop`` argument to `.PeriodicCallback` has been removed.
- It is now possible to create a `.PeriodicCallback` in one thread
and start it in another without passing an explicit event loop.
- The `.IOLoop.set_blocking_signal_threshold` and
`.IOLoop.set_blocking_log_threshold` methods are deprecated because
they are not implemented for the `asyncio` event loop`. Use the
``PYTHONASYNCIODEBUG=1`` environment variable instead.
- `.IOLoop.clear_current` now works if it is called before any
current loop is established.
- The ``IOLoop.initialized`` method has been removed.
`tornado.iostream`
~~~~~~~~~~~~~~~~~~
- The ``io_loop`` argument to the `.IOStream` constructor has been removed.
- New method `.BaseIOStream.read_into` provides a minimal-copy alternative to
`.BaseIOStream.read_bytes`.
- `.BaseIOStream.write` is now much more efficient for very large amounts of data.
- Fixed some cases in which ``IOStream.error`` could be inaccurate.
- Writing a `memoryview` can no longer result in "BufferError:
Existing exports of data: object cannot be re-sized".
`tornado.locks`
~~~~~~~~~~~~~~~
- As a side effect of the ``Future`` changes, waiters are always
notified asynchronously with respect to `.Condition.notify`.
`tornado.netutil`
~~~~~~~~~~~~~~~~~
- The default `.Resolver` now uses `.IOLoop.run_in_executor`.
`.ExecutorResolver`, `.BlockingResolver`, and `.ThreadedResolver` are
deprecated.
- The ``io_loop`` arguments to `.add_accept_handler`,
`.ExecutorResolver`, and `.ThreadedResolver` have been removed.
- `.add_accept_handler` returns a callable which can be used to remove
all handlers that were added.
- `.OverrideResolver` now accepts per-family overrides.
`tornado.options`
~~~~~~~~~~~~~~~~~
- Duplicate option names are now detected properly whether they use
hyphens or underscores.
`tornado.platform.asyncio`
~~~~~~~~~~~~~~~~~~~~~~~~~~
- `.AsyncIOLoop` and `.AsyncIOMainLoop` are now used automatically
when appropriate; referencing them explicitly is no longer
recommended.
- Starting an `.IOLoop` or making it current now also sets the
`asyncio` event loop for the current thread. Closing an `.IOLoop`
closes the corresponding `asyncio` event loop.
- `.to_tornado_future` and `.to_asyncio_future` are deprecated since
they are now no-ops.
- `~.AnyThreadEventLoopPolicy` can now be used to easily allow the creation
of event loops on any thread (similar to Tornado's prior policy).
`tornado.platform.caresresolver`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The ``io_loop`` argument to `.CaresResolver` has been removed.
`tornado.platform.twisted`
~~~~~~~~~~~~~~~~~~~~~~~~~~
- The ``io_loop`` arguments to `.TornadoReactor`, `.TwistedResolver`,
and `tornado.platform.twisted.install` have been removed.
`tornado.process`
~~~~~~~~~~~~~~~~~
- The ``io_loop`` argument to the `.Subprocess` constructor and
`.Subprocess.initialize` has been removed.
`tornado.routing`
~~~~~~~~~~~~~~~~~
- A default 404 response is now generated if no delegate is found for
a request.
`tornado.simple_httpclient`
~~~~~~~~~~~~~~~~~~~~~~~~~~~
- The ``io_loop`` argument to `.SimpleAsyncHTTPClient` has been removed.
- TLS is now configured according to `ssl.create_default_context` by
default.
`tornado.tcpclient`
~~~~~~~~~~~~~~~~~~~
- The ``io_loop`` argument to the `.TCPClient` constructor has been
removed.
- `.TCPClient.connect` has a new ``timeout`` argument.
`tornado.tcpserver`
~~~~~~~~~~~~~~~~~~~
- The ``io_loop`` argument to the `.TCPServer` constructor has been
removed.
- `.TCPServer` no longer logs ``EBADF`` errors during shutdown.
`tornado.testing`
~~~~~~~~~~~~~~~~~
- The deprecated ``tornado.testing.get_unused_port`` and
``tornado.testing.LogTrapTestCase`` have been removed.
- `.AsyncHTTPTestCase.fetch` now supports absolute URLs.
- `.AsyncHTTPTestCase.fetch` now connects to ``127.0.0.1``
instead of ``localhost`` to be more robust against faulty
ipv6 configurations.
`tornado.util`
~~~~~~~~~~~~~~
- `tornado.util.TimeoutError` replaces ``tornado.gen.TimeoutError``
and ``tornado.ioloop.TimeoutError``.
- `.Configurable` now supports configuration at multiple levels of an
inheritance hierarchy.
`tornado.web`
~~~~~~~~~~~~~
- `.RequestHandler.set_status` no longer requires that the given
status code appear in `http.client.responses`.
- It is no longer allowed to send a body with 1xx or 204 responses.
- Exception handling now breaks up reference cycles that could delay
garbage collection.
- `.RedirectHandler` now copies any query arguments from the request
to the redirect location.
- If both ``If-None-Match`` and ``If-Modified-Since`` headers are present
in a request to `.StaticFileHandler`, the latter is now ignored.
`tornado.websocket`
~~~~~~~~~~~~~~~~~~~
- The C accelerator now operates on multiple bytes at a time to
improve performance.
- Requests with invalid websocket headers now get a response with
status code 400 instead of a closed connection.
- `.WebSocketHandler.write_message` now raises `.WebSocketClosedError` if
the connection closes while the write is in progress.
- The ``io_loop`` argument to `.websocket_connect` has been removed.
What's new in Tornado 4.5.3 Jan 6, 2018 ------------ `tornado.curl_httpclient` ~~~~~~~~~~~~~~~~~~~~~~~~~ - Improved debug logging on Python 3. `tornado.httpserver` ~~~~~~~~~~~~~~~~~~~~ - ``Content-Length`` and ``Transfer-Encoding`` headers are no longer sent with 1xx or 204 responses (this was already true of 304 responses). - Reading chunked requests no longer leaves the connection in a broken state. `tornado.iostream` ~~~~~~~~~~~~~~~~~~ - Writing a `memoryview` can no longer result in "BufferError: Existing exports of data: object cannot be re-sized". `tornado.options` ~~~~~~~~~~~~~~~~~ - Duplicate option names are now detected properly whether they use hyphens or underscores. `tornado.testing` ~~~~~~~~~~~~~~~~~ - `.AsyncHTTPTestCase.fetch` now uses ``127.0.0.1`` instead of ``localhost``, improving compatibility with systems that have partially-working ipv6 stacks. `tornado.web` ~~~~~~~~~~~~~ - It is no longer allowed to send a body with 1xx or 204 responses. `tornado.websocket` ~~~~~~~~~~~~~~~~~~~ - Requests with invalid websocket headers now get a response with status code 400 instead of a closed connection.
What's new in Tornado 4.5.2 Aug 27, 2017 ------------ Bug Fixes ~~~~~~~~~ - Tornado now sets the ``FD_CLOEXEC`` flag on all file descriptors it creates. This prevents hanging client connections and resource leaks when the `tornado.autoreload` module (or ``Application(debug=True)``) is used.
What's new in Tornado 4.5 Apr 16, 2017 ------------ Backwards-compatibility warning ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The `tornado.websocket` module now imposes a limit on the size of incoming messages, which defaults to 10MiB. New module ~~~~~~~~~~ - `tornado.routing` provides a more flexible routing system than the one built in to `.Application`. General changes ~~~~~~~~~~~~~~~ - Reduced the number of circular references, reducing memory usage and improving performance. `tornado.auth` ~~~~~~~~~~~~~~ * The `tornado.auth` module has been updated for compatibility with `a change to Facebook's access_token endpoint <https://github.com/tornadoweb/tornado/pull/1977>`_. This includes both the changes initially released in Tornado 4.4.3 and an additional change to support the ```session_expires`` field in the new format. The ``session_expires`` field is currently a string; it should be accessed as ``int(user['session_expires'])`` because it will change from a string to an int in Tornado 5.0. `tornado.autoreload` ~~~~~~~~~~~~~~~~~~~~ - Autoreload is now compatible with the `asyncio` event loop. - Autoreload no longer attempts to close the `.IOLoop` and all registered file descriptors before restarting; it relies on the ``CLOEXEC`` flag being set instead. `tornado.concurrent` ~~~~~~~~~~~~~~~~~~~~ - Suppressed some "'NoneType' object not callback" messages that could be logged at shutdown. `tornado.gen` ~~~~~~~~~~~~~ - ``yield None`` is now equivalent to ``yield gen.moment``. `~tornado.gen.moment` is deprecated. This improves compatibility with `asyncio`. - Fixed an issue in which a generator object could be garbage collected prematurely (most often when weak references are used. - New function `.is_coroutine_function` identifies functions wrapped by `.coroutine` or `.engine`. ``tornado.http1connection`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - The ``Transfer-Encoding`` header is now parsed case-insensitively. `tornado.httpclient` ~~~~~~~~~~~~~~~~~~~~ - ``SimpleAsyncHTTPClient`` now follows 308 redirects. - ``CurlAsyncHTTPClient`` will no longer accept protocols other than ``http`` and ``https``. To override this, set ``pycurl.PROTOCOLS`` and ``pycurl.REDIR_PROTOCOLS`` in a ``prepare_curl_callback``. - ``CurlAsyncHTTPClient`` now supports digest authentication for proxies (in addition to basic auth) via the new ``proxy_auth_mode`` argument. - The minimum supported version of ``libcurl`` is now ``7.22.0``. `tornado.httpserver` ~~~~~~~~~~~~~~~~~~~~ - `.HTTPServer` now accepts the keyword argument ``trusted_downstream`` which controls the parsing of ``X-Forwarded-For`` headers. This header may be a list or set of IP addresses of trusted proxies which will be skipped in the ``X-Forwarded-For`` list. - The ``no_keep_alive`` argument works again. `tornado.httputil` ~~~~~~~~~~~~~~~~~~ - `.url_concat` correctly handles fragments and existing query arguments. `tornado.ioloop` ~~~~~~~~~~~~~~~~ - Fixed 100% CPU usage after a callback returns an empty list or dict. - `.IOLoop.add_callback` now uses a lockless implementation which makes it safe for use from ``__del__`` methods. This improves performance of calls to `~.IOLoop.add_callback` from the `.IOLoop` thread, and slightly decreases it for calls from other threads. `tornado.iostream` ~~~~~~~~~~~~~~~~~~ - `memoryview` objects are now permitted as arguments to `~.BaseIOStream.write`. - The internal memory buffers used by `.IOStream` now use `bytearray` instead of a list of `bytes`, improving performance. - Futures returned by `~.BaseIOStream.write` are no longer orphaned if a second call to ``write`` occurs before the previous one is finished. `tornado.log` ~~~~~~~~~~~~~ - Colored log output is now supported on Windows if the `colorama <https://pypi.python.org/pypi/colorama>`_ library is installed and the application calls ``colorama.init()`` at startup. - The signature of the `.LogFormatter` constructor has been changed to make it compatible with `logging.config.dictConfig`. `tornado.netutil` ~~~~~~~~~~~~~~~~~ - Worked around an issue that caused "LookupError: unknown encoding: latin1" errors on Solaris. `tornado.process` ~~~~~~~~~~~~~~~~~ - `.Subprocess` no longer causes "subprocess still running" warnings on Python 3.6. - Improved error handling in `.cpu_count`. `tornado.tcpclient` ~~~~~~~~~~~~~~~~~~~ - `.TCPClient` now supports a ``source_ip`` and ``source_port`` argument. - Improved error handling for environments where IPv6 support is incomplete. `tornado.tcpserver` ~~~~~~~~~~~~~~~~~~~ - `.TCPServer.handle_stream` implementations may now be native coroutines. - Stopping a `.TCPServer` twice no longer raises an exception. `tornado.web` ~~~~~~~~~~~~~ - `.RedirectHandler` now supports substituting parts of the matched URL into the redirect location using `str.format` syntax. - New methods `.RequestHandler.render_linked_js`, `.RequestHandler.render_embed_js`, `.RequestHandler.render_linked_css`, and `.RequestHandler.render_embed_css` can be overridden to customize the output of `.UIModule`. `tornado.websocket` ~~~~~~~~~~~~~~~~~~~ - `.WebSocketHandler.on_message` implementations may now be coroutines. New messages will not be processed until the previous ``on_message`` coroutine has finished. - The ``websocket_ping_interval`` and ``websocket_ping_timeout`` application settings can now be used to enable a periodic ping of the websocket connection, allowing dropped connections to be detected and closed. - The new ``websocket_max_message_size`` setting defaults to 10MiB. The connection will be closed if messages larger than this are received. - Headers set by `.RequestHandler.prepare` or `.RequestHandler.set_default_headers` are now sent as a part of the websocket handshake. - Return values from `.WebSocketHandler.get_compression_options` may now include the keys ``compression_level`` and ``mem_level`` to set gzip parameters. The default compression level is now 6 instead of 9. Demos ~~~~~ - A new file upload demo is available in the `file_upload <https://github.com/tornadoweb/tornado/tree/master/demos/file_upload>`_ directory. - A new `.TCPClient` and `.TCPServer` demo is available in the `tcpecho <https://github.com/tornadoweb/tornado/tree/master/demos/tcpecho>`_ directory. - Minor updates have been made to several existing demos, including updates to more recent versions of jquery. Credits ~~~~~~~ The following people contributed commits to this release: - A\. Jesse Jiryu Davis - Aaron Opfer - Akihiro Yamazaki - Alexander - Andreas Røsdal - Andrew Rabert - Andrew Sumin - Antoine Pietri - Antoine Pitrou - Artur Stawiarski - Ben Darnell - Brian Mego - Dario - Doug Vargas - Eugene Dubovoy - Iver Jordal - JZQT - James Maier - Jeff Hunter - Leynos - Mark Henderson - Michael V. DePalatis - Min RK - Mircea Ulinic - Ping - Ping Yang - Riccardo Magliocchetti - Samuel Chen - Samuel Dion-Girardeau - Scott Meisburger - Shawn Ding - TaoBeier - Thomas Kluyver - Vadim Semenov - matee - mike820324 - stiletto - zhimin - 依云
What's new in Tornado 4.4.3 Mar 30, 2017 ------------ Bug fixes ~~~~~~~~~ * The `tornado.auth` module has been updated for compatibility with `a change to Facebook's access_token endpoint. <https://github.com/tornadoweb/tornado/pull/1977>`_
What's new in Tornado 4.4.2 =========================== Oct 1, 2016 ------------ Security fixes ~~~~~~~~~~~~~~ * A difference in cookie parsing between Tornado and web browsers (especially when combined with Google Analytics) could allow an attacker to set arbitrary cookies and bypass XSRF protection. The cookie parser has been rewritten to fix this attack. Backwards-compatibility notes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Cookies containing certain special characters (in particular semicolon and square brackets) are now parsed differently. * If the cookie header contains a combination of valid and invalid cookies, the valid ones will be returned (older versions of Tornado would reject the entire header for a single invalid cookie).
What's new in Tornado 4.4 ========================= Jul 15, 2016 ------------ General ~~~~~~~ * Tornado now requires Python 2.7 or 3.3+; versions 2.6 and 3.2 are no longer supported. Pypy3 is still supported even though its latest release is mainly based on Python 3.2. * The `monotonic <https://pypi.python.org/pypi/monotonic>`_ package is now supported as an alternative to `Monotime <https://pypi.python.org/pypi/Monotime>`_ for monotonic clock support on Python 2. ``tornado.curl_httpclient`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Failures in ``_curl_setup_request`` no longer cause the ``max_clients`` pool to be exhausted. * Non-ascii header values are now handled correctly. `tornado.gen` ~~~~~~~~~~~~~ * `.with_timeout` now accepts any yieldable object (except `.YieldPoint`), not just `tornado.concurrent.Future`. `tornado.httpclient` ~~~~~~~~~~~~~~~~~~~~ * The errors raised by timeouts now indicate what state the request was in; the error message is no longer simply "599 Timeout". * Calling `repr` on a `tornado.httpclient.HTTPError` no longer raises an error. `tornado.httpserver` ~~~~~~~~~~~~~~~~~~~~ * Int-like enums (including `http.HTTPStatus`) can now be used as status codes. * Responses with status code ``204 No Content`` no longer emit a ``Content-Length: 0`` header. `tornado.ioloop` ~~~~~~~~~~~~~~~~ * Improved performance when there are large numbers of active timeouts. `tornado.netutil` ~~~~~~~~~~~~~~~~~ * All included `.Resolver` implementations raise `IOError` (or a subclass) for any resolution failure. `tornado.options` ~~~~~~~~~~~~~~~~~ * Options can now be modified with subscript syntax in addition to attribute syntax. * The special variable ``__file__`` is now available inside config files. ``tornado.simple_httpclient`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * HTTP/1.0 (not 1.1) responses without a ``Content-Length`` header now work correctly. `tornado.tcpserver` ~~~~~~~~~~~~~~~~~~~ * `.TCPServer.bind` now accepts a ``reuse_port`` argument. `tornado.testing` ~~~~~~~~~~~~~~~~~ * Test sockets now always use ``127.0.0.1`` instead of ``localhost``. This avoids conflicts when the automatically-assigned port is available on IPv4 but not IPv6, or in unusual network configurations when ``localhost`` has multiple IP addresses. `tornado.web` ~~~~~~~~~~~~~ * ``image/svg+xml`` is now on the list of compressible mime types. * Fixed an error on Python 3 when compression is used with multiple ``Vary`` headers. `tornado.websocket` ~~~~~~~~~~~~~~~~~~~ * ``WebSocketHandler.__init__`` now uses `super`, which improves support for multiple inheritance.
PreviousNext