What's new in Tornado 1.1
=========================

Sep 7, 2010
-----------

::
    
    We are pleased to announce the release of Tornado 1.1, available from
    http://github.com/downloads/facebook/tornado/tornado-1.1.tar.gz
    
    Changes in this release:
    * RequestHandler.async_callback and related functions in other classes
      are no longer needed in most cases (although it's harmless to continue
      using them).  Uncaught exceptions will now cause the request to be closed
      even in a callback.  If you're curious how this works, see the new
      tornado.stack_context module.
    * The new tornado.testing module contains support for unit testing
      asynchronous IOLoop-based code.
    * AsyncHTTPClient has been rewritten (the new implementation was
      available as AsyncHTTPClient2 in Tornado 1.0; both names are
      supported for backwards compatibility).
    * The tornado.auth module has had a number of updates, including support
      for OAuth 2.0 and the Facebook Graph API, and upgrading Twitter and
      Google support to OAuth 1.0a.
    * The websocket module is back and supports the latest version (76) of the
      websocket protocol.  Note that this module's interface is different
      from the websocket module that appeared in pre-1.0 versions of Tornado.
    * New method RequestHandler.initialize() can be overridden in subclasses
      to simplify handling arguments from URLSpecs.  The sequence of methods
      called during initialization is documented at
      http://tornadoweb.org/documentation#overriding-requesthandler-methods
    * get_argument() and related methods now work on PUT requests in addition
      to POST.
    * The httpclient module now supports HTTP proxies.
    * When HTTPServer is run in SSL mode, the SSL handshake is now non-blocking.
    * Many smaller bug fixes and documentation updates
    
    Backwards-compatibility notes:
    * While most users of Tornado should not have to deal with the stack_context
      module directly, users of worker thread pools and similar constructs may
      need to use stack_context.wrap and/or NullContext to avoid memory leaks.
    * The new AsyncHTTPClient still works with libcurl version 7.16.x, but it
      performs better when both libcurl and pycurl are at least version 7.18.2.
    * OAuth transactions started under previous versions of the auth module
      cannot be completed under the new module.  This applies only to the
      initial authorization process; once an authorized token is issued that
      token works with either version.
    
    Many thanks to everyone who contributed patches, bug reports, and feedback
    that went into this release!
    
    -Ben
