tornado.httpclient.HTTPClient now supports the same constructor
keyword arguments as .AsyncHTTPClient.
The max_clients keyword argument to .AsyncHTTPClient.configure now works.
tornado.simple_httpclient now supports the OPTIONS and PATCH
tornado.simple_httpclient is better about closing its sockets
instead of leaving them for garbage collection.
tornado.simple_httpclient correctly verifies SSL certificates for
URLs containing IPv6 literals (This bug affected Python 2.5 and 2.6).
tornado.simple_httpclient no longer includes basic auth credentials
in the Host header when those credentials are extracted from the URL.
tornado.simple_httpclient no longer modifies the caller-supplied header
dictionary, which caused problems when following redirects.
tornado.curl_httpclient now supports client SSL certificates (using
the same client_cert and client_key arguments as
.HTTPServer now works correctly with paths starting with //
HTTPHeaders.copy (inherited from dict.copy) now works correctly.
HTTPConnection.address is now always the socket address, even for non-IP
sockets. HTTPRequest.remote_ip is still always an IP-style address
(fake data is used for non-IP sockets)
Extra data at the end of multipart form bodies is now ignored, which fixes
a compatibility problem with an iOS HTTP client library.
IOLoop and IOStream
.IOStream now has an error attribute that can be used to determine
why a socket was closed.
tornado.iostream.IOStream.read_until and read_until_regex are much
faster with large input.
IOStream.write performs better when given very large strings.
.IOLoop.instance() is now thread-safe.
tornado.options options with multiple=True that are set more than
once now overwrite rather than append. This makes it possible to override
values set in parse_config_file with parse_command_line.
tornado.options --help output is now prettier.
tornado.options.options now supports attribute assignment.
Template files containing non-ASCII (utf8) characters now work on Python 3
regardless of the locale environment variables.
Templates now support else clauses in
tornado.web.RequestHandler now supports the PATCH HTTP method.
Note that this means any existing methods named patch in
RequestHandler subclasses will need to be renamed.
tornado.web.addslash and removeslash decorators now send permanent
redirects (301) instead of temporary (302).
.RequestHandler.flush now invokes its callback whether there was any data
to flush or not.
Repeated calls to .RequestHandler.set_cookie with the same name now
overwrite the previous cookie instead of producing additional copies.
tornado.web.OutputTransform.transform_first_chunk now takes and returns
a status code in addition to the headers and chunk. This is a
backwards-incompatible change to an interface that was never technically
private, but was not included in the documentation and does not appear
to have been used outside Tornado itself.
Fixed a bug on python versions before 2.6.5 when tornado.web.URLSpec regexes
are constructed from unicode strings and keyword arguments are extracted.
The reverse_url function in the template namespace now comes from
the .RequestHandler rather than the .Application. (Unless overridden,
.RequestHandler.reverse_url is just an alias for the .Application
The Etag header is now returned on 304 responses to an If-None-Match
request, improving compatibility with some caches.
tornado.web will no longer produce responses with status code 304
that also have entity headers such as Content-Length.
tornado.auth.FacebookGraphMixin no longer sends post_args redundantly
in the url.
The extra_params argument to tornado.escape.linkify may now be
a callable, to allow parameters to be chosen separately for each link.
tornado.gen no longer leaks StackContexts when a @gen.engine wrapped
function is called repeatedly.
tornado.locale.get_supported_locales no longer takes a meaningless
.StackContext instances now have a deactivation callback that can be
used to prevent further propagation.
tornado.testing.AsyncTestCase.wait now resets its timeout on each call.
tornado.wsgi.WSGIApplication now parses arguments correctly on Python 3.
Exception handling on Python 3 has been improved; previously some exceptions
such as UnicodeDecodeError would generate TypeErrors