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