# What’s new in Tornado 2.2

## Jan 30, 2012

### Highlights

- Updated and expanded WebSocket support.
- Improved compatibility in the Twisted/Tornado bridge.
- Template errors now generate better stack traces.
- Better exception handling in `tornado.gen`.

### Security fixes

- `tornado.simple_httpclient` now disables SSLv2 in all cases. Previously SSLv2 would be allowed if the Python interpreter was linked against a pre-1.0 version of OpenSSL.

### Backwards-incompatible changes

- `tornado.process.fork_processes` now raises `SystemExit` if all child processes exit cleanly rather than returning `None`. The old behavior was surprising and inconsistent with most of the documented examples of this function (which did not check the return value).
- On Python 2.6, `tornado.simple_httpclient` only supports SSLv3. This is because Python 2.6 does not expose a way to support both SSLv3 and TLSv1 without also supporting the insecure SSLv2.
- `tornado.websocket` no longer supports the older “draft 76” version of the websocket protocol by default, although this version can be enabled by overriding `tornado.websocket.WebSocketHandler.allow_draft76`.

### `tornado.httpclient`

- `SimpleAsyncHTTPClient` no longer hangs on `HEAD` requests, responses with no content, or empty `POST`/`PUT` response bodies.
- `SimpleAsyncHTTPClient` now supports 303 and 307 redirect codes.
- `tornado.curl_httpclient` now accepts non-integer timeouts.
- `tornado.curl_httpclient` now supports basic authentication with an empty password.

### `tornado.httpserver`

- `HTTPServer` with `xheaders=True` will no longer accept `X-Real-IP` headers that don’t look like valid IP addresses.
- `HTTPServer` now treats the `Connection` request header as case-insensitive.

### `tornado.ioloop` and `tornado.iostream`

- `IOStream.write` now works correctly when given an empty string.
- `IOStream.read_until` (and `read_until_regex`) now perform better when there is a lot of buffered data, which improves peformance of `SimpleAsyncHTTPClient` when downloading files with lots of chunks.
- `SSLIOStream` now works correctly when `ssl_version` is set to a value other than `SSLv23`.
- Idle `IOLoops` no longer wake up several times a second.
- `tornado.ioloop.PeriodicCallback` no longer triggers duplicate callbacks when stopped and started repeatedly.

### `tornado.template`

- Exceptions in template code will now show better stack traces that reference lines from the original template file.
- `{#` and `#}` can now be used for comments (and unlike the old `{% comment %}` directive, these can wrap other template directives).
- Template directives may now span multiple lines.

### `tornado.web`

- Now behaves better when given malformed `Cookie` headers
- `RequestHandler.redirect` now has a `status` argument to send status codes other than 301 and 302.
- New method `RequestHandler.on_finish` may be overridden for post-request processing (as a counterpart to `RequestHandler.prepare`)
- `StaticFileHandler` now outputs `Content-Length` and `Etag` headers on `HEAD` requests.
- `StaticFileHandler` now has overridable `get_version` and `parse_url_path` methods for use in subclasses.
- `RequestHandler.static_url` now takes an `include_host` parameter (in addition to the old support for the `RequestHandler.include_host` attribute).

### `tornado.websocket`

- Updated to support the latest version of the protocol, as finalized in RFC 6455.
- Many bugs were fixed in all supported protocol versions.
- `tornado.websocket` no longer supports the older “draft 76” version of the websocket protocol by default, although this version can be enabled by overriding `tornado.websocket.WebSocketHandler.allow_draft76`.
- `WebSocketHandler.write_message` now accepts a `binary` argument to send binary messages.
- Subprotocols (i.e. the `Sec-WebSocket-Protocol` header) are now supported; see the `WebSocketHandler.select_subprotocol` method for details.
- `.WebSocketHandler.get_websocket_scheme` can be used to select the appropriate url scheme (`ws://` or `wss://`) in cases where `HTTPRequest.protocol` is not set correctly.

### Other modules

- `tornado.auth.TwitterMixin.authenticate_redirect` now takes a `callback_uri` parameter.
- `tornado.auth.TwitterMixin.twitter_request` now accepts both URLs and partial paths (complete URLs are useful for the search API which follows different patterns).
- Exception handling in `tornado.gen` has been improved. It is now possible to catch exceptions thrown by a `Task`.
- `tornado.netutil.bind_sockets` now works when `getaddrinfo` returns duplicate addresses.
- `tornado.platform.twisted` compatibility has been significantly improved. Twisted version 11.1.0 is now supported in addition to 11.0.0.
- `tornado.process.fork_processes` correctly reseeds the `random` module even when `os.urandom` is not implemented.
- `tornado.testing.main` supports a new flag `--exception_on_interrupt`, which can be set to false to make `Ctrl-C` kill the process more reliably (at the expense of stack traces when it does so).
- `tornado.version_info` is now a four-tuple so official releases can be distinguished from development branches.