What's new in Tornado 1.0
=========================

July 22, 2010
-------------
    
::

    We are pleased to announce the release of Tornado 1.0, available
    from
    http://github.com/downloads/facebook/tornado/tornado-1.0.tar.gz.
    There have been many changes since version 0.2; here are some of
    the highlights:
    
    New features:
    * Improved support for running other WSGI applications in a
      Tornado server (tested with Django and CherryPy)
    * Improved performance on Mac OS X and BSD (kqueue-based IOLoop),
      and experimental support for win32
    * Rewritten AsyncHTTPClient available as
      tornado.httpclient.AsyncHTTPClient2 (this will become the
      default in a future release)
    * Support for standard .mo files in addition to .csv in the locale
      module
    * Pre-forking support for running multiple Tornado processes at
      once (see HTTPServer.start())
    * SSL and gzip support in HTTPServer
    * reverse_url() function refers to urls from the Application
      config by name from templates and RequestHandlers
    * RequestHandler.on_connection_close() callback is called when the
      client has closed the connection (subject to limitations of the
      underlying network stack, any proxies, etc)
    * Static files can now be served somewhere other than /static/ via
      the static_url_prefix application setting
    * URL regexes can now use named groups ("(?P<name>)") to pass
      arguments to get()/post() via keyword instead of position
    * HTTP header dictionary-like objects now support multiple values
      for the same header via the get_all() and add() methods.
    * Several new options in the httpclient module, including
      prepare_curl_callback and header_callback
    * Improved logging configuration in tornado.options.
    * UIModule.html_body() can be used to return html to be inserted
      at the end of the document body.
    
    Backwards-incompatible changes:
    * RequestHandler.get_error_html() now receives the exception
      object as a keyword argument if the error was caused by an
      uncaught exception.
    * Secure cookies are now more secure, but incompatible with
      cookies set by Tornado 0.2.  To read cookies set by older
      versions of Tornado, pass include_name=False to
      RequestHandler.get_secure_cookie()
    * Parameters passed to RequestHandler.get/post() by extraction
      from the path now have %-escapes decoded, for consistency with
      the processing that was already done with other query
      parameters.
    
    Many thanks to everyone who contributed patches, bug reports, and
    feedback that went into this release!
    
    -Ben
