What’s new in Tornado 3.1¶
Jun 15, 2013¶
Multiple modules¶
- 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 connections.
- Various small speedups:
HTTPHeaders
case normalization,UIModule
proxy objects, precompile some regexes.
tornado.auth
¶
OAuthMixin
always sendsoauth_version=1.0
in its request as required by the spec.FacebookGraphMixin
now usesself._FACEBOOK_BASE_URL
infacebook_request
to allow the base url to be overridden.- The
authenticate_redirect
andauthorize_redirect
methods in thetornado.auth
mixin classes all now return Futures. These methods are asynchronous inOAuthMixin
and derived classes, although they do not take a callback. TheFuture
these methods return must be yielded if they are called from a function decorated withgen.coroutine
(but notgen.engine
). TwitterMixin
now uses/account/verify_credentials
to get information about the logged-in user, which is more robust against changing screen names.- The
demos
directory (in the source distribution) has a newtwitter
demo usingTwitterMixin
.
tornado.escape
¶
url_escape
andurl_unescape
have a newplus
argument (defaulting to True for consistency with the previous behavior) which specifies whether they work likeurllib.parse.unquote
orurllib.parse.unquote_plus
.
tornado.gen
¶
- Fixed a potential memory leak with long chains of
tornado.gen
coroutines.
tornado.httpclient
¶
tornado.httpclient.HTTPRequest
takes a new argumentauth_mode
, which can be eitherbasic
ordigest
. Digest authentication is only supported withtornado.curl_httpclient
.tornado.curl_httpclient
no longer goes into an infinite loop when pycurl returns a negative timeout.curl_httpclient
now supports thePATCH
andOPTIONS
methods without the use ofallow_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 insimple_httpclient
. simple_httpclient
no longer logs exceptions, since those exceptions are made available to the caller asHTTPResponse.error
.
tornado.httpserver
¶
tornado.httpserver.HTTPServer
handles malformed HTTP headers more gracefully.HTTPServer
now supports lists of IPs inX-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 inHTTPServer
. - The
HTTPServer
no_keep_alive
option is now respected with HTTP 1.0 connections that explicitly passConnection: keep-alive
. - The
Connection: keep-alive
check for HTTP 1.0 connections is now case-insensitive. - The
str
andrepr
oftornado.httpserver.HTTPRequest
no longer include the request body, reducing log spam on errors (and potential exposure/retention of private data).
tornado.httputil
¶
- The cache used in
HTTPHeaders
will no longer grow without bound.
tornado.ioloop
¶
- Some
IOLoop
implementations (such aspyzmq
) accept objects other than integer file descriptors; these objects will now have their.close()
method called when theIOLoop` is closed with ``all_fds=True
. - The stub handles left behind by
IOLoop.remove_timeout
will now get cleaned up instead of waiting to expire.
tornado.iostream
¶
- Fixed a bug in
BaseIOStream.read_until_close
that would sometimes cause data to be passed to the final callback instead of the streaming callback. - 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 theTCP_NODELAY
flag. - Fixed a case where errors in
SSLIOStream.connect
(andSimpleAsyncHTTPClient
) were not being reported correctly.
tornado.locale
¶
Locale.format_date
now works on Python 3.
tornado.netutil
¶
- The default
Resolver
implementation now works on Solaris. Resolver
now has aclose
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 staticResolver.configure
method). ExecutorResolver
is now documented for public use.bind_sockets
now works in configurations with incomplete IPv6 support.
tornado.options
¶
tornado.options.define
withmultiple=True
now works on Python 3.tornado.options.options
and otherOptionParser
instances support some new dict-like methods:items()
, iteration over keys, and (read-only) access to options with square braket syntax.OptionParser.group_dict
returns all options with a given group name, andOptionParser.as_dict
returns all options.
tornado.process
¶
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 explicitio_loop
parameter.
tornado.stack_context
¶
tornado.stack_context
has been rewritten and is now much faster.- New function
run_with_stack_context
facilitates the use of stack contexts with coroutines.
tornado.tcpserver
¶
- The constructors of
TCPServer
andHTTPServer
now take amax_buffer_size
keyword argument.
tornado.template
¶
- Some internal names used by the template system have been changed;
now all “reserved” names in templates start with
_tt_
.
tornado.testing
¶
tornado.testing.AsyncTestCase.wait
now raises the correct exception when it has been modified bytornado.stack_context
.tornado.testing.gen_test
can now be called as@gen_test(timeout=60)
to give some tests a longer timeout than others.- The environment variable
ASYNC_TEST_TIMEOUT
can now be set to override the default timeout forAsyncTestCase.wait
andgen_test
. bind_unused_port
now passesNone
instead of0
as the port togetaddrinfo
, which works better with some unusual network configurations.
tornado.util
¶
tornado.util.import_object
now works with top-level module names that do not contain a dot.tornado.util.import_object
now consistently raisesImportError
instead ofAttributeError
when it fails.
tornado.web
¶
- The
handlers
list passed to thetornado.web.Application
constructor andadd_handlers
methods can now contain lists in addition to tuples andURLSpec
objects. tornado.web.StaticFileHandler
now works on Windows when the client passes anIf-Modified-Since
timestamp before 1970.- New method
RequestHandler.log_exception
can be overridden to customize the logging behavior when an exception is uncaught. Most apps that currently override_handle_request_exception
can now use a combination ofRequestHandler.log_exception
andwrite_error
. RequestHandler.get_argument
now raisesMissingArgumentError
(a subclass oftornado.web.HTTPError
, which is what it raised previously) if the argument cannot be found.Application.reverse_url
now usesurl_escape
withplus=False
, i.e. spaces are encoded as%20
instead of+
.- Arguments extracted from the url path are now decoded with
url_unescape
withplus=False
, so plus signs are left as-is instead of being turned into spaces. RequestHandler.send_error
will now only be called once per request, even if multiple exceptions are caught by the stack context.- The
tornado.web.asynchronous
decorator is no longer necessary for methods that return aFuture
(i.e. those that use thegen.coroutine
orreturn_future
decorators) RequestHandler.prepare
may now be asynchronous if it returns aFuture
. Theasynchronous
decorator is not used withprepare
; one of theFuture
-related decorators should be used instead.RequestHandler.current_user
may now be assigned to normally.RequestHandler.redirect
no longer silently strips control characters and whitespace. It is now an error to pass control characters, newlines or tabs.StaticFileHandler
has been reorganized internally and now has additional extension points that can be overridden in subclasses.StaticFileHandler
now supports HTTPRange
requests.StaticFileHandler
is still not suitable for files too large to comfortably fit in memory, butRange
support is necessary in some browsers to enable seeking of HTML5 audio and video.StaticFileHandler
now uses longer hashes by default, and uses the same hashes forEtag
as it does for versioned urls.StaticFileHandler.make_static_url
andRequestHandler.static_url
now have an additional keyword argumentinclude_version
to suppress the url versioning.StaticFileHandler
now reads its file in chunks, which will reduce memory fragmentation.- Fixed a problem with the
Date
header and cookie expiration dates when the system locale is set to a non-english configuration.
tornado.websocket
¶
WebSocketHandler
now catchesStreamClosedError
and runson_close
immediately instead of logging a stack trace.- New method
WebSocketHandler.set_nodelay
can be used to set theTCP_NODELAY
flag.
tornado.wsgi
¶
- Fixed an exception in
WSGIContainer
when the connection is closed while output is being written.