### Navigation
- [index](# "General Index")
- [modules](# "Python Module Index") |
- [next](# "What鈥檚 new in Tornado 2.2.1") |
- [previous](# "What鈥檚 new in Tornado 2.4") |
- [Tornado 4.4.dev1 documentation](#) »
- [Release notes](#) »
# What's new in Tornado 2.3
### May 31, 2012
### HTTP clients
- [`tornado.httpclient.HTTPClient`](# "tornado.httpclient.HTTPClient") now supports the same constructorkeyword arguments as [`AsyncHTTPClient`](# "tornado.httpclient.AsyncHTTPClient").
- The `max_clients` keyword argument to [`AsyncHTTPClient.configure`](# "tornado.httpclient.AsyncHTTPClient.configure") now works.
- `tornado.simple_httpclient` now supports the `OPTIONS` and `PATCH`HTTP methods.
- `tornado.simple_httpclient` is better about closing its socketsinstead of leaving them for garbage collection.
- `tornado.simple_httpclient` correctly verifies SSL certificates forURLs containing IPv6 literals (This bug affected Python 2.5 and 2.6).
- `tornado.simple_httpclient` no longer includes basic auth credentialsin the `Host` header when those credentials are extracted from the URL.
- `tornado.simple_httpclient` no longer modifies the caller-supplied headerdictionary, which caused problems when following redirects.
- `tornado.curl_httpclient` now supports client SSL certificates (usingthe same `client_cert` and `client_key` arguments as`tornado.simple_httpclient`)
### HTTP Server
- [`HTTPServer`](# "tornado.httpserver.HTTPServer") now works correctly with paths starting with `//`
- `HTTPHeaders.copy` (inherited from [`dict.copy`](https://docs.python.org/3.4/library/stdtypes.html#dict.copy "(in Python v3.4)") [https://docs.python.org/3.4/library/stdtypes.html#dict.copy]) now works correctly.
- `HTTPConnection.address` is now always the socket address, even for non-IPsockets. `HTTPRequest.remote_ip` is still always an IP-style address(fake data is used for non-IP sockets)
- Extra data at the end of multipart form bodies is now ignored, which fixesa compatibility problem with an iOS HTTP client library.
### `IOLoop` and `IOStream`
- [`IOStream`](# "tornado.iostream.IOStream") now has an `error` attribute that can be used to determinewhy a socket was closed.
- `tornado.iostream.IOStream.read_until` and `read_until_regex` are muchfaster with large input.
- `IOStream.write` performs better when given very large strings.
- [`IOLoop.instance()`](# "tornado.ioloop.IOLoop.instance") is now thread-safe.
### `tornado.options`
- [`tornado.options`](# "tornado.options") options with `multiple=True` that are set more thanonce now overwrite rather than append. This makes it possible to overridevalues set in `parse_config_file` with `parse_command_line`.
- [`tornado.options`](# "tornado.options")`--help` output is now prettier.
- [`tornado.options.options`](# "tornado.options.options") now supports attribute assignment.
### `tornado.template`
- Template files containing non-ASCII (utf8) characters now work on Python 3regardless of the locale environment variables.
- Templates now support `else` clauses in`try`/`except`/`finally`/`else` blocks.
### `tornado.web`
- [`tornado.web.RequestHandler`](# "tornado.web.RequestHandler") now supports the `PATCH` HTTP method.Note that this means any existing methods named `patch` in`RequestHandler` subclasses will need to be renamed.
- [`tornado.web.addslash`](# "tornado.web.addslash") and `removeslash` decorators now send permanentredirects (301) instead of temporary (302).
- [`RequestHandler.flush`](# "tornado.web.RequestHandler.flush") now invokes its callback whether there was any datato flush or not.
- Repeated calls to [`RequestHandler.set_cookie`](# "tornado.web.RequestHandler.set_cookie") with the same name nowoverwrite the previous cookie instead of producing additional copies.
- `tornado.web.OutputTransform.transform_first_chunk` now takes and returnsa status code in addition to the headers and chunk. This is abackwards-incompatible change to an interface that was never technicallyprivate, but was not included in the documentation and does not appearto have been used outside Tornado itself.
- Fixed a bug on python versions before 2.6.5 when [`URLSpec`](# "tornado.web.URLSpec") regexesare constructed from unicode strings and keyword arguments are extracted.
- The `reverse_url` function in the template namespace now comes fromthe [`RequestHandler`](# "tornado.web.RequestHandler") rather than the [`Application`](# "tornado.web.Application"). (Unless overridden,[`RequestHandler.reverse_url`](# "tornado.web.RequestHandler.reverse_url") is just an alias for the [`Application`](# "tornado.web.Application")method).
- The `Etag` header is now returned on 304 responses to an `If-None-Match`request, improving compatibility with some caches.
- [`tornado.web`](# "tornado.web") will no longer produce responses with status code 304that also have entity headers such as `Content-Length`.
### Other modules
- [`tornado.auth.FacebookGraphMixin`](# "tornado.auth.FacebookGraphMixin") no longer sends `post_args` redundantlyin the url.
- The `extra_params` argument to [`tornado.escape.linkify`](# "tornado.escape.linkify") may now bea callable, to allow parameters to be chosen separately for each link.
- [`tornado.gen`](# "tornado.gen") no longer leaks `StackContexts` when a `@gen.engine` wrappedfunction is called repeatedly.
- [`tornado.locale.get_supported_locales`](# "tornado.locale.get_supported_locales") no longer takes a meaningless`cls` argument.
- [`StackContext`](# "tornado.stack_context.StackContext") instances now have a deactivation callback that can beused to prevent further propagation.
- [`tornado.testing.AsyncTestCase.wait`](# "tornado.testing.AsyncTestCase.wait") now resets its timeout on each call.
- [`tornado.wsgi.WSGIApplication`](# "tornado.wsgi.WSGIApplication") now parses arguments correctly on Python 3.
- Exception handling on Python 3 has been improved; previously some exceptionssuch as [`UnicodeDecodeError`](https://docs.python.org/3.4/library/exceptions.html#UnicodeDecodeError "(in Python v3.4)") [https://docs.python.org/3.4/library/exceptions.html#UnicodeDecodeError] would generate `TypeErrors`
© Copyright 2009-2016, The Tornado Authors. Created using [Sphinx](http://sphinx-doc.org/) 1.3.5.
- User's guide
- Introduction
- Asynchronous and non-Blocking I/O
- Coroutines
- Queue example - a concurrent web spider
- Structure of a Tornado web application
- Templates and UI
- Authentication and security
- Running and deploying
- Web framework
- tornado.web — RequestHandler and Application classes
- tornado.template — Flexible output generation
- tornado.escape — Escaping and string manipulation
- tornado.locale — Internationalization support
- tornado.websocket — Bidirectional communication to the browser
- HTTP servers and clients
- tornado.httpserver — Non-blocking HTTP server
- tornado.httpclient — Asynchronous HTTP client
- tornado.httputil — Manipulate HTTP headers and URLs
- tornado.http1connection – HTTP/1.x client/server implementation
- Asynchronous networking
- tornado.ioloop — Main event loop
- tornado.iostream — Convenient wrappers for non-blocking sockets
- tornado.netutil — Miscellaneous network utilities
- tornado.tcpclient — IOStream connection factory
- tornado.tcpserver — Basic IOStream-based TCP server
- Coroutines and concurrency
- tornado.gen — Simplify asynchronous code
- tornado.concurrent — Work with threads and futures
- tornado.locks – Synchronization primitives
- tornado.queues – Queues for coroutines
- tornado.process — Utilities for multiple processes
- Integration with other services
- tornado.auth — Third-party login with OpenID and OAuth
- tornado.wsgi — Interoperability with other Python frameworks and servers
- tornado.platform.asyncio — Bridge between asyncio and Tornado
- tornado.platform.caresresolver — Asynchronous DNS Resolver using C-Ares
- tornado.platform.twisted — Bridges between Twisted and Tornado
- Utilities
- tornado.autoreload — Automatically detect code changes in development
- tornado.log — Logging support
- tornado.options — Command-line parsing
- tornado.stack_context — Exception handling across asynchronous callbacks
- tornado.testing — Unit testing support for asynchronous code
- tornado.util — General-purpose utilities
- Frequently Asked Questions
- Release notes
- What's new in Tornado 4.3
- What's new in Tornado 4.2.1
- What's new in Tornado 4.2
- What's new in Tornado 4.1
- What's new in Tornado 4.0.2
- What's new in Tornado 4.0.1
- What's new in Tornado 4.0
- What's new in Tornado 3.2.2
- What's new in Tornado 3.2.1
- What's new in Tornado 3.2
- What's new in Tornado 3.1.1
- What's new in Tornado 3.1
- What's new in Tornado 3.0.2
- What's new in Tornado 3.0.1
- What's new in Tornado 3.0
- What's new in Tornado 2.4.1
- What's new in Tornado 2.4
- What's new in Tornado 2.3
- What's new in Tornado 2.2.1
- What's new in Tornado 2.2
- What's new in Tornado 2.1.1
- What's new in Tornado 2.1
- What's new in Tornado 2.0
- What's new in Tornado 1.2.1
- What's new in Tornado 1.2
- What's new in Tornado 1.1.1
- What's new in Tornado 1.1
- What's new in Tornado 1.0.1
- What's new in Tornado 1.0