# What’s new in Tornado 6.1.0

## Oct 30, 2020

### Deprecation notice

- This is the last release of Tornado to support Python 3.5. Future versions will require Python 3.6 or newer.

### General changes

- Windows support has been improved. Tornado is now compatible with the proactor event loop (which became the default in Python 3.8) by automatically falling back to running a selector in a second thread. This means that it is no longer necessary to explicitly configure a selector event loop, although doing so may improve performance. This does not change the fact that Tornado is significantly less scalable on Windows than on other platforms.

- Binary wheels are now provided for Windows, MacOS, and Linux (amd64 and arm64).

### `tornado.gen`

- `coroutine` now has better support for the Python 3.7+ `contextvars` module. In particular, the `ContextVar.reset` method is now supported.

### `tornado.http1connection`

- `HEAD` requests to handlers that used chunked encoding no longer produce malformed output.

- Certain kinds of malformed `gzip` data no longer cause an infinite loop.

### `tornado.httpclient`

- Setting `decompress_response=False` now works correctly with `curl_httpclient`.

- Mixing requests with and without proxies works correctly in `curl_httpclient` (assuming the version of pycurl is recent enough).

- A default `User-Agent` of `Tornado/$VERSION` is now used if the `user_agent` parameter is not specified.

- After a 303 redirect, `tornado.simple_httpclient` always uses `GET`. Previously this would use `GET` if the original request was a `POST` and would otherwise reuse the original request method. For `curl_httpclient`, the behavior depends on the version of `libcurl` (with the most recent versions using `GET` after 303 regardless of the original method).

- Setting `request_timeout` and/or `connect_timeout` to zero is now supported to disable the timeout.

### `tornado.httputil`

- Header parsing is now faster.

- `parse_body_arguments` now accepts incompletely-escaped non-ASCII inputs.

### `tornado.iostream`

- `ssl.CertificateError` during the SSL handshake is now handled correctly.

- Reads that are resolved while the stream is closing are now handled correctly.

### `tornado.log`

- When colored logging is enabled, `logging.CRITICAL` messages are now recognized and colored magenta.

### `tornado.netutil`

- `EADDRNOTAVAIL` is now ignored when binding to `localhost` with IPv6. This error is common in docker.

### `tornado.platform.asyncio`

- `AnyThreadEventLoopPolicy` now also configures a selector event loop for these threads (the proactor event loop only works on the main thread)

### `tornado.platform.auto`

- The `set_close_exec` function has been removed.

### `tornado.testing`

- `ExpectLog` now has a `level` argument to ensure that the given log level is enabled.

### `tornado.web`

- `RedirectHandler.get` now accepts keyword arguments.

- When sending 304 responses, more headers (including `Allow`) are now preserved.

- `reverse_url` correctly handles escaped characters in the regex route.

- Default `Etag` headers are now generated with SHA-512 instead of MD5.

### `tornado.websocket`

- The `ping_interval` timer is now stopped when the connection is closed.

- `websocket_connect` now raises an error when it encounters a redirect instead of hanging.