News
====
.. contents::
1.7.2
-----
* In :mod:`paste.proxy`, added some more headers that are disallowed
in WSGI (e.g., Keep-Alive). Send Content-Length. Also fix the
missing query string when using :class:`paste.proxy.Proxy`
(:class:`paste.proxy.TransparentProxy` already worked).
* Make :mod:`paste.debug.prints` work with Google App Engine.
* Make ``environ['wsgi.input']`` with :mod:`paste.httpserver` only
have a ``seek`` method if it is wrapping something with a seek
method (which usually it is not).
* In :mod:`paste.httpserver` re-raise KeyboardInterrupt in worker
threads.
* Added support for the ``HttpOnly`` Cookie property to
:mod:`paste.wsgiwrappers`
* Added :func:`paste.reloader.add_file_callback`, which lets you watch
files based on a callback.
* Quiet Python 2.6 deprecation warnings.
* Fix :mod:`paste.auth.cookie` generating bad headers.
* Added :class:`paste.reloader.JythonMonitor` for an experimental,
optimized reloader on Jython.
1.7.1
-----
* Normalize and make absolute the paths passed to
:class:`paste.urlparser.StaticURLParser` (before passing a
relative-to-cwd path to that class would cause Forbidden errors).
* Deprecate :func:`paste.fixture.setup_module`
1.7
---
* Fixed bug in :class:`paste.fixture.TestApp` that would submit forms
with unnamed fields (like an unnamed submit button). Also made
checkboxes with no explicit ``value`` send ``on`` instead of
``checked`` (which is what browsers do).
* Fixed bug in :mod:`paste.httpserver` where
``environ['wsgi.input'].readline(max_size)`` ignored the max_size
argument, which can lead to large memory usage (from Jakub Stolarski)
* Make :mod:`paste.cascade` notice sockets that have stopped producing
data. From Casey Zednick.
* In :class:`paste.fixture.TestApp` Accept MultiDict values for the
``params`` argument in requests. (Anything with a ``.items()``
method will have its items encoded as the request parameters.)
* Fix :mod:`paste.httpserver` to allow binding to port 0.
* In :mod:`paste.auth.auth_tkt`, set the same cookies (with the same
domains) in ``set_cookie`` as get unset in ``logout_user_cookie``.
* In :mod:`paste.translogger` save REQUEST_METHOD in case it gets
overridden somewhere (e.g., when using errordocuments POST would
show up as GET).
* Exceptions with unicode messages don't cause the collector to fail.
* Sometimes :class:`paste.exceptions.errormiddleware.ErrorMiddleware`
would not call start_response properly; this is fixed (from Andreas
Kloecker).
* :mod:`paste.fixture.TestApp` can store multiple cookie values
(previously only one cookie was stored; from Andrey Lebedev)
* ``u'' in TestApp(app).get('/')`` will work when the body isn't ASCII
(before it would give a unicode error). This problem wasn't present
in the recommended `WebTest `_.
* :mod:`paste.debug.profile` won't break when content is served with no
Content-Type.
* Accept relative paths and paths with ``/../`` in them for
:class:`paste.urlparser.StaticURLParser` (from Eric Larson). Also fix
problem with case normalization on Windows (from Ionel Maries
Cristian).
* :class:`paste.registry.StackedObjectProxy`'s now include the proxied object's names via
``__dir__`` (for Python 2.6).
* Use ``environ['wsgi.file_wrapper']`` when available (in
``paste.fileapp``).
* Make :mod:`paste.debug.prints` compatible with App Engine.
* Fix the ``domain`` keyword in
:method:`paste.wsgiwrappers.WSGIResponse.delete_cookie`.
1.6.1
-----
* Fixed bug in paste lint where PATH_INFO would become unicode.
1.6
---
* Make the import of ``socket.sslerror`` conditional in
``paste.exceptions.reporter`` (needed for Python interpreters
compiled without SSL support).
* In ``paste.proxy.TransparentProxy``, don't overwrite
``X-Forwarded-For`` header if it is already in the environment.
* Added ``226 IM Used`` status code to ``paste.wsgiwrappers``
* In ``paste.fixture.TestApp`` treat ```` the same
as a submit button.
* Use ``OpenSSL.tsafe.Connection`` for https with
``paste.httpserver``, avoiding some possible errors (``sslv3 alert
bad record mac``).
* Fix small issue with ``paste.cgiapp`` and mod_wsgi.
* Use ``BaseCookie`` instead of ``SimpleCookie`` for storing cookies
(avoids quoting cookie values).
1.5.1
-----
* Make ``paste.cascade`` more tolerant of a missing or invalid
Content-Length.
1.5
---
* Fixed memory leak with ``paste.registry`` not properly removing
all references to registered objects should register be called
multiple times during a single context for a StackedObjectProxy.
* ``paste.httpheaders.CONTENT_RANGE`` returns ``bytes
START-END/LENGTH`` instead of just ``START-END/LENGTH``
* In ``paste.fixture.TestApp`` set ``CONTENT_TYPE`` to
``'application/x-www-form-urlencoded'`` whenever there are
parameters (and no other content type was provided).
* In ``paste.session``, when cleaning files ignore files that aren't
session files.
* ``paste.httpexceptions.HTTPExceptionHandler`` will no longer catch
exceptions raised during the app_iter iteration.
* ``paste.cascade.Cascade`` copies ``wsgi.input`` when cascading, so
that one of the applications cannot read the input and leave a later
application blocked when it tries to read the input.
* Fix assigning to ``WSGIResponse.charset`` breaking the content-type.
* SMTP authentication is supported for the exception handler. You may
now set ``smtp_username``, ``smtp_password`` and ``smtp_use_tls`` to
control this behavior. From pthy.
1.4.2
-----
* Remove FreeBSD threadpool condition in paste.httpserver (which was
also breaking code for Windows users).
* Fix problem with ``paste.wsgilib.intercept_output`` and passing up
exceptions.
1.4.1
-----
* Allow customization of the ``paste.config.ConfigMiddleware`` environ
key.
* Added a ``current`` method (an alias of ``current_conf``) to
``paste.config.DispatchingConfig``.
* Make test response ``.form`` attribute work when you have a single
named form.
* Try to encode any unicode input to ``paste.auth.auth_tkt``
* ``paste.wsgiwrappers.WSGIResponse`` now has a ``.content_type``
attribute (that does not include parameters), and a ``.charset``
attribute (that gets the charset parameter).
* Inherit inherit show_exceptions_in_wsgi_errors from global
configuration. Inherit ``debug`` more properly.
1.4
---
* In ``paste.httpserver`` added lots of functionality to the
threadpool. See `the paste.httpserver threadpool documentation
`_ for details. This catches
worker threads (and WSGI apps) that take too long to complete their
task; killing them eventually, adding more worker threads when the
pool is exhausted and it doesn't look good that it'll clear soon,
and optionally killing the process when there are too many
lost/zombie threads (you must be using some kind supervisor process
for this last response to make sense).
* Save host and scheme information during real HTTP proxy requests to
``paste.httpserver``, into the keys
``paste.httpserver.proxy.scheme`` and
``paste.httpserver.proxy.host``
* In ``paste.exceptions`` always call ``start_response``; may help
problems when there is an exception in ``start_response`` itself.
* Added method to ``paste.registry.StackedObjectProxy``,
``_object_stack()``, which returns a list of all the registered
objects. Useful if you want to search through the effective history
of a stacked object.
* Fixed infinite recursion problem with
``paste.request.EnvironHeaders.keys()``.
* Fix ``paste.wsgiwrappers.WSGIRequest.urlvars`` to use
``wsgiorg.routing_args``
* Remove port from ``paste.request.construct_url`` if it's the default
port (e.g., port 80 for ``http``).
* ``paste.proxy`` works with headers with continuations in the
response (i.e., a header that spans multiple lines). Also, treat a
missing Content-Length as 0, not unlimited (may have previously
caused freeze ups for some kinds of requests).
* ``StackedObjectProxy`` supports ``__call__`` (i.e., you can use
``StackedObjectProxy`` with callable objects).
* Fixed ``ProfileMiddleware`` not calling ``close()`` on consumed
app_iters.
* ``httpheaders.AcceptLanguage`` now won't give an exception when
there is a malformed parameter in the header.
* Fix ``paste.auth.form.auth_form`` Paste Deploy entry point.
* Added REST methods to ``paste.fixture.TestApp``, so you can more
easily do requests like PUT and DELETE. From Anders Pearson.
* Added ``{{default var=default_value}}`` command to
``paste.util.template``. Make ``{{# comment}}`` work.
1.3
---
* In ``paste.httpserver`` remove the reverse DNS lookup to set
``REMOTE_HOST``
* In ``paste.fileapp``, if the client sends both If-None-Match and
If-Modified-Since, prefer If-None-Match. Make ETags include the
size as well as last modified timestamp. Make it possible to
override how mimetypes are guessed.
* ``HTTPException`` objects now have a ``exc.response(environ)``
method that returns a ``WSGIResponse`` object.
* ``egg:Paste#watch_threads`` will show tracebacks of each thread
under Python 2.5.
* Made ``paste.util.template`` trim whitespace around statements that
are on their own line.
* ``paste.fileapp.DataApp`` now accepts ``allowed_headers=[...]`` to
specify the allowed headers. By default only ``GET`` and ``HEAD``
are allowed.
* Added ``paste.util.import_string.try_import_module``, which imports
modules and catches ``ImportError``, but only if it's an error
importing the specific module, not an uncaught ``ImportError`` in
the module being imported.
1.2.1
-----
* ``paste.httpserver`` didn't implement the ``readline`` that the
``cgi`` module wants (regression in 1.2).
1.2
---
* **Backward incompatible change**: ``paste.fileapp.FileApp`` properly
supports request methods, including HEAD. If you were subclassing
``FileApp`` or ``DataApp`` and overriding ``__call__()`` you may have
to subclass ``get()`` instead.
* paste.httpheaders now parses the HTTP Accept-Language header and returns
a list of languages the browser supports in the order it prefers them.
* paste.mimeparse module added that handles parsing HTTP Accept headers
for quality and mime-types.
* ``paste.request.construct_url`` was adding ``SERVER_PORT`` to
``HTTP_HOST``; but ``HTTP_HOST`` (from the Host header) generally
contains a port when necessary, and ``SERVER_PORT`` should only be
used with ``SERVER_NAME``.
* Added entry point for ``paste.registry.RegistryManager``
(``egg:Paste#registry``).
* ``paste.request.HeaderDict`` fixed to know that ``Content-Length``
maps to ``CONTENT_LENGTH``.
* Can use ``paste.urlparser.StaticURLParser`` with sub-instances other
than ``paste.fileapp.FileApp`` (if you subclass and override
``make_app``)
* ``paste.fixture.TestApp.get(status=X)`` takes a list of allowed
status codes for ``X``.
* Added a small templating system for internal use (``paste.util.template``)
* Removed a bunch of long-deprecated modules (generally modules that
have been moved to other names).
In paste.wsgiwrappers
~~~~~~~~~~~~~~~~~~~~~
* ``paste.wsgiwrappers.WSGIRequest`` has match_accept() function to screen
incoming HTPT Accept values against a list of mime-types.
* ``paste.wsgiwrappers.WSGIRequest.defaults`` now accepts a new key:
``language``:
The i18n language that should be used as the fallback should
a translation not occur in a language file. See docs for
details.
* ``paste.wsgiwrappers.WSGIRequest`` can now optionally decode form
parameters to unicode when it has a ``charset`` value set.
* Deprecated the ``paste.wsgiwrappers.settings`` StackedObjectProxy
dictionary for ``paste.wsgiwrappers.WSGIResponse.defaults``.
In paste.httpserver
~~~~~~~~~~~~~~~~~~~
* Regression in 1.1 fixed, where Paste's HTTP server would drop
trailing slashes from paths.
* ``paste.httpserver`` now puts a key in the environment when using a
thread pool that allows you to track the thread pool and see any
wedged threads. ``egg:Paste#watch_threads`` is an application that
can display this information.
* ``paste.httpserver`` now accepts all request methods, not just
``GET``, ``PUT``, etc. (Methods like ``MKCOL`` were previously
rejected.)
* ``paste.httpserver`` has a ``wsgi.input`` that now does not block if
you try to read past the end (it is limited to returning the number
of bytes given in ``Content-Length``). Double-reading from
``wsgi.input`` won't give you the same data, but it won't cause
blocking.
1.1.1
-----
* Fixed major issue with serving static files on Windows (a regression
in Paste 1.1 where most static files would return 404 Not Found).
* Fixed ``parse_dict_querystring`` returning empty dicts instead of
``MultiDict``\ s.
* Added ``paste.config``, a rewrite of ``paste.deploy.config`` using
``paste.registry``. This version of ``ConfigMiddleware`` will
enable use of ``paste.config.CONFIG`` within the ``EvalException``
interactive debugger.
* Fixed problem where ``paste.recursive`` would leave ``wsgi.input``
and ``CONTENT_LENGTH`` set for recursive requests.
* Changed the static file servers to give 404 Not Found responses when
you have extra parts after a static file, instead of 400 Bad
Request (like when you request ``/file.html/extra/path``)
1.1
---
* Security fix for ``paste.urlparser.StaticURLParser``. The problem
allowed escaping the root (and reading files) when used with
``paste.httpserver`` (this does not effect other servers, and does
not apply when proxying requests from Apache to
``paste.httpserver``).
* ``paste.httpserver`` and ``paste.fixture.TestApp`` url-unquote
``SCRIPT_NAME`` and ``PATH_INFO``, as specified in the CGI spec.
Thanks to Jon Nelson for pointing out both these issues.
* ``paste.registry`` now works within the ``EvalException``
interactive debugger.
* Fixed ``paste.auth.open_id`` failures not returning a correct
response.
* Changed ``paste.httpexceptions.HTTPUnauthorized`` so that the
``WWW-Authenticate`` header is not required. 401 responses don't
*have* to have that header.
* In ``paste.fixture.TestApp``: ``