1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
What's new in Tornado 4.1
=========================
Feb 7, 2015
-----------
Highlights
~~~~~~~~~~
* If a `.Future` contains an exception but that exception is never
examined or re-raised (e.g. by yielding the `.Future`), a stack
trace will be logged when the `.Future` is garbage-collected.
* New class `tornado.gen.WaitIterator` provides a way to iterate
over ``Futures`` in the order they resolve.
* The `tornado.websocket` module now supports compression via the
"permessage-deflate" extension. Override
`.WebSocketHandler.get_compression_options` to enable on the server
side, and use the ``compression_options`` keyword argument to
`.websocket_connect` on the client side.
* When the appropriate packages are installed, it is possible to yield
`asyncio.Future` or Twisted ``Defered`` objects in Tornado coroutines.
Backwards-compatibility notes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* `.HTTPServer` now calls ``start_request`` with the correct
arguments. This change is backwards-incompatible, affecting any
application which implemented `.HTTPServerConnectionDelegate` by
following the example of `.Application` instead of the documented
method signatures.
`tornado.concurrent`
~~~~~~~~~~~~~~~~~~~~
* If a `.Future` contains an exception but that exception is never
examined or re-raised (e.g. by yielding the `.Future`), a stack
trace will be logged when the `.Future` is garbage-collected.
* `.Future` now catches and logs exceptions in its callbacks.
``tornado.curl_httpclient``
~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ``tornado.curl_httpclient`` now supports request bodies for ``PATCH``
and custom methods.
* ``tornado.curl_httpclient`` now supports resubmitting bodies after
following redirects for methods other than ``POST``.
* ``curl_httpclient`` now runs the streaming and header callbacks on
the IOLoop.
* ``tornado.curl_httpclient`` now uses its own logger for debug output
so it can be filtered more easily.
`tornado.gen`
~~~~~~~~~~~~~
* New class `tornado.gen.WaitIterator` provides a way to iterate
over ``Futures`` in the order they resolve.
* When the `~functools.singledispatch` library is available (standard on
Python 3.4, available via ``pip install singledispatch`` on older versions),
the `.convert_yielded` function can be used to make other kinds of objects
yieldable in coroutines.
* New function `tornado.gen.sleep` is a coroutine-friendly
analogue to `time.sleep`.
* ``gen.engine`` now correctly captures the stack context for its callbacks.
`tornado.httpclient`
~~~~~~~~~~~~~~~~~~~~
* `tornado.httpclient.HTTPRequest` accepts a new argument
``raise_error=False`` to suppress the default behavior of raising an
error for non-200 response codes.
`tornado.httpserver`
~~~~~~~~~~~~~~~~~~~~
* `.HTTPServer` now calls ``start_request`` with the correct
arguments. This change is backwards-incompatible, afffecting any
application which implemented `.HTTPServerConnectionDelegate` by
following the example of `.Application` instead of the documented
method signatures.
* `.HTTPServer` now tolerates extra newlines which are sometimes inserted
between requests on keep-alive connections.
* `.HTTPServer` can now use keep-alive connections after a request
with a chunked body.
* `.HTTPServer` now always reports ``HTTP/1.1`` instead of echoing
the request version.
`tornado.httputil`
~~~~~~~~~~~~~~~~~~
* New function `tornado.httputil.split_host_and_port` for parsing
the ``netloc`` portion of URLs.
* The ``context`` argument to `.HTTPServerRequest` is now optional,
and if a context is supplied the ``remote_ip`` attribute is also optional.
* `.HTTPServerRequest.body` is now always a byte string (previously the default
empty body would be a unicode string on python 3).
* Header parsing now works correctly when newline-like unicode characters
are present.
* Header parsing again supports both CRLF and bare LF line separators.
* Malformed ``multipart/form-data`` bodies will always be logged
quietly instead of raising an unhandled exception; previously
the behavior was inconsistent depending on the exact error.
`tornado.ioloop`
~~~~~~~~~~~~~~~~
* The ``kqueue`` and ``select`` IOLoop implementations now report
writeability correctly, fixing flow control in IOStream.
* When a new `.IOLoop` is created, it automatically becomes "current"
for the thread if there is not already a current instance.
* New method `.PeriodicCallback.is_running` can be used to see
whether the `.PeriodicCallback` has been started.
`tornado.iostream`
~~~~~~~~~~~~~~~~~~
* `.IOStream.start_tls` now uses the ``server_hostname`` parameter
for certificate validation.
* `.SSLIOStream` will no longer consume 100% CPU after certain error conditions.
* `.SSLIOStream` no longer logs ``EBADF`` errors during the handshake as they
can result from nmap scans in certain modes.
`tornado.options`
~~~~~~~~~~~~~~~~~
* `~tornado.options.parse_config_file` now always decodes the config
file as utf8 on Python 3.
* `tornado.options.define` more accurately finds the module defining the
option.
``tornado.platform.asyncio``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* It is now possible to yield ``asyncio.Future`` objects in coroutines
when the `~functools.singledispatch` library is available and
``tornado.platform.asyncio`` has been imported.
* New methods `tornado.platform.asyncio.to_tornado_future` and
`~tornado.platform.asyncio.to_asyncio_future` convert between
the two libraries' `.Future` classes.
``tornado.platform.twisted``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* It is now possible to yield ``Deferred`` objects in coroutines
when the `~functools.singledispatch` library is available and
``tornado.platform.twisted`` has been imported.
`tornado.tcpclient`
~~~~~~~~~~~~~~~~~~~
* `.TCPClient` will no longer raise an exception due to an ill-timed
timeout.
`tornado.tcpserver`
~~~~~~~~~~~~~~~~~~~
* `.TCPServer` no longer ignores its ``read_chunk_size`` argument.
`tornado.testing`
~~~~~~~~~~~~~~~~~
* `.AsyncTestCase` has better support for multiple exceptions. Previously
it would silently swallow all but the last; now it raises the first
and logs all the rest.
* `.AsyncTestCase` now cleans up `.Subprocess` state on ``tearDown`` when
necessary.
`tornado.web`
~~~~~~~~~~~~~
* The ``asynchronous`` decorator now understands `concurrent.futures.Future`
in addition to `tornado.concurrent.Future`.
* `.StaticFileHandler` no longer logs a stack trace if the connection is
closed while sending the file.
* `.RequestHandler.send_error` now supports a ``reason`` keyword
argument, similar to `tornado.web.HTTPError`.
* `.RequestHandler.locale` now has a property setter.
* `.Application.add_handlers` hostname matching now works correctly with
IPv6 literals.
* Redirects for the `.Application` ``default_host`` setting now match
the request protocol instead of redirecting HTTPS to HTTP.
* Malformed ``_xsrf`` cookies are now ignored instead of causing
uncaught exceptions.
* ``Application.start_request`` now has the same signature as
`.HTTPServerConnectionDelegate.start_request`.
`tornado.websocket`
~~~~~~~~~~~~~~~~~~~
* The `tornado.websocket` module now supports compression via the
"permessage-deflate" extension. Override
`.WebSocketHandler.get_compression_options` to enable on the server
side, and use the ``compression_options`` keyword argument to
`.websocket_connect` on the client side.
* `.WebSocketHandler` no longer logs stack traces when the connection
is closed.
* `.WebSocketHandler.open` now accepts ``*args, **kw`` for consistency
with ``RequestHandler.get`` and related methods.
* The ``Sec-WebSocket-Version`` header now includes all supported versions.
* `.websocket_connect` now has a ``on_message_callback`` keyword argument
for callback-style use without ``read_message()``.
|