• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1News
2====
3
4.. contents::
5
62.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
272.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
432.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
651.7.5.1
66-------
67
68* Fix bug introduced in :mod:`paste.auth.auth_tkt` (with ``url_unquote``)
69
701.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
901.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
1021.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
1111.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
1401.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
1701.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
1791.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
2391.6.1
240-----
241
242* Fixed bug in paste lint where PATH_INFO would become unicode.
243
2441.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
2681.5.1
269-----
270
271* Make ``paste.cascade`` more tolerant of a missing or invalid
272  Content-Length.
273
2741.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
3041.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
3131.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
3341.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
3911.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
4201.2.1
421-----
422
423* ``paste.httpserver`` didn't implement the ``readline`` that the
424  ``cgi`` module wants (regression in 1.2).
425
4261.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
463In 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
482In 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
5031.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
5241.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
5811.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
6120.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
6240.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
6800.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
6900.9.6
691-----
692
693* Renamed the ``paste.util.multidict.multidict`` class to
694  ``paste.util.multidict.MultiDict``
695
6960.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
7640.9.4
765-----
766
767* This released was lost in a tragic clerical accident.
768
7690.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
7790.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
7870.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
7930.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
8230.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
8300.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
8420.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