In Progress
-----------
-* `.WSGIContainer` now calls the iterable's ``close()`` method even if
- an error is raised, in compliance with the spec.
-* Fixed an incorrect error message when handler methods return a value
- other than None or a Future.
+Installation
+~~~~~~~~~~~~
+* Tornado now depends on the `backports.ssl_match_hostname
+ <https://pypi.python.org/pypi/backports.ssl_match_hostname>`_ when
+ running on Python 2. This will be installed automatically when using ``pip``
+ or ``easy_install``
+* Tornado now includes an optional C extension module, which greatly improves
+ performance of websockets. This extension will be built automatically
+ if a C compiler is found at install time.
+
+New modules
+~~~~~~~~~~~
+
+* The `tornado.platform.asyncio` module provides integration with the
+ ``asyncio`` module introduced in Python 3.4 (also available for Python
+ 3.3 with ``pip install asyncio``).
+
+`tornado.auth`
+~~~~~~~~~~~~~~
+
+* Added `.GoogleOAuth2Mixin` support authentication to Google services
+ with OAuth 2 instead of OpenID and OAuth 1.
+* `.FacebookGraphMixin` has been updated to use the current Facebook login
+ URL, which saves a redirect.
+
+`tornado.concurrent`
+~~~~~~~~~~~~~~~~~~~~
+
+* `.TracebackFuture` now accepts a ``timeout`` keyword argument (although
+ it is still incorrect to use a non-zero timeout in non-blocking code).
+
+``tornado.curl_httpclient``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* ``tornado.curl_httpclient`` now works on Python 3 with the
+ soon-to-be-released pycurl 7.19.3, which will officially support
+ Python 3 for the first time. Note that there are some unofficial
+ Python 3 ports of pycurl (Ubuntu has included one for its past
+ several releases); these are not supported for use with Tornado.
+
+`tornado.escape`
+~~~~~~~~~~~~~~~~
+
* `.xhtml_escape` now escapes apostrophes as well.
-* `.Subprocess` no longer leaks file descriptors if `subprocess.Popen` fails.
+* `tornado.escape.utf8`, `.to_unicode`, and `.native_str` now raise
+ `TypeError` instead of `AssertionError` when given an invalid value.
+
+`tornado.gen`
+~~~~~~~~~~~~~
+
+* Coroutines may now yield dicts in addition to lists to wait for
+ multiple tasks in parallel.
+* Improved performance of `tornado.gen` when yielding a `.Future` that is
+ already done.
+
+`tornado.httpclient`
+~~~~~~~~~~~~~~~~~~~~
+
+* `tornado.httpclient.HTTPRequest` now uses property setters so that
+ setting attributes after construction applies the same conversions
+ as ``__init__`` (e.g. converting the body attribute to bytes).
+
+`tornado.httpserver`
+~~~~~~~~~~~~~~~~~~~~
+
+* Malformed ``x-www-form-urlencoded`` request bodies will now log a warning
+ and continue instead of causing the request to fail (similar to the existing
+ handling of malformed ``multipart/form-data`` bodies. This is done mainly
+ because some libraries send this content type by default even when the data
+ is not form-encoded.
+* Fix some error messages for unix sockets (and other non-IP sockets)
+
+`tornado.ioloop`
+~~~~~~~~~~~~~~~~
+
+* `.IOLoop` now uses `~.IOLoop.handle_callback_exception` consistently for
+ error logging.
* `.IOLoop` now frees callback objects earlier, reducing memory usage
while idle.
-* `.FacebookGraphMixin` has been updated to use the current Facebook login
- URL, which saves a redirect.
+
+`tornado.iostream`
+~~~~~~~~~~~~~~~~~~
+
* `.IOStream` now recognizes ``ECONNABORTED`` error codes in more places
(which was mainly an issue on Windows).
* `.IOStream` now frees memory earlier if a connection is closed while
there is data in the write buffer.
-* `.StaticFileHandler` no longer fails if the client requests a ``Range`` that
- is larger than the entire file (Facebook has a crawler that does this).
* `.PipeIOStream` now handles ``EAGAIN`` error codes correctly.
* `.SSLIOStream` now initiates the SSL handshake automatically without
waiting for the application to try and read or write to the connection.
-* `.IOLoop` now uses `~.IOLoop.handle_callback_exception` consistently for
- error logging.
-* `.RequestHandler.on_connection_close` now works correctly on subsequent
- requests of a keep-alive connection.
-* `.RequestHandler.clear_all_cookies` now accepts ``domain`` and ``path``
- arguments, just like `~.RequestHandler.clear_cookie`.
-* The embedded ``ca-certificats.crt`` file has been updated with the current
- Mozilla CA list.
-* `.GoogleOAuth2Mixin` has been added so that Google's OAuth2 only apps are
- able to get a context without OpenID (which uses OAuth 1).
-* `.WebSocketHandler.write_message` now raises `.WebSocketClosedError` instead
- of `AttributeError` when the connection has been closed.
-* ``simple_httpclient`` now applies the ``connect_timeout`` to requests
- that are queued and have not yet started.
+* Swallow a spurious exception from ``set_nodelay`` when a connection
+ has been reset.
+
+`tornado.locale`
+~~~~~~~~~~~~~~~~
+
+* `.Locale.format_date` no longer forces the use of absolute
+ dates in Russian.
+
+`tornado.log`
+~~~~~~~~~~~~~
+
+* Fix an error from `tornado.log.enable_pretty_logging` when
+ `sys.stderr` does not have an ``isatty`` method.
+* `tornado.log.LogFormatter` now accepts keyword arguments ``prefix_fmt``
+ and ``datefmt``.
+
+`tornado.netutil`
+~~~~~~~~~~~~~~~~~
+
* `.is_valid_ip` (and therefore ``HTTPRequest.remote_ip``) now rejects
empty strings.
-* `.websocket_connect` now accepts preconstructed ``HTTPRequest`` objects.
-* Fix a bug with `.WebSocketHandler` when used with some proxies that
- unconditionally modify the ``Connection`` header.
+* Synchronously using `.ThreadedResolver` at import time to resolve
+ a unicode hostname no longer deadlocks.
+
+`tornado.platform.twisted`
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* `.TwistedResolver` now has better error handling.
+
+`tornado.process`
+~~~~~~~~~~~~~~~~~
+
+* `.Subprocess` no longer leaks file descriptors if `subprocess.Popen` fails.
+
+``tornado.simple_httpclient``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* ``simple_httpclient`` now applies the ``connect_timeout`` to requests
+ that are queued and have not yet started.
+* On Python 2.6, ``simple_httpclient`` now uses TLSv1 instead of SSLv3.
+* ``simple_httpclient`` now enforces the connect timeout during DNS resolution.
+* The embedded ``ca-certificates.crt`` file has been updated with the current
+ Mozilla CA list.
+
+`tornado.web`
+~~~~~~~~~~~~~
+
+* `.StaticFileHandler` no longer fails if the client requests a ``Range`` that
+ is larger than the entire file (Facebook has a crawler that does this).
+* `.RequestHandler.on_connection_close` now works correctly on subsequent
+ requests of a keep-alive connection.
* New application setting ``default_handler_class`` can be used to easily
set up custom 404 pages.
-* Fix some error messages for unix sockets (and other non-IP sockets)
* New application settings ``autoreload``, ``compiled_template_cache``,
``static_hash_cache``, and ``serve_traceback`` can be used to control
individual aspects of debug mode.
`.HTTPRequest.query_arguments` and `.HTTPRequest.body_arguments` allow access
to arguments without intermingling those from the query string with those
from the request body.
-* `.websocket_connect` now returns an error immediately for refused connections
- instead of waiting for the timeout.
-* Exceptions will no longer be logged twice when using both ``@asynchronous``
- and ``@gen.coroutine``
-* Swallow a spurious exception from ``set_nodelay`` when a connection
- has been reset.
-* Coroutines may now yield dicts in addition to lists to wait for
- multiple tasks in parallel.
-* Fix an error from `tornado.log.enable_pretty_logging` when
- `sys.stderr` does not have an ``isatty`` method.
-* `.WebSocketClientConnection` now has a ``close`` method.
+* `.RequestHandler.decode_argument` and related methods now raise
+ an ``HTTPError(400)`` instead of `UnicodeDecodeError` when the
+ argument could not be decoded.
+* `.RequestHandler.clear_all_cookies` now accepts ``domain`` and ``path``
+ arguments, just like `~.RequestHandler.clear_cookie`.
* It is now possible to specify handlers by name when using the `.URLSpec`
class.
-* On Python 2.6, ``simple_httpclient`` now uses TLSv1 instead of SSLv3.
-* Added `.GoogleOAuth2Mixin` support authentication to Google services
- with OAuth 2 instead of OpenID and OAuth 1.
* `.Application` now accepts 4-tuples to specify the ``name`` parameter
(which previously required constructing a `.URLSpec` object instead of
a tuple).
-* ``simple_httpclient`` now enforces the connect timeout during DNS resolution.
-* Tornado now depends on the `backports.ssl_match_hostname
- <https://pypi.python.org/pypi/backports.ssl_match_hostname>`_ when
- running on Python 2. This will be installed automatically when using ``pip``
- or ``easy_install``
-* Tornado now includes an optional C extension module, which greatly improves
- performance of websockets. This extension will be built automatically
- if a C compiler is found at install time.
-* The `tornado.platform.asyncio` module provides integration with the
- ``asyncio`` module introduced in Python 3.4.
-* Malformed ``x-www-form-urlencoded`` request bodies will now log a warning
- and continue instead of causing the request to fail (similar to the existing
- handling of malformed ``multipart/form-data`` bodies. This is done mainly
- because some libraries send this content type by default even when the data
- is not form-encoded.
+* Fixed an incorrect error message when handler methods return a value
+ other than None or a Future.
+* Exceptions will no longer be logged twice when using both ``@asynchronous``
+ and ``@gen.coroutine``
+
+
+`tornado.websocket`
+~~~~~~~~~~~~~~~~~~~
+
+* `.WebSocketHandler.write_message` now raises `.WebSocketClosedError` instead
+ of `AttributeError` when the connection has been closed.
+* `.websocket_connect` now accepts preconstructed ``HTTPRequest`` objects.
+* Fix a bug with `.WebSocketHandler` when used with some proxies that
+ unconditionally modify the ``Connection`` header.
+* `.websocket_connect` now returns an error immediately for refused connections
+ instead of waiting for the timeout.
+* `.WebSocketClientConnection` now has a ``close`` method.
+
+`tornado.wsgi`
+~~~~~~~~~~~~~~
+
+* `.WSGIContainer` now calls the iterable's ``close()`` method even if
+ an error is raised, in compliance with the spec.