What’s new in Tornado 3.1
Jun 15, 2013
- Many reference cycles have been broken up throughout the package,
allowing for more efficient garbage collection on CPython.
- Silenced some log messages when connections are opened and immediately
closed (i.e. port scans), or other situations related to closed
- Various small speedups: HTTPHeaders case normalization, UIModule
proxy objects, precompile some regexes.
- OAuthMixin always sends oauth_version=1.0 in its
request as required by the spec.
- FacebookGraphMixin now uses self._FACEBOOK_BASE_URL
in facebook_request to allow the base url to be
- The authenticate_redirect and authorize_redirect methods in the
tornado.auth mixin classes all now return Futures. These methods
are asynchronous in OAuthMixin and derived classes, although they
do not take a callback. The Future these methods return must be
yielded if they are called from a function decorated with gen.coroutine
(but not gen.engine).
- TwitterMixin now uses /account/verify_credentials to get information
about the logged-in user, which is more robust against changing screen
- The demos directory (in the source distribution) has a new
twitter demo using TwitterMixin.
- Fixed a potential memory leak with long chains of tornado.gen coroutines.
- tornado.httpclient.HTTPRequest takes a new argument auth_mode,
which can be either basic or digest. Digest authentication
is only supported with tornado.curl_httpclient.
- tornado.curl_httpclient no longer goes into an infinite loop when
pycurl returns a negative timeout.
- curl_httpclient now supports the PATCH and OPTIONS methods
without the use of allow_nonstandard_methods=True.
- Worked around a class of bugs in libcurl that would result in
errors from IOLoop.update_handler in various scenarios including
digest authentication and socks proxies.
- The TCP_NODELAY flag is now set when appropriate in simple_httpclient.
- simple_httpclient no longer logs exceptions, since those exceptions
are made available to the caller as HTTPResponse.error.
- tornado.httpserver.HTTPServer handles malformed HTTP headers more
- HTTPServer now supports lists of IPs in X-Forwarded-For
(it chooses the last, i.e. nearest one).
- Memory is now reclaimed promptly on CPython when an HTTP request
fails because it exceeded the maximum upload size.
- The TCP_NODELAY flag is now set when appropriate in HTTPServer.
- The HTTPServer no_keep_alive option is now respected with
HTTP 1.0 connections that explicitly pass Connection: keep-alive.
- The Connection: keep-alive check for HTTP 1.0 connections is now
- The str and repr of tornado.httpserver.HTTPRequest no longer
include the request body, reducing log spam on errors (and potential
exposure/retention of private data).
- The cache used in HTTPHeaders will no longer grow without bound.
- Some IOLoop implementations (such as pyzmq) accept objects
other than integer file descriptors; these objects will now have
their .close() method called when the IOLoop` is closed with
- The stub handles left behind by IOLoop.remove_timeout will now get
cleaned up instead of waiting to expire.
- Fixed a bug in BaseIOStream.read_until_close that would sometimes
cause data to be passed to the final callback instead of the streaming
- The IOStream close callback is now run more reliably if there is
an exception in _try_inline_read.
- New method BaseIOStream.set_nodelay can be used to set the
- Fixed a case where errors in SSLIOStream.connect (and
SimpleAsyncHTTPClient) were not being reported correctly.
- The default Resolver implementation now works on Solaris.
- Resolver now has a close method.
- Fixed a potential CPU DoS when tornado.netutil.ssl_match_hostname
is used on certificates with an abusive wildcard pattern.
- All instances of ThreadedResolver now share a single thread pool,
whose size is set by the first one to be created (or the static
- ExecutorResolver is now documented for public use.
- bind_sockets now works in configurations with incomplete IPv6 support.
- tornado.process.Subprocess no longer leaks file descriptors into
the child process, which fixes a problem in which the child could not
detect that the parent process had closed its stdin pipe.
- Subprocess.set_exit_callback now works for subprocesses created
without an explicit io_loop parameter.
- Some internal names used by the template system have been changed;
now all “reserved” names in templates start with _tt_.
- Fixed an exception in WSGIContainer when the connection is closed
while output is being written.