Home | History | Annotate | Download | only in docs
      1 News
      2 ====
      3 
      4 .. contents::
      5 
      6 2.0.2
      7 -----
      8 
      9 * #22: Fix improper commas in request headers in wsgi_environ (https://bitbucket.org/ianb/paste/pull-request/22/fix-improper-commas-in-request-headers-in)
     10   Fixes issue #4 ("WSGI environ totally borked") (https://bitbucket.org/ianb/paste/issue/4/wsgi-environ-totally-borked)
     11 
     12 * #24: test_wsgirequest_charset: Use UTF-8 instead of iso-8859-1 (https://bitbucket.org/ianb/paste/pull-request/24/test_wsgirequest_charset-use-utf-8-instead)
     13   Fixes issue #7 ("Python 3 test failure") (https://bitbucket.org/ianb/paste/issue/7/python-3-test-failure)
     14 
     15 * #23: Replace cgi.parse_qsl w/ six.moves.urllib.parse.parse_qsl (https://bitbucket.org/ianb/paste/pull-request/23/replace-cgiparse_qsl-w)
     16   Fixes issue #8 ("cgi.parse_qsl is pending deprecation") (https://bitbucket.org/ianb/paste/issue/8/cgiparse_qsl-is-pending-deprecation)
     17 
     18 * #20: Escape CGI environment variables in HTTP 404 responses (https://bitbucket.org/ianb/paste/pull-request/20/escape-cgi-environment-variables-in-http)
     19 
     20 * #6: Add HTTP exception for new code 429 "Too Many Requests" (https://bitbucket.org/ianb/paste/pull-request/6/add-http-exception-for-new-code-429-too)
     21 
     22 * #25: replace ``has_key`` method to ``in`` operator #9 (https://bitbucket.org/ianb/paste/pull-request/25/replace-has_key-method-to-in-operator-9)
     23   Fixes #9 ("used methods removed from py3") (https://bitbucket.org/ianb/paste/issue/9/used-methods-removed-from-py3)
     24 
     25 * #5: Invalid error message when the socket is already in use (https://bitbucket.org/ianb/paste/issue/5/invalid-error-message-when-the-socket-is)
     26 
     27 2.0.1
     28 -----
     29 
     30 * Fix setup.py for six dependency: move the six dependency from extras_require
     31   to install_requires.
     32 
     33 * Port paste.proxy to Python 3.
     34 
     35 * Fix paste.exceptions.serial_number_generator.hash_identifier() on Python 3.
     36 
     37 * Fix paste.util.threadedprint.uninstall(). Rename duplicated uninstall()
     38   function to uninstall_stdin() and fix typo in variable name (_oldstin =>
     39   _oldstdin).
     40 
     41 * Add README.rst file.
     42 
     43 2.0
     44 ---
     45 
     46 * Experimental Python 3 support.
     47 
     48 * paste now requires the six module.
     49 
     50 * Drop support of Python 2.5 and older.
     51 
     52 * Fixed ``egg:Paste#cgi``
     53 
     54 * In ``paste.httpserver``: give a 100 Continue response even when the
     55   server has been configured as an HTTP/1.0 server (clients may send
     56   ``Expect: 100-Continue`` before they know the version), and wrap
     57   100 Continue ``environ['wsgi.input']`` files with LimitedLengthFile
     58   just like normal request bodies are wrapped, keeping WSGI
     59   applications from over-reading from the socket.
     60 
     61 * Fixed parsing of paths beginning with multiple forward slashes.
     62 
     63 * Add tox.ini to run tests with tox on Python 2.6, 2.7 and 3.4.
     64 
     65 1.7.5.1
     66 -------
     67 
     68 * Fix bug introduced in :mod:`paste.auth.auth_tkt` (with ``url_unquote``)
     69 
     70 1.7.5
     71 -----
     72 
     73 * Won't install ``tests/`` directory (also caused installation
     74   problems on some Mac systems).
     75 
     76 * Fixed problem with gzip middleware and zero-length responses.
     77 
     78 * Use ``X-Forwarded-For`` header in :mod:`paste.translogger`
     79 
     80 * Fixed problems with mimeparse code
     81 
     82 * Fixed some corner cases with CGI scripts
     83 
     84 * :mod:`paste.auth.auth_tkt` will URL-quote usernames, avoiding some
     85   errors with usernames with ``!`` in them.
     86 
     87 * Improve handling of errors in fetching error pages in
     88   :mod:`paste.errordocument`.
     89 
     90 1.7.4
     91 -----
     92 
     93 * Fix XSS bug (security issue) with not found handlers for
     94   :class:`paste.urlparser.StaticURLParser` and
     95   :class:`paste.urlmap.URLMap`.  If you ask for a path with
     96   ``/--><script>...`` that will be inserted in the error page and can
     97   execute Javascript.  Reported by Tim Wintle with further details
     98   from Georg-Christian Pranschke.
     99 
    100 * Replaced :func:`paste.util.mimeparse.desired_match`
    101 
    102 1.7.3.1
    103 -------
    104 
    105 * Removed directory name from 404 errors in
    106   :class:`paste.urlparser.StaticURLParser`.
    107 
    108 * Fixed packaging to include Javascript and images for
    109   :mod:`paste.evalexception`
    110 
    111 1.7.3
    112 -----
    113 
    114 * I got a fever and the only prescription is more :mod:`paste.cowbell`!
    115 
    116 * Fix :mod:`paste.httpserver` on Python 2.6.
    117 
    118 * Fix :mod:`paste.auth.cookie`, which would insert newlines for long
    119   cookies.
    120 
    121 * :mod:`paste.util.mimeparse` parses a single ``*`` in Accept headers
    122   (sent by IE 6).
    123 
    124 * Fix some problems with the ``wdg_validate`` middleware.
    125 
    126 * Improvements to :mod:`paste.auth.auth_tkt`: add httponly support,
    127   don't always aggressively set cookies without the
    128   ``wildcard_cookie`` option.  Also on logout, make cookies expire.
    129 
    130 * In :class:`paste.proxy.Proxy` handle Content-Length of -1.
    131 
    132 * In :mod:`paste.httpexceptions` avoid some unicode errors.
    133 
    134 * In :mod:`paste.httpserver` handle ``.read()`` from 100 Continue
    135   properly (because of a typo it was doing a readline).
    136 
    137 * Update ``paste.util.mimeparse`` from `upstream
    138   <http://code.google.com/p/mimeparse/>`_.
    139 
    140 1.7.2
    141 -----
    142 
    143 * In :mod:`paste.proxy`, added some more headers that are disallowed
    144   in WSGI (e.g., Keep-Alive).  Send Content-Length.  Also fix the
    145   missing query string when using :class:`paste.proxy.Proxy`
    146   (:class:`paste.proxy.TransparentProxy` already worked).
    147 
    148 * Make :mod:`paste.debug.prints` work with Google App Engine.
    149 
    150 * Make ``environ['wsgi.input']`` with :mod:`paste.httpserver` only
    151   have a ``seek`` method if it is wrapping something with a seek
    152   method (which usually it is not).
    153 
    154 * In :mod:`paste.httpserver` re-raise KeyboardInterrupt in worker
    155   threads.
    156 
    157 * Added support for the ``HttpOnly`` Cookie property to
    158   :mod:`paste.wsgiwrappers`
    159 
    160 * Added :func:`paste.reloader.add_file_callback`, which lets you watch
    161   files based on a callback.
    162 
    163 * Quiet Python 2.6 deprecation warnings.
    164 
    165 * Fix :mod:`paste.auth.cookie` generating bad headers.
    166 
    167 * Added :class:`paste.reloader.JythonMonitor` for an experimental,
    168   optimized reloader on Jython.
    169 
    170 1.7.1
    171 -----
    172 
    173 * Normalize and make absolute the paths passed to
    174   :class:`paste.urlparser.StaticURLParser` (before passing a
    175   relative-to-cwd path to that class would cause Forbidden errors).
    176 
    177 * Deprecate :func:`paste.fixture.setup_module`
    178 
    179 1.7
    180 ---
    181 
    182 * Fixed bug in :class:`paste.fixture.TestApp` that would submit forms
    183   with unnamed fields (like an unnamed submit button).  Also made
    184   checkboxes with no explicit ``value`` send ``on`` instead of
    185   ``checked`` (which is what browsers do).
    186 
    187 * Fixed bug in :mod:`paste.httpserver` where
    188   ``environ['wsgi.input'].readline(max_size)`` ignored the max_size
    189   argument, which can lead to large memory usage (from Jakub Stolarski)
    190 
    191 * Make :mod:`paste.cascade` notice sockets that have stopped producing
    192   data.  From Casey Zednick.
    193 
    194 * In :class:`paste.fixture.TestApp` Accept MultiDict values for the
    195   ``params`` argument in requests.  (Anything with a ``.items()``
    196   method will have its items encoded as the request parameters.)
    197 
    198 * Fix :mod:`paste.httpserver` to allow binding to port 0.
    199 
    200 * In :mod:`paste.auth.auth_tkt`, set the same cookies (with the same
    201   domains) in ``set_cookie`` as get unset in ``logout_user_cookie``.
    202 
    203 * In :mod:`paste.translogger` save REQUEST_METHOD in case it gets
    204   overridden somewhere (e.g., when using errordocuments POST would
    205   show up as GET).
    206 
    207 * Exceptions with unicode messages don't cause the collector to fail.
    208 
    209 * Sometimes :class:`paste.exceptions.errormiddleware.ErrorMiddleware`
    210   would not call start_response properly; this is fixed (from Andreas
    211   Kloecker).
    212 
    213 * :mod:`paste.fixture.TestApp` can store multiple cookie values
    214   (previously only one cookie was stored; from Andrey Lebedev)
    215 
    216 * ``u'' in TestApp(app).get('/')`` will work when the body isn't ASCII
    217   (before it would give a unicode error).  This problem wasn't present
    218   in the recommended `WebTest <http://pythonpaste.org/webtest/>`_.
    219 
    220 * :mod:`paste.debug.profile` won't break when content is served with no
    221   Content-Type.
    222 
    223 * Accept relative paths and paths with ``/../`` in them for
    224   :class:`paste.urlparser.StaticURLParser` (from Eric Larson).  Also fix
    225   problem with case normalization on Windows (from Ionel Maries
    226   Cristian).
    227 
    228 * :class:`paste.registry.StackedObjectProxy`'s now include the proxied object's names via
    229   ``__dir__`` (for Python 2.6).
    230 
    231 * Use ``environ['wsgi.file_wrapper']`` when available (in
    232   ``paste.fileapp``).
    233 
    234 * Make :mod:`paste.debug.prints` compatible with App Engine.
    235 
    236 * Fix the ``domain`` keyword in
    237   :meth:`paste.wsgiwrappers.WSGIResponse.delete_cookie`.
    238 
    239 1.6.1
    240 -----
    241 
    242 * Fixed bug in paste lint where PATH_INFO would become unicode.
    243 
    244 1.6
    245 ---
    246 
    247 * Make the import of ``socket.sslerror`` conditional in
    248   ``paste.exceptions.reporter`` (needed for Python interpreters
    249   compiled without SSL support).
    250 
    251 * In ``paste.proxy.TransparentProxy``, don't overwrite
    252   ``X-Forwarded-For`` header if it is already in the environment.
    253 
    254 * Added ``226 IM Used`` status code to ``paste.wsgiwrappers``
    255 
    256 * In ``paste.fixture.TestApp`` treat ``<image type="image">`` the same
    257   as a submit button.
    258 
    259 * Use ``OpenSSL.tsafe.Connection`` for https with
    260   ``paste.httpserver``, avoiding some possible errors (``sslv3 alert
    261   bad record mac``).
    262 
    263 * Fix small issue with ``paste.cgiapp`` and mod_wsgi.
    264 
    265 * Use ``BaseCookie`` instead of ``SimpleCookie`` for storing cookies
    266   (avoids quoting cookie values).
    267 
    268 1.5.1
    269 -----
    270 
    271 * Make ``paste.cascade`` more tolerant of a missing or invalid
    272   Content-Length.
    273 
    274 1.5
    275 ---
    276 
    277 * Fixed memory leak with ``paste.registry`` not properly removing
    278   all references to registered objects should register be called
    279   multiple times during a single context for a StackedObjectProxy.
    280 
    281 * ``paste.httpheaders.CONTENT_RANGE`` returns ``bytes
    282   START-END/LENGTH`` instead of just ``START-END/LENGTH``
    283 
    284 * In ``paste.fixture.TestApp`` set ``CONTENT_TYPE`` to
    285   ``'application/x-www-form-urlencoded'`` whenever there are
    286   parameters (and no other content type was provided).
    287 
    288 * In ``paste.session``, when cleaning files ignore files that aren't
    289   session files.
    290 
    291 * ``paste.httpexceptions.HTTPExceptionHandler`` will no longer catch
    292   exceptions raised during the app_iter iteration.
    293 
    294 * ``paste.cascade.Cascade`` copies ``wsgi.input`` when cascading, so
    295   that one of the applications cannot read the input and leave a later
    296   application blocked when it tries to read the input.
    297 
    298 * Fix assigning to ``WSGIResponse.charset`` breaking the content-type.
    299 
    300 * SMTP authentication is supported for the exception handler.  You may
    301   now set ``smtp_username``, ``smtp_password`` and ``smtp_use_tls`` to
    302   control this behavior.  From pthy.
    303 
    304 1.4.2
    305 -----
    306 
    307 * Remove FreeBSD threadpool condition in paste.httpserver (which was
    308   also breaking code for Windows users).
    309 
    310 * Fix problem with ``paste.wsgilib.intercept_output`` and passing up
    311   exceptions.
    312 
    313 1.4.1
    314 -----
    315 
    316 * Allow customization of the ``paste.config.ConfigMiddleware`` environ
    317   key.
    318 
    319 * Added a ``current`` method (an alias of ``current_conf``) to
    320   ``paste.config.DispatchingConfig``.
    321 
    322 * Make test response ``.form`` attribute work when you have a single
    323   named form.
    324 
    325 * Try to encode any unicode input to ``paste.auth.auth_tkt``
    326 
    327 * ``paste.wsgiwrappers.WSGIResponse`` now has a ``.content_type``
    328   attribute (that does not include parameters), and a ``.charset``
    329   attribute (that gets the charset parameter).
    330 
    331 * Inherit inherit show_exceptions_in_wsgi_errors from global
    332   configuration.  Inherit ``debug`` more properly.
    333 
    334 1.4
    335 ---
    336 
    337 * In ``paste.httpserver`` added lots of functionality to the
    338   threadpool.  See `the paste.httpserver threadpool documentation
    339   <paste-httpserver-threadpool.html>`_ for details.  This catches
    340   worker threads (and WSGI apps) that take too long to complete their
    341   task; killing them eventually, adding more worker threads when the
    342   pool is exhausted and it doesn't look good that it'll clear soon,
    343   and optionally killing the process when there are too many
    344   lost/zombie threads (you must be using some kind supervisor process
    345   for this last response to make sense).
    346 
    347 * Save host and scheme information during real HTTP proxy requests to
    348   ``paste.httpserver``, into the keys
    349   ``paste.httpserver.proxy.scheme`` and
    350   ``paste.httpserver.proxy.host``
    351 
    352 * In ``paste.exceptions`` always call ``start_response``; may help
    353   problems when there is an exception in ``start_response`` itself.
    354 
    355 * Added method to ``paste.registry.StackedObjectProxy``,
    356   ``_object_stack()``, which returns a list of all the registered
    357   objects.  Useful if you want to search through the effective history
    358   of a stacked object.
    359 
    360 * Fixed infinite recursion problem with
    361   ``paste.request.EnvironHeaders.keys()``.
    362 
    363 * Fix ``paste.wsgiwrappers.WSGIRequest.urlvars`` to use
    364   ``wsgiorg.routing_args``
    365 
    366 * Remove port from ``paste.request.construct_url`` if it's the default
    367   port (e.g., port 80 for ``http``).
    368 
    369 * ``paste.proxy`` works with headers with continuations in the
    370   response (i.e., a header that spans multiple lines).  Also, treat a
    371   missing Content-Length as 0, not unlimited (may have previously
    372   caused freeze ups for some kinds of requests).
    373 
    374 * ``StackedObjectProxy`` supports ``__call__`` (i.e., you can use
    375   ``StackedObjectProxy`` with callable objects).
    376 
    377 * Fixed ``ProfileMiddleware`` not calling ``close()`` on consumed
    378   app_iters.
    379 
    380 * ``httpheaders.AcceptLanguage`` now won't give an exception when
    381   there is a malformed parameter in the header.
    382 
    383 * Fix ``paste.auth.form.auth_form`` Paste Deploy entry point.
    384 
    385 * Added REST methods to ``paste.fixture.TestApp``, so you can more
    386   easily do requests like PUT and DELETE.  From Anders Pearson.
    387 
    388 * Added ``{{default var=default_value}}`` command to
    389   ``paste.util.template``.  Make ``{{# comment}}`` work.
    390 
    391 1.3
    392 ---
    393 
    394 * In ``paste.httpserver`` remove the reverse DNS lookup to set
    395   ``REMOTE_HOST``
    396 
    397 * In ``paste.fileapp``, if the client sends both If-None-Match and
    398   If-Modified-Since, prefer If-None-Match.  Make ETags include the
    399   size as well as last modified timestamp.  Make it possible to
    400   override how mimetypes are guessed.
    401 
    402 * ``HTTPException`` objects now have a ``exc.response(environ)``
    403   method that returns a ``WSGIResponse`` object.
    404 
    405 * ``egg:Paste#watch_threads`` will show tracebacks of each thread
    406   under Python 2.5.
    407 
    408 * Made ``paste.util.template`` trim whitespace around statements that
    409   are on their own line.
    410 
    411 * ``paste.fileapp.DataApp`` now accepts ``allowed_headers=[...]`` to
    412   specify the allowed headers.  By default only ``GET`` and ``HEAD``
    413   are allowed.
    414 
    415 * Added ``paste.util.import_string.try_import_module``, which imports
    416   modules and catches ``ImportError``, but only if it's an error
    417   importing the specific module, not an uncaught ``ImportError`` in
    418   the module being imported.
    419 
    420 1.2.1
    421 -----
    422 
    423 * ``paste.httpserver`` didn't implement the ``readline`` that the
    424   ``cgi`` module wants (regression in 1.2).
    425 
    426 1.2
    427 ---
    428 
    429 * **Backward incompatible change**: ``paste.fileapp.FileApp`` properly
    430   supports request methods, including HEAD.  If you were subclassing
    431   ``FileApp`` or ``DataApp`` and overriding ``__call__()`` you may have
    432   to subclass ``get()`` instead.
    433 
    434 * paste.httpheaders now parses the HTTP Accept-Language header and returns
    435   a list of languages the browser supports in the order it prefers them.
    436 
    437 * paste.mimeparse module added that handles parsing HTTP Accept headers
    438   for quality and mime-types.
    439 
    440 * ``paste.request.construct_url`` was adding ``SERVER_PORT`` to
    441   ``HTTP_HOST``; but ``HTTP_HOST`` (from the Host header) generally
    442   contains a port when necessary, and ``SERVER_PORT`` should only be
    443   used with ``SERVER_NAME``.
    444 
    445 * Added entry point for ``paste.registry.RegistryManager``
    446   (``egg:Paste#registry``).
    447 
    448 * ``paste.request.HeaderDict`` fixed to know that ``Content-Length``
    449   maps to ``CONTENT_LENGTH``.
    450 
    451 * Can use ``paste.urlparser.StaticURLParser`` with sub-instances other
    452   than ``paste.fileapp.FileApp`` (if you subclass and override
    453   ``make_app``)
    454 
    455 * ``paste.fixture.TestApp.get(status=X)`` takes a list of allowed
    456   status codes for ``X``.
    457 
    458 * Added a small templating system for internal use (``paste.util.template``)
    459 
    460 * Removed a bunch of long-deprecated modules (generally modules that
    461   have been moved to other names).
    462 
    463 In paste.wsgiwrappers
    464 ~~~~~~~~~~~~~~~~~~~~~
    465 
    466 * ``paste.wsgiwrappers.WSGIRequest`` has match_accept() function to screen
    467   incoming HTPT Accept values against a list of mime-types.
    468 
    469 * ``paste.wsgiwrappers.WSGIRequest.defaults`` now accepts a new key:
    470 
    471   ``language``:
    472     The i18n language that should be used as the fallback should
    473     a translation not occur in a language file. See docs for
    474     details.
    475 
    476 * ``paste.wsgiwrappers.WSGIRequest`` can now optionally decode form
    477   parameters to unicode when it has a ``charset`` value set.
    478 
    479 * Deprecated the ``paste.wsgiwrappers.settings`` StackedObjectProxy
    480   dictionary for ``paste.wsgiwrappers.WSGIResponse.defaults``.
    481 
    482 In paste.httpserver
    483 ~~~~~~~~~~~~~~~~~~~
    484 
    485 * Regression in 1.1 fixed, where Paste's HTTP server would drop
    486   trailing slashes from paths.
    487 
    488 * ``paste.httpserver`` now puts a key in the environment when using a
    489   thread pool that allows you to track the thread pool and see any
    490   wedged threads.  ``egg:Paste#watch_threads`` is an application that
    491   can display this information.
    492 
    493 * ``paste.httpserver`` now accepts all request methods, not just
    494   ``GET``, ``PUT``, etc.  (Methods like ``MKCOL`` were previously
    495   rejected.)
    496 
    497 * ``paste.httpserver`` has a ``wsgi.input`` that now does not block if
    498   you try to read past the end (it is limited to returning the number
    499   of bytes given in ``Content-Length``).  Double-reading from
    500   ``wsgi.input`` won't give you the same data, but it won't cause
    501   blocking.
    502 
    503 1.1.1
    504 -----
    505 
    506 * Fixed major issue with serving static files on Windows (a regression
    507   in Paste 1.1 where most static files would return 404 Not Found).
    508 
    509 * Fixed ``parse_dict_querystring`` returning empty dicts instead of
    510   ``MultiDict``\ s.
    511 
    512 * Added ``paste.config``, a rewrite of ``paste.deploy.config`` using
    513   ``paste.registry``. This version of ``ConfigMiddleware`` will
    514   enable use of ``paste.config.CONFIG`` within the ``EvalException``
    515   interactive debugger.
    516 
    517 * Fixed problem where ``paste.recursive`` would leave ``wsgi.input``
    518   and ``CONTENT_LENGTH`` set for recursive requests.
    519 
    520 * Changed the static file servers to give 404 Not Found responses when
    521   you have extra parts after a static file, instead of 400 Bad
    522   Request (like when you request ``/file.html/extra/path``)
    523 
    524 1.1
    525 ---
    526 
    527 * Security fix for ``paste.urlparser.StaticURLParser``.  The problem
    528   allowed escaping the root (and reading files) when used with
    529   ``paste.httpserver`` (this does not effect other servers, and does
    530   not apply when proxying requests from Apache to
    531   ``paste.httpserver``).
    532 
    533 * ``paste.httpserver`` and ``paste.fixture.TestApp`` url-unquote
    534   ``SCRIPT_NAME`` and ``PATH_INFO``, as specified in the CGI spec.
    535   Thanks to Jon Nelson for pointing out both these issues.
    536 
    537 * ``paste.registry`` now works within the ``EvalException``
    538   interactive debugger.
    539 
    540 * Fixed ``paste.auth.open_id`` failures not returning a correct
    541   response.
    542 
    543 * Changed ``paste.httpexceptions.HTTPUnauthorized`` so that the
    544   ``WWW-Authenticate`` header is not required.  401 responses don't
    545   *have* to have that header.
    546 
    547 * In ``paste.fixture.TestApp``: ``<form>`` tags that have to
    548   ``action`` will preserve the existing query string.  (Generally
    549   relative links that are completely empty should but were not
    550   preserving the query string)
    551 
    552 * Made ``paste.*`` compatible with `py2exe <http://www.py2exe.org/>`_
    553   by adding a ``modulefinder`` call in ``__init__.py``
    554 
    555 * The ``paste.gzipper`` gzipping middleware wasn't changing the
    556   Content-Length header properly; thanks to Brad Clements for the fix.
    557 
    558 * Fixed ``paste.proxy`` to not use anything based on the dict form of
    559   ``httplib..HTTPMessage``.  This form folds headers together in a way
    560   that breaks ``Set-Cookie`` headers (two ``Set-Cookie`` headers would
    561   be merged into one).
    562 
    563 * ``paste.request.parse_formvars`` didn't accept parameters in
    564   ``CONTENT_TYPE``.  ``prototype.js`` sets a ``charset`` parameter,
    565   which caused a problem.
    566 
    567 * Added a ``__traceback_decorator__`` magic local variable, to allow
    568   arbitrary manipulation of the output of
    569   ``paste.exceptions.collector`` before formatting.
    570 
    571 * Added unicorn power to ``paste.pony`` (from Chad Whitacre)
    572 
    573 * For ``paste.httpserver`` SSL support: add support loading an
    574   explicit certificate context, and using ``ssl_pem='*'`` create an
    575   unsigned SSL certificate (from Jason Kirtland).
    576 
    577 * Fix some cases where ``paste.httpserver`` can have an orphaned
    578   thread pool (causing the process to not shut down properly).  Patch
    579   from jek.
    580 
    581 1.0
    582 ---
    583 
    584 * Fixed ``parsed_formvars`` potentially locking up on wsgi.input
    585   after modification of ``QUERY_STRING``.
    586 
    587 * Fixed problem where ``paste.exceptions.errormiddleware`` didn't
    588   expose the ``.close()`` method of the app_iter that it wraps (to
    589   catch exceptions).  This is a problem if the server about the
    590   errormiddleware aborts the request; it should then call
    591   ``.close()``, but won't necessarily exhaust the iterator to do so.
    592 
    593 * Added entry point for ``paste.translogger``
    594   (``egg:Paste#translogger``)
    595 
    596 * Fixed some cases where long data (e.g., a file upload) would show up
    597   in the error report, creating a very very large report.  Also, put
    598   in a monkeypatch for the ``cgi`` module so that
    599   ``repr(uploaded_field)`` won't load the entire field into memory
    600   (from its temporary file location).
    601 
    602 * Added a ``force_host`` option to ``paste.proxy.TransparentProxy``,
    603   which will force all incoming requests to the same host, but leave
    604   the ``Host`` header intact.
    605 
    606 * Added automatic cleanup of old sessions for ``paste.session``, from
    607   Amir Salihefendic.
    608 
    609 * Quote the function name in tracebacks in the exception formatter;
    610   Genshi has function names that use ``<>``.
    611 
    612 0.9.9
    613 -----
    614 
    615 * Fixed ``paste.response.HeaderDict`` ``get`` and ``setdefault``
    616   methods to be case insensitive
    617 
    618 * Fix use of ``TestApp().post(params={'key': ['list of',
    619   'values']})`` as reported by Syver Enstad.
    620 
    621 * ``paste.fileapp.DataApp`` is now directly usable (was previously
    622   only usable as an abstract base class).
    623 
    624 0.9.8
    625 -----
    626 
    627 * Fixed ``wsgiwrappers.WSGIResponse.delete_cookie``. It also now takes
    628   optional path and domain arguments
    629 
    630 * ``wsgiwrappers.WSGIResponse`` now handles generator/iterator content
    631   more cleanly, and properly encodes unicode content according to its
    632   specified charset
    633 
    634 * Fixed ``wsgiwrappers.WSGIResponse`` mishandling multiple headers of
    635   the same name
    636 
    637 * Added a Paste Deploy entry point for ``paste.auth.cookie``
    638 
    639 * Moved Paste Deploy dependencies out of top-level modules and into
    640   Paste-Deploy-specific entry point functions.  This should make Paste
    641   more-or-less Paste Deploy independent.  ``paste.urlparser`` and
    642   ``paste.exceptions.errormiddleware`` still have some leftover bits.
    643 
    644 * Added another redirector type to ``paste.recursive``,
    645   ``environ['paste.recursive.include_app_iter']`` which gives access
    646   to the original app_iter.
    647 
    648 * Bug with ``wsgilib.catch_errors`` and app_iters with no ``close()``
    649   method.
    650 
    651 * Long words in tracebacks weren't being wrapped correctly at all.
    652   Also, large data would cause the wrapping routine to give a
    653   recursion error.  Now large data is truncated (at 1000 characters),
    654   and recursion won't be a problem.  Also, wrapping shouldn't lose
    655   characters.
    656 
    657 * Better exception if you try to put a non-str into environ when using
    658   ``paste.auth.cookie``
    659 
    660 * ``paste.exceptions.collector`` produces an
    661   ``exc_data.exception_type`` that is a class, not a string.  This
    662   helps it get formatted better in Python 2.5.
    663 
    664 * All the tests pass on Python 2.5!
    665 
    666 * Added ``paste.proxy.TransparentProxy``, which just sends the request
    667   described in the WSGI environ on without any modification.  More
    668   useful for WSGI clients than servers, it effectively allows any
    669   WSGI-based request mechanism to act like an httplib-based request
    670   mechanism.
    671 
    672 * Added a ``cache_max_age`` argument to
    673   ``paste.urlparser.StaticURLParser``, which allows you to encourage
    674   the caching of static files.  Patch from Brad Clements.
    675 
    676 * Added ``suppress_http_headers`` to ``paste.proxy.Proxy``, which will
    677   filter out HTTP headers from the request before passing it on.
    678   Patch from Brad Clements.
    679 
    680 0.9.7
    681 -----
    682 
    683 * The ``EvalException`` 'full traceback' button is now only displayed
    684   when the full traceback differs from the regular (includes hidden
    685   frames).
    686 
    687 * Fixed ``EvalException`` returning a Content-type of 'text-html'
    688   instead of 'text/html' in some cases.
    689 
    690 0.9.6
    691 -----
    692 
    693 * Renamed the ``paste.util.multidict.multidict`` class to
    694   ``paste.util.multidict.MultiDict``
    695 
    696 0.9.5
    697 -----
    698 
    699 * Fixed a security vulnerability in ``paste.urlparser``'s StaticURLParser
    700   and PkgResourcesParser where, with some servers, you could escape
    701   the document root.
    702 
    703 * Significantly improved ``paste.httpserver``'s (egg:Paste#http)
    704   performance. It now uses a thread pool: previously it created a new
    705   thread for every request. To revert back to the old, slower behavior,
    706   set::
    707 
    708     use_threadpool = false
    709 
    710   in the [server:main] section of the config file.
    711 
    712 * More control of where the output of ``paste.debug.prints`` goes.
    713 
    714 * Added a warning to ``paste.wsgilib.add_close`` if the upstream
    715   app_iter consumer doesn't call the ``app_iter.close()`` method.
    716 
    717 * Fixed ``testapp.post(params={})``
    718 
    719 * Fixed ``paste.translogger.TransLogger`` to log to the Apache combined
    720   log format as advertised.
    721 
    722 * Fixed ``paste.urlparser`` classes to handle quoted characters (e.g.
    723   %20) in URL paths.
    724 
    725 * Changed ``paste.session`` to allow manipulating a session for the
    726   first time after ``start_response`` is called.
    727 
    728 * Added ``paste.wsgilib.add_start_close`` which calls a function just
    729   before returning the first chunk of the app_iter.
    730 
    731 * Changed ``paste.urlmap`` so that it matches domain-specific mappings
    732   before domain-neutral mappings.
    733 
    734 * Fixed IE 6 potentially receiving the following ``"400 Bad Request"``
    735   error on file downloads::
    736 
    737     Please check your system clock.
    738     According to this server, the time provided in the
    739     If-Modified-Since header is in the future.
    740 
    741 * Added a 'no' keyword argument to ``TestResponse.mustcontain``, so
    742   you can assert that a response does contain some strings at the same
    743   time that you assert that a response *does not* contain other
    744   strings, like::
    745 
    746     res = app.get('/')
    747     res.mustcontain('this must be there',
    748                     no=['error', 'unexpected'])
    749 
    750 * Fixed ``fileapp.FileApp`` to pay attention to the ``If-None-Match``
    751   header, which does ETag matching; before only ``If-Modified-Since``
    752   was supported, even though an ``ETag`` header was being sent; in
    753   particular Firefox would then only send ``If-None-Match`` and so
    754   conditional requests never worked.
    755 
    756 * Changed usage of ``paste.request.MultiDict`` to
    757   ``paste.util.multidict``, particularly in ``paste.wsgiwrappers``
    758   where ``request.GET`` returns a new style of dictionary interface.
    759 
    760 * Be more careful in ``paste.request.parse_formvars`` not to let
    761   the ``cgi`` module read from ``wsgi.input`` when there are no
    762   parsable variables in the input (based on ``CONTENT_TYPE``).
    763 
    764 0.9.4
    765 -----
    766 
    767 * This released was lost in a tragic clerical accident.
    768 
    769 0.9.3
    770 -----
    771 
    772 * 0.9.2 Included a version of MochiKit that was no longer compatible with
    773   evalexception; 0.9.3 reverts to a previous version.
    774 
    775 * Change wsgi.run_once=False for ``paste.httpserver``
    776 
    777 * Added entry points for debug apps
    778 
    779 0.9.2
    780 -----
    781 
    782 * Fix in paste.urlmap when connecting with host:port.
    783 
    784 * Added ``/_debug/summary`` to evalexception, which gives a
    785   JSON-formatted list of all the exceptions in memory.
    786 
    787 0.9.1
    788 -----
    789 
    790 * A fix for paste.errordocument, when doing an internal redirect from
    791   a POST request (the request is rewritten as a GET request)
    792 
    793 0.9
    794 ---
    795 
    796 * Added `paste.request.WSGIRequest
    797   <class-paste.request.WSGIRequest.html>`_, a request object that
    798   wraps the WSGI environment.
    799 
    800 * Added `paste.registry <module-paste.registry.html>`_, which is
    801   middleware for registering threadlocal objects in a request.
    802 
    803 * Avoid annoying warning from paste.recursive
    804 
    805 * ``paste.httpserver`` now removes HTTPServer's transaction logging,
    806   which was doing a reverse DNS lookup.
    807 
    808 * Added ``has_session`` to ``paste.session``
    809 
    810 * Allow for conditional ``paste.wsgilib.intercept_output`` which
    811   should be slightly faster (and streamable) compared to doing the
    812   condition manually.
    813 
    814 * Added entry point for `paste.proxy <module-paste.proxy.html>`_, plus
    815   improvements from Brad Clements (support path in target, filter
    816   request methods)
    817 
    818 * Added `paste.pony <module-paste.pony.html>`_ so pony power can be
    819   added to any WSGI application.
    820 
    821 * Added port matching to ``paste.urlmap``.
    822 
    823 0.5
    824 ---
    825 
    826 * Added `paste.auth.auth_tkt <module-paste.auth.auth_tkt.html>`_
    827 
    828 * Added `paste.auth.grantip <module-paste.auth.grantip.html>`_
    829 
    830 0.4.1
    831 -----
    832 
    833 * Some bug fixes to the `built-in HTTP server
    834   <module-paste.httpserver.html>`_.
    835 
    836 * Experimental `paste.progress <module-paste.progress.html>`_
    837   middleware for tracking upload progress
    838 
    839 * Some tweaking of how `paste.reload <module-paste.reload.html>`_
    840   works, especially with respect to shutdown.
    841 
    842 0.4
    843 ---
    844 
    845 * Fixed up paste documentation (especially for new packages/modules)
    846 
    847 * Added `paste.auth <module-paste.auth.html>`_ package for authentication
    848   related WSGI middle-ware components:
    849 
    850   - ``basic`` and ``digest`` HTTP authentication as described by RFC 2617
    851 
    852   - support for Yale's Central Authentication System (``cas``)
    853 
    854   - ``open_id`` supports single sign-on originally developed for
    855     LiveJournal (see http://openid.net)
    856 
    857   - ``cookie`` digitally signs cookies to record the current
    858     authenticated user (``REMOTE_USER``), session identifier
    859     (``REMOTE_SESSION``), and other WSGI entries in the ``environ``.
    860 
    861   - a ``form`` module (to be used with ``cookie`` or an equivalent)
    862     provides a simple HTML based form authentication.
    863 
    864   - the ``multi`` module is an *experimental* mechanism for choosing
    865     an authentication mechanism based on the WSGI ``environ``
    866 
    867 * Added `paste.httpserver <module-paste.httpserver.html>`_ module which
    868   provides a very simple WSGI server built upon python's
    869   ``BaseHTTPServer``; this server has support for several features:
    870 
    871   - support for SSL connections via OpenSSL
    872 
    873   - support for HTTP/1.1 ``100 Continue`` messages as required by the
    874     WSGI specification (many HTTP server implementations don't do this)
    875 
    876   - implemented as a Mix-In so that it can be used with other
    877     more enchanted versions of ``BaseHTTPServer``
    878 
    879   - support for 'Keep-Alive' (standard in HTTP/1.1) by either providing
    880     a content-length or closing a connection if one is not available
    881 
    882 * Improved the `paste.httpexceptions <module-paste.httpexceptions.html>`_
    883   module:
    884 
    885   - added missing exception objects, and better descriptions
    886 
    887   - fixed several bugs in how exceptions are caught and propagated
    888 
    889   - usage as a ``wsgi_application()`` enables exceptions to be
    890     returned without throwing or catching the error
    891 
    892   - support for plain/text messages for text-only clients such as
    893     curl, python's urllib, or Microsoft Excel
    894 
    895   - allows customization of the HTML template for higher-level frameworks
    896 
    897 * Added `paste.httpheaders <module-paste.httpheaders.html>`_ module
    898   to provide a uniform mechanism to access/update standard HTTP headers
    899   in a WSGI ``environ`` and ``response_headers`` collection; it includes
    900   specific support for:
    901 
    902   - providing "common" header names and sorting them as suggested
    903     by RFC 2616
    904 
    905   - validated support for ``Cache-Control`` header construction
    906 
    907   - validated support for ``Content-Disposition`` header construction
    908 
    909   - parsing of ``If-Modified-Since`` and other date oriented headers
    910 
    911   - parsing of Range header for partial-content delivery
    912 
    913   - composition of HTTP/1.1 digest ``Authorization`` responses
    914 
    915 * Improved `paste.fileapp <module-paste.fileapp.html>`_ to support:
    916 
    917   - static in-memory resources
    918 
    919   - incremental downloading of files from disk
    920 
    921   - responding to 'Range' requests to handle partial downloads
    922 
    923   - allowing cache settings to be easily provided; including
    924     support for HTTP/1.0 'Expires' and HTTP/1.1 'Cache-Control'
    925 
    926 * Added an *experimental* `paste.transaction
    927   <module-paste.transaction.html>`_ module for handling
    928   commit/rollback of standard DBAPI database connections
    929 
    930 * Added a `paste.util.datetimeutil <module-paste.util.datetimeutil.html>`_
    931   module for parsing standard date/time user-generated text values
    932 
    933 * Added a `debug <module-paste.debug.html>`_ package, which includes:
    934 
    935   - previous top-level modules ``prints``, ``profile``,
    936     ``wdg_validate`` and ``doctest_webapp``
    937 
    938   - a ``testserver`` module suitable to test HTTP socket
    939     connections via ``py.test``
    940 
    941 * Re-factored `paste.wsgilib <module-paste.wsgilib.html>`_ into
    942   several other modules:
    943 
    944   - functions regarding header manipulation moved to
    945     `paste.response <module-paste.response.html>`_
    946 
    947   - functions regarding cookies and arguments moved to
    948     `paste.request <module-paste.request.html>`_
    949 
    950 * Significant improvements to ``wsgiutils.wsgilib`` module:
    951 
    952   - added a ``dump_environ`` application to help debugging
    953 
    954   - fixes to ``raw_interactive`` to comply with WSGI specifications
    955 
    956   - ``raw_interactive`` now logs all 5xx exceptions and sets HTTP_HOST
    957 
    958 * Added an argument ``no_profile`` to
    959   `paste.debug.profile.profile_decorator
    960   <module-paste.debug.profile.html#profile_decorator>`_; if that
    961   option is false, then don't profile the function at all.
    962 
    963 * Changed `paste.lint <module-paste.lint.html>`_ to check that the
    964   status contains a message (e.g., ``"404 Not Found"`` instead of just
    965   ``"404"``).  Check that environmental variables
    966   ``HTTP_CONTENT_TYPE`` and ``HTTP_CONTENT_LENGTH`` are no present.
    967   Made unknown ``REQUEST_METHOD`` a warning (not an error).
    968 
    969 * Added parameter ``cwd`` to `TestFileEnvironment.run
    970   <class-paste.fixture.TestFileEnvironment.html#run>`_
    971 
    972 * `paste.fixture.TestApp <class-paste.fixture.TestApp.html>`_:
    973 
    974   - Form filling code (use ``response.forms[0]`` to get a `form object
    975     <class-paste.fixture.Form.html>`_)
    976 
    977   - Added `click method
    978     <class-paste.fixture.TestResponse.html#click>`_.
    979 
    980   - Better attribute errors.
    981 
    982   - You can force set hidden fields using
    983     ``form.fields[name].force_value(value)`` (normally setting the
    984     value of a hidden field is an error).
    985 
    986   - Frameworks can now add custom attributes to the response object.
    987 
    988 * ``paste.wsgilib.capture_output`` is deprecated in favor of
    989   `paste.wsgilib.intercept_output
    990   <module-paste.wsgilib.html#intercept_output>`_
    991 
    992 * Remove use of exceptions in `paste.cascade.Cascade
    993   <class-paste.cascade.Cascade.html>`_, which causes weird effects in
    994   some cases.  Generally we aren't using exceptions internally now,
    995   only return status codes.  Also in cascade, be careful to keep
    996   cascaded requests from sharing the same environment.
    997 
    998 * ``paste.wsgilib.error_response`` is deprecated
    999   (`paste.httpexceptions <module-paste.httpexceptions.html>`_ replaces
   1000   this with exception's ``.wsgi_application`` method).
   1001 
   1002 * Moved ``paste.login`` to the attic, since `paste.auth
   1003   <module-paste.auth.html>`_ pretty much replaces it.
   1004 
   1005 * `paste.urlparser <module-paste.urlparser.html>`_ improvements:
   1006 
   1007   - Added an application `urlparser.StaticURLParser
   1008     <class-paste.urlparser.StaticURLParser.html>`_ for serving static
   1009     files.
   1010 
   1011   - Added an application `urlparser.PkgResourcesParser
   1012     <class-paste.urlparser.PkgResourcesParser.html>`_ for serving static
   1013     files found with ``pkg_resources`` (e.g., out of zipped Eggs).
   1014 
   1015   - Be less picky about ambiguous filenames when using `URLParser
   1016     <class-paste.urlparser.URLParser.html>`_; if an exact file match
   1017     exists, use that.  (``file.gif.bak`` would cause a request for
   1018     ``file.gif`` to be ambiguous before)
   1019 
   1020   - Now looks for a ``.wsgi_application`` attribute when serving
   1021     Python files/modules, as a general hook for returning a WSGI
   1022     application version of an object.
   1023 
   1024 * The `ErrorMiddleware
   1025   <class-paste.exceptions.errormiddleware.ErrorMiddleware.html>`_:
   1026 
   1027   - Returns trimmed-down exceptions if there is a ``_`` GET variable
   1028     in the request (which is meant to signal an XMLHttpRequest).
   1029     Exceptions displayed in this context are best when they are smaller
   1030     and easier to display.
   1031 
   1032   - Includes a text version of the traceback, for easier
   1033     copy-and-paste.
   1034 
   1035   - Avoid printing exceptions to ``wsgi.errors`` if they are already
   1036     displayed elsewhere (at least by default).
   1037 
   1038   - Highlight Python code.
   1039 
   1040 * Use ``pkg_resources.declare_namespace`` so that there are less
   1041   problems about confusing the ``paste`` package that is provided by
   1042   Paste, Paste Script, Paste Deploy, and Paste WebKit.  Before you
   1043   could get one of these at random if you didn't use
   1044   ``pkg_resources.require`` first.
   1045 
   1046 * Cleaned up use of ``exc_info`` argument in ``start_response`` calls
   1047   (both accepting and producing), in a variety of places.
   1048