<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>News — Paste 1.7.5.1 documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', VERSION: '1.7.5.1', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <link rel="top" title="Paste 1.7.5.1 documentation" href="index.html" /> <link rel="next" title="The Future Of Paste" href="future.html" /> <link rel="prev" title="Python Paste" href="index.html" /> <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9"> <link rel="stylesheet" type="text/css" href="_static/paste.css.html"> </head> <body role="document"> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body" role="main"> <div class="section" id="news"> <h1><a class="toc-backref" href="#id40">News</a><a class="headerlink" href="#news" title="Permalink to this headline">¶</a></h1> <div class="contents topic" id="contents"> <p class="topic-title first">Contents</p> <ul class="simple"> <li><a class="reference internal" href="#news" id="id40">News</a><ul> <li><a class="reference internal" href="#id1" id="id41">2.0.2</a></li> <li><a class="reference internal" href="#id2" id="id42">2.0.1</a></li> <li><a class="reference internal" href="#id3" id="id43">2.0</a></li> <li><a class="reference internal" href="#id4" id="id44">1.7.5.1</a></li> <li><a class="reference internal" href="#id5" id="id45">1.7.5</a></li> <li><a class="reference internal" href="#id6" id="id46">1.7.4</a></li> <li><a class="reference internal" href="#id7" id="id47">1.7.3.1</a></li> <li><a class="reference internal" href="#id8" id="id48">1.7.3</a></li> <li><a class="reference internal" href="#id9" id="id49">1.7.2</a></li> <li><a class="reference internal" href="#id10" id="id50">1.7.1</a></li> <li><a class="reference internal" href="#id11" id="id51">1.7</a></li> <li><a class="reference internal" href="#id12" id="id52">1.6.1</a></li> <li><a class="reference internal" href="#id13" id="id53">1.6</a></li> <li><a class="reference internal" href="#id14" id="id54">1.5.1</a></li> <li><a class="reference internal" href="#id15" id="id55">1.5</a></li> <li><a class="reference internal" href="#id16" id="id56">1.4.2</a></li> <li><a class="reference internal" href="#id17" id="id57">1.4.1</a></li> <li><a class="reference internal" href="#id18" id="id58">1.4</a></li> <li><a class="reference internal" href="#id19" id="id59">1.3</a></li> <li><a class="reference internal" href="#id20" id="id60">1.2.1</a></li> <li><a class="reference internal" href="#id21" id="id61">1.2</a><ul> <li><a class="reference internal" href="#in-paste-wsgiwrappers" id="id62">In paste.wsgiwrappers</a></li> <li><a class="reference internal" href="#in-paste-httpserver" id="id63">In paste.httpserver</a></li> </ul> </li> <li><a class="reference internal" href="#id22" id="id64">1.1.1</a></li> <li><a class="reference internal" href="#id23" id="id65">1.1</a></li> <li><a class="reference internal" href="#id24" id="id66">1.0</a></li> <li><a class="reference internal" href="#id25" id="id67">0.9.9</a></li> <li><a class="reference internal" href="#id26" id="id68">0.9.8</a></li> <li><a class="reference internal" href="#id27" id="id69">0.9.7</a></li> <li><a class="reference internal" href="#id28" id="id70">0.9.6</a></li> <li><a class="reference internal" href="#id29" id="id71">0.9.5</a></li> <li><a class="reference internal" href="#id30" id="id72">0.9.4</a></li> <li><a class="reference internal" href="#id31" id="id73">0.9.3</a></li> <li><a class="reference internal" href="#id32" id="id74">0.9.2</a></li> <li><a class="reference internal" href="#id33" id="id75">0.9.1</a></li> <li><a class="reference internal" href="#id34" id="id76">0.9</a></li> <li><a class="reference internal" href="#id35" id="id77">0.5</a></li> <li><a class="reference internal" href="#id36" id="id78">0.4.1</a></li> <li><a class="reference internal" href="#id37" id="id79">0.4</a></li> </ul> </li> </ul> </div> <div class="section" id="id1"> <h2><a class="toc-backref" href="#id41">2.0.2</a><a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>#22: Fix improper commas in request headers in wsgi_environ (<a class="reference external" href="https://bitbucket.org/ianb/paste/pull-request/22/fix-improper-commas-in-request-headers-in">https://bitbucket.org/ianb/paste/pull-request/22/fix-improper-commas-in-request-headers-in</a>) Fixes issue #4 (“WSGI environ totally borked”) (<a class="reference external" href="https://bitbucket.org/ianb/paste/issue/4/wsgi-environ-totally-borked">https://bitbucket.org/ianb/paste/issue/4/wsgi-environ-totally-borked</a>)</li> <li>#24: test_wsgirequest_charset: Use UTF-8 instead of iso-8859-1 (<a class="reference external" href="https://bitbucket.org/ianb/paste/pull-request/24/test_wsgirequest_charset-use-utf-8-instead">https://bitbucket.org/ianb/paste/pull-request/24/test_wsgirequest_charset-use-utf-8-instead</a>) Fixes issue #7 (“Python 3 test failure”) (<a class="reference external" href="https://bitbucket.org/ianb/paste/issue/7/python-3-test-failure">https://bitbucket.org/ianb/paste/issue/7/python-3-test-failure</a>)</li> <li>#23: Replace cgi.parse_qsl w/ six.moves.urllib.parse.parse_qsl (<a class="reference external" href="https://bitbucket.org/ianb/paste/pull-request/23/replace-cgiparse_qsl-w">https://bitbucket.org/ianb/paste/pull-request/23/replace-cgiparse_qsl-w</a>) Fixes issue #8 (“cgi.parse_qsl is pending deprecation”) (<a class="reference external" href="https://bitbucket.org/ianb/paste/issue/8/cgiparse_qsl-is-pending-deprecation">https://bitbucket.org/ianb/paste/issue/8/cgiparse_qsl-is-pending-deprecation</a>)</li> <li>#20: Escape CGI environment variables in HTTP 404 responses (<a class="reference external" href="https://bitbucket.org/ianb/paste/pull-request/20/escape-cgi-environment-variables-in-http">https://bitbucket.org/ianb/paste/pull-request/20/escape-cgi-environment-variables-in-http</a>)</li> <li>#6: Add HTTP exception for new code 429 “Too Many Requests” (<a class="reference external" href="https://bitbucket.org/ianb/paste/pull-request/6/add-http-exception-for-new-code-429-too">https://bitbucket.org/ianb/paste/pull-request/6/add-http-exception-for-new-code-429-too</a>)</li> <li>#25: replace <code class="docutils literal"><span class="pre">has_key</span></code> method to <code class="docutils literal"><span class="pre">in</span></code> operator #9 (<a class="reference external" href="https://bitbucket.org/ianb/paste/pull-request/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</a>) Fixes #9 (“used methods removed from py3”) (<a class="reference external" href="https://bitbucket.org/ianb/paste/issue/9/used-methods-removed-from-py3">https://bitbucket.org/ianb/paste/issue/9/used-methods-removed-from-py3</a>)</li> <li>#5: Invalid error message when the socket is already in use (<a class="reference external" href="https://bitbucket.org/ianb/paste/issue/5/invalid-error-message-when-the-socket-is">https://bitbucket.org/ianb/paste/issue/5/invalid-error-message-when-the-socket-is</a>)</li> </ul> </div> <div class="section" id="id2"> <h2><a class="toc-backref" href="#id42">2.0.1</a><a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fix setup.py for six dependency: move the six dependency from extras_require to install_requires.</li> <li>Port paste.proxy to Python 3.</li> <li>Fix paste.exceptions.serial_number_generator.hash_identifier() on Python 3.</li> <li>Fix paste.util.threadedprint.uninstall(). Rename duplicated uninstall() function to uninstall_stdin() and fix typo in variable name (_oldstin => _oldstdin).</li> <li>Add README.rst file.</li> </ul> </div> <div class="section" id="id3"> <h2><a class="toc-backref" href="#id43">2.0</a><a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Experimental Python 3 support.</li> <li>paste now requires the six module.</li> <li>Drop support of Python 2.5 and older.</li> <li>Fixed <code class="docutils literal"><span class="pre">egg:Paste#cgi</span></code></li> <li>In <code class="docutils literal"><span class="pre">paste.httpserver</span></code>: give a 100 Continue response even when the server has been configured as an HTTP/1.0 server (clients may send <code class="docutils literal"><span class="pre">Expect:</span> <span class="pre">100-Continue</span></code> before they know the version), and wrap 100 Continue <code class="docutils literal"><span class="pre">environ['wsgi.input']</span></code> files with LimitedLengthFile just like normal request bodies are wrapped, keeping WSGI applications from over-reading from the socket.</li> <li>Fixed parsing of paths beginning with multiple forward slashes.</li> <li>Add tox.ini to run tests with tox on Python 2.6, 2.7 and 3.4.</li> </ul> </div> <div class="section" id="id4"> <h2><a class="toc-backref" href="#id44">1.7.5.1</a><a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fix bug introduced in <code class="xref py py-mod docutils literal"><span class="pre">paste.auth.auth_tkt</span></code> (with <code class="docutils literal"><span class="pre">url_unquote</span></code>)</li> </ul> </div> <div class="section" id="id5"> <h2><a class="toc-backref" href="#id45">1.7.5</a><a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Won’t install <code class="docutils literal"><span class="pre">tests/</span></code> directory (also caused installation problems on some Mac systems).</li> <li>Fixed problem with gzip middleware and zero-length responses.</li> <li>Use <code class="docutils literal"><span class="pre">X-Forwarded-For</span></code> header in <code class="xref py py-mod docutils literal"><span class="pre">paste.translogger</span></code></li> <li>Fixed problems with mimeparse code</li> <li>Fixed some corner cases with CGI scripts</li> <li><code class="xref py py-mod docutils literal"><span class="pre">paste.auth.auth_tkt</span></code> will URL-quote usernames, avoiding some errors with usernames with <code class="docutils literal"><span class="pre">!</span></code> in them.</li> <li>Improve handling of errors in fetching error pages in <code class="xref py py-mod docutils literal"><span class="pre">paste.errordocument</span></code>.</li> </ul> </div> <div class="section" id="id6"> <h2><a class="toc-backref" href="#id46">1.7.4</a><a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fix XSS bug (security issue) with not found handlers for <code class="xref py py-class docutils literal"><span class="pre">paste.urlparser.StaticURLParser</span></code> and <code class="xref py py-class docutils literal"><span class="pre">paste.urlmap.URLMap</span></code>. If you ask for a path with <code class="docutils literal"><span class="pre">/--><script>...</span></code> that will be inserted in the error page and can execute Javascript. Reported by Tim Wintle with further details from Georg-Christian Pranschke.</li> <li>Replaced <code class="xref py py-func docutils literal"><span class="pre">paste.util.mimeparse.desired_match()</span></code></li> </ul> </div> <div class="section" id="id7"> <h2><a class="toc-backref" href="#id47">1.7.3.1</a><a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Removed directory name from 404 errors in <code class="xref py py-class docutils literal"><span class="pre">paste.urlparser.StaticURLParser</span></code>.</li> <li>Fixed packaging to include Javascript and images for <code class="xref py py-mod docutils literal"><span class="pre">paste.evalexception</span></code></li> </ul> </div> <div class="section" id="id8"> <h2><a class="toc-backref" href="#id48">1.7.3</a><a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>I got a fever and the only prescription is more <code class="xref py py-mod docutils literal"><span class="pre">paste.cowbell</span></code>!</li> <li>Fix <code class="xref py py-mod docutils literal"><span class="pre">paste.httpserver</span></code> on Python 2.6.</li> <li>Fix <code class="xref py py-mod docutils literal"><span class="pre">paste.auth.cookie</span></code>, which would insert newlines for long cookies.</li> <li><code class="xref py py-mod docutils literal"><span class="pre">paste.util.mimeparse</span></code> parses a single <code class="docutils literal"><span class="pre">*</span></code> in Accept headers (sent by IE 6).</li> <li>Fix some problems with the <code class="docutils literal"><span class="pre">wdg_validate</span></code> middleware.</li> <li>Improvements to <code class="xref py py-mod docutils literal"><span class="pre">paste.auth.auth_tkt</span></code>: add httponly support, don’t always aggressively set cookies without the <code class="docutils literal"><span class="pre">wildcard_cookie</span></code> option. Also on logout, make cookies expire.</li> <li>In <code class="xref py py-class docutils literal"><span class="pre">paste.proxy.Proxy</span></code> handle Content-Length of -1.</li> <li>In <code class="xref py py-mod docutils literal"><span class="pre">paste.httpexceptions</span></code> avoid some unicode errors.</li> <li>In <code class="xref py py-mod docutils literal"><span class="pre">paste.httpserver</span></code> handle <code class="docutils literal"><span class="pre">.read()</span></code> from 100 Continue properly (because of a typo it was doing a readline).</li> <li>Update <code class="docutils literal"><span class="pre">paste.util.mimeparse</span></code> from <a class="reference external" href="http://code.google.com/p/mimeparse/">upstream</a>.</li> </ul> </div> <div class="section" id="id9"> <h2><a class="toc-backref" href="#id49">1.7.2</a><a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>In <code class="xref py py-mod docutils literal"><span class="pre">paste.proxy</span></code>, added some more headers that are disallowed in WSGI (e.g., Keep-Alive). Send Content-Length. Also fix the missing query string when using <code class="xref py py-class docutils literal"><span class="pre">paste.proxy.Proxy</span></code> (<code class="xref py py-class docutils literal"><span class="pre">paste.proxy.TransparentProxy</span></code> already worked).</li> <li>Make <code class="xref py py-mod docutils literal"><span class="pre">paste.debug.prints</span></code> work with Google App Engine.</li> <li>Make <code class="docutils literal"><span class="pre">environ['wsgi.input']</span></code> with <code class="xref py py-mod docutils literal"><span class="pre">paste.httpserver</span></code> only have a <code class="docutils literal"><span class="pre">seek</span></code> method if it is wrapping something with a seek method (which usually it is not).</li> <li>In <code class="xref py py-mod docutils literal"><span class="pre">paste.httpserver</span></code> re-raise KeyboardInterrupt in worker threads.</li> <li>Added support for the <code class="docutils literal"><span class="pre">HttpOnly</span></code> Cookie property to <code class="xref py py-mod docutils literal"><span class="pre">paste.wsgiwrappers</span></code></li> <li>Added <code class="xref py py-func docutils literal"><span class="pre">paste.reloader.add_file_callback()</span></code>, which lets you watch files based on a callback.</li> <li>Quiet Python 2.6 deprecation warnings.</li> <li>Fix <code class="xref py py-mod docutils literal"><span class="pre">paste.auth.cookie</span></code> generating bad headers.</li> <li>Added <code class="xref py py-class docutils literal"><span class="pre">paste.reloader.JythonMonitor</span></code> for an experimental, optimized reloader on Jython.</li> </ul> </div> <div class="section" id="id10"> <h2><a class="toc-backref" href="#id50">1.7.1</a><a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Normalize and make absolute the paths passed to <code class="xref py py-class docutils literal"><span class="pre">paste.urlparser.StaticURLParser</span></code> (before passing a relative-to-cwd path to that class would cause Forbidden errors).</li> <li>Deprecate <code class="xref py py-func docutils literal"><span class="pre">paste.fixture.setup_module()</span></code></li> </ul> </div> <div class="section" id="id11"> <h2><a class="toc-backref" href="#id51">1.7</a><a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed bug in <code class="xref py py-class docutils literal"><span class="pre">paste.fixture.TestApp</span></code> that would submit forms with unnamed fields (like an unnamed submit button). Also made checkboxes with no explicit <code class="docutils literal"><span class="pre">value</span></code> send <code class="docutils literal"><span class="pre">on</span></code> instead of <code class="docutils literal"><span class="pre">checked</span></code> (which is what browsers do).</li> <li>Fixed bug in <code class="xref py py-mod docutils literal"><span class="pre">paste.httpserver</span></code> where <code class="docutils literal"><span class="pre">environ['wsgi.input'].readline(max_size)</span></code> ignored the max_size argument, which can lead to large memory usage (from Jakub Stolarski)</li> <li>Make <code class="xref py py-mod docutils literal"><span class="pre">paste.cascade</span></code> notice sockets that have stopped producing data. From Casey Zednick.</li> <li>In <code class="xref py py-class docutils literal"><span class="pre">paste.fixture.TestApp</span></code> Accept MultiDict values for the <code class="docutils literal"><span class="pre">params</span></code> argument in requests. (Anything with a <code class="docutils literal"><span class="pre">.items()</span></code> method will have its items encoded as the request parameters.)</li> <li>Fix <code class="xref py py-mod docutils literal"><span class="pre">paste.httpserver</span></code> to allow binding to port 0.</li> <li>In <code class="xref py py-mod docutils literal"><span class="pre">paste.auth.auth_tkt</span></code>, set the same cookies (with the same domains) in <code class="docutils literal"><span class="pre">set_cookie</span></code> as get unset in <code class="docutils literal"><span class="pre">logout_user_cookie</span></code>.</li> <li>In <code class="xref py py-mod docutils literal"><span class="pre">paste.translogger</span></code> save REQUEST_METHOD in case it gets overridden somewhere (e.g., when using errordocuments POST would show up as GET).</li> <li>Exceptions with unicode messages don’t cause the collector to fail.</li> <li>Sometimes <code class="xref py py-class docutils literal"><span class="pre">paste.exceptions.errormiddleware.ErrorMiddleware</span></code> would not call start_response properly; this is fixed (from Andreas Kloecker).</li> <li><code class="xref py py-mod docutils literal"><span class="pre">paste.fixture.TestApp</span></code> can store multiple cookie values (previously only one cookie was stored; from Andrey Lebedev)</li> <li><code class="docutils literal"><span class="pre">u''</span> <span class="pre">in</span> <span class="pre">TestApp(app).get('/')</span></code> will work when the body isn’t ASCII (before it would give a unicode error). This problem wasn’t present in the recommended <a class="reference external" href="http://pythonpaste.org/webtest/">WebTest</a>.</li> <li><code class="xref py py-mod docutils literal"><span class="pre">paste.debug.profile</span></code> won’t break when content is served with no Content-Type.</li> <li>Accept relative paths and paths with <code class="docutils literal"><span class="pre">/../</span></code> in them for <code class="xref py py-class docutils literal"><span class="pre">paste.urlparser.StaticURLParser</span></code> (from Eric Larson). Also fix problem with case normalization on Windows (from Ionel Maries Cristian).</li> <li><code class="xref py py-class docutils literal"><span class="pre">paste.registry.StackedObjectProxy</span></code>‘s now include the proxied object’s names via <code class="docutils literal"><span class="pre">__dir__</span></code> (for Python 2.6).</li> <li>Use <code class="docutils literal"><span class="pre">environ['wsgi.file_wrapper']</span></code> when available (in <code class="docutils literal"><span class="pre">paste.fileapp</span></code>).</li> <li>Make <code class="xref py py-mod docutils literal"><span class="pre">paste.debug.prints</span></code> compatible with App Engine.</li> <li>Fix the <code class="docutils literal"><span class="pre">domain</span></code> keyword in <code class="xref py py-meth docutils literal"><span class="pre">paste.wsgiwrappers.WSGIResponse.delete_cookie()</span></code>.</li> </ul> </div> <div class="section" id="id12"> <h2><a class="toc-backref" href="#id52">1.6.1</a><a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed bug in paste lint where PATH_INFO would become unicode.</li> </ul> </div> <div class="section" id="id13"> <h2><a class="toc-backref" href="#id53">1.6</a><a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Make the import of <code class="docutils literal"><span class="pre">socket.sslerror</span></code> conditional in <code class="docutils literal"><span class="pre">paste.exceptions.reporter</span></code> (needed for Python interpreters compiled without SSL support).</li> <li>In <code class="docutils literal"><span class="pre">paste.proxy.TransparentProxy</span></code>, don’t overwrite <code class="docutils literal"><span class="pre">X-Forwarded-For</span></code> header if it is already in the environment.</li> <li>Added <code class="docutils literal"><span class="pre">226</span> <span class="pre">IM</span> <span class="pre">Used</span></code> status code to <code class="docutils literal"><span class="pre">paste.wsgiwrappers</span></code></li> <li>In <code class="docutils literal"><span class="pre">paste.fixture.TestApp</span></code> treat <code class="docutils literal"><span class="pre"><image</span> <span class="pre">type="image"></span></code> the same as a submit button.</li> <li>Use <code class="docutils literal"><span class="pre">OpenSSL.tsafe.Connection</span></code> for https with <code class="docutils literal"><span class="pre">paste.httpserver</span></code>, avoiding some possible errors (<code class="docutils literal"><span class="pre">sslv3</span> <span class="pre">alert</span> <span class="pre">bad</span> <span class="pre">record</span> <span class="pre">mac</span></code>).</li> <li>Fix small issue with <code class="docutils literal"><span class="pre">paste.cgiapp</span></code> and mod_wsgi.</li> <li>Use <code class="docutils literal"><span class="pre">BaseCookie</span></code> instead of <code class="docutils literal"><span class="pre">SimpleCookie</span></code> for storing cookies (avoids quoting cookie values).</li> </ul> </div> <div class="section" id="id14"> <h2><a class="toc-backref" href="#id54">1.5.1</a><a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Make <code class="docutils literal"><span class="pre">paste.cascade</span></code> more tolerant of a missing or invalid Content-Length.</li> </ul> </div> <div class="section" id="id15"> <h2><a class="toc-backref" href="#id55">1.5</a><a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed memory leak with <code class="docutils literal"><span class="pre">paste.registry</span></code> not properly removing all references to registered objects should register be called multiple times during a single context for a StackedObjectProxy.</li> <li><code class="docutils literal"><span class="pre">paste.httpheaders.CONTENT_RANGE</span></code> returns <code class="docutils literal"><span class="pre">bytes</span> <span class="pre">START-END/LENGTH</span></code> instead of just <code class="docutils literal"><span class="pre">START-END/LENGTH</span></code></li> <li>In <code class="docutils literal"><span class="pre">paste.fixture.TestApp</span></code> set <code class="docutils literal"><span class="pre">CONTENT_TYPE</span></code> to <code class="docutils literal"><span class="pre">'application/x-www-form-urlencoded'</span></code> whenever there are parameters (and no other content type was provided).</li> <li>In <code class="docutils literal"><span class="pre">paste.session</span></code>, when cleaning files ignore files that aren’t session files.</li> <li><code class="docutils literal"><span class="pre">paste.httpexceptions.HTTPExceptionHandler</span></code> will no longer catch exceptions raised during the app_iter iteration.</li> <li><code class="docutils literal"><span class="pre">paste.cascade.Cascade</span></code> copies <code class="docutils literal"><span class="pre">wsgi.input</span></code> 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.</li> <li>Fix assigning to <code class="docutils literal"><span class="pre">WSGIResponse.charset</span></code> breaking the content-type.</li> <li>SMTP authentication is supported for the exception handler. You may now set <code class="docutils literal"><span class="pre">smtp_username</span></code>, <code class="docutils literal"><span class="pre">smtp_password</span></code> and <code class="docutils literal"><span class="pre">smtp_use_tls</span></code> to control this behavior. From pthy.</li> </ul> </div> <div class="section" id="id16"> <h2><a class="toc-backref" href="#id56">1.4.2</a><a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Remove FreeBSD threadpool condition in paste.httpserver (which was also breaking code for Windows users).</li> <li>Fix problem with <code class="docutils literal"><span class="pre">paste.wsgilib.intercept_output</span></code> and passing up exceptions.</li> </ul> </div> <div class="section" id="id17"> <h2><a class="toc-backref" href="#id57">1.4.1</a><a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Allow customization of the <code class="docutils literal"><span class="pre">paste.config.ConfigMiddleware</span></code> environ key.</li> <li>Added a <code class="docutils literal"><span class="pre">current</span></code> method (an alias of <code class="docutils literal"><span class="pre">current_conf</span></code>) to <code class="docutils literal"><span class="pre">paste.config.DispatchingConfig</span></code>.</li> <li>Make test response <code class="docutils literal"><span class="pre">.form</span></code> attribute work when you have a single named form.</li> <li>Try to encode any unicode input to <code class="docutils literal"><span class="pre">paste.auth.auth_tkt</span></code></li> <li><code class="docutils literal"><span class="pre">paste.wsgiwrappers.WSGIResponse</span></code> now has a <code class="docutils literal"><span class="pre">.content_type</span></code> attribute (that does not include parameters), and a <code class="docutils literal"><span class="pre">.charset</span></code> attribute (that gets the charset parameter).</li> <li>Inherit inherit show_exceptions_in_wsgi_errors from global configuration. Inherit <code class="docutils literal"><span class="pre">debug</span></code> more properly.</li> </ul> </div> <div class="section" id="id18"> <h2><a class="toc-backref" href="#id58">1.4</a><a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>In <code class="docutils literal"><span class="pre">paste.httpserver</span></code> added lots of functionality to the threadpool. See <a class="reference external" href="paste-httpserver-threadpool.html">the paste.httpserver threadpool documentation</a> 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).</li> <li>Save host and scheme information during real HTTP proxy requests to <code class="docutils literal"><span class="pre">paste.httpserver</span></code>, into the keys <code class="docutils literal"><span class="pre">paste.httpserver.proxy.scheme</span></code> and <code class="docutils literal"><span class="pre">paste.httpserver.proxy.host</span></code></li> <li>In <code class="docutils literal"><span class="pre">paste.exceptions</span></code> always call <code class="docutils literal"><span class="pre">start_response</span></code>; may help problems when there is an exception in <code class="docutils literal"><span class="pre">start_response</span></code> itself.</li> <li>Added method to <code class="docutils literal"><span class="pre">paste.registry.StackedObjectProxy</span></code>, <code class="docutils literal"><span class="pre">_object_stack()</span></code>, which returns a list of all the registered objects. Useful if you want to search through the effective history of a stacked object.</li> <li>Fixed infinite recursion problem with <code class="docutils literal"><span class="pre">paste.request.EnvironHeaders.keys()</span></code>.</li> <li>Fix <code class="docutils literal"><span class="pre">paste.wsgiwrappers.WSGIRequest.urlvars</span></code> to use <code class="docutils literal"><span class="pre">wsgiorg.routing_args</span></code></li> <li>Remove port from <code class="docutils literal"><span class="pre">paste.request.construct_url</span></code> if it’s the default port (e.g., port 80 for <code class="docutils literal"><span class="pre">http</span></code>).</li> <li><code class="docutils literal"><span class="pre">paste.proxy</span></code> 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).</li> <li><code class="docutils literal"><span class="pre">StackedObjectProxy</span></code> supports <code class="docutils literal"><span class="pre">__call__</span></code> (i.e., you can use <code class="docutils literal"><span class="pre">StackedObjectProxy</span></code> with callable objects).</li> <li>Fixed <code class="docutils literal"><span class="pre">ProfileMiddleware</span></code> not calling <code class="docutils literal"><span class="pre">close()</span></code> on consumed app_iters.</li> <li><code class="docutils literal"><span class="pre">httpheaders.AcceptLanguage</span></code> now won’t give an exception when there is a malformed parameter in the header.</li> <li>Fix <code class="docutils literal"><span class="pre">paste.auth.form.auth_form</span></code> Paste Deploy entry point.</li> <li>Added REST methods to <code class="docutils literal"><span class="pre">paste.fixture.TestApp</span></code>, so you can more easily do requests like PUT and DELETE. From Anders Pearson.</li> <li>Added <code class="docutils literal"><span class="pre">{{default</span> <span class="pre">var=default_value}}</span></code> command to <code class="docutils literal"><span class="pre">paste.util.template</span></code>. Make <code class="docutils literal"><span class="pre">{{#</span> <span class="pre">comment}}</span></code> work.</li> </ul> </div> <div class="section" id="id19"> <h2><a class="toc-backref" href="#id59">1.3</a><a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>In <code class="docutils literal"><span class="pre">paste.httpserver</span></code> remove the reverse DNS lookup to set <code class="docutils literal"><span class="pre">REMOTE_HOST</span></code></li> <li>In <code class="docutils literal"><span class="pre">paste.fileapp</span></code>, 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.</li> <li><code class="docutils literal"><span class="pre">HTTPException</span></code> objects now have a <code class="docutils literal"><span class="pre">exc.response(environ)</span></code> method that returns a <code class="docutils literal"><span class="pre">WSGIResponse</span></code> object.</li> <li><code class="docutils literal"><span class="pre">egg:Paste#watch_threads</span></code> will show tracebacks of each thread under Python 2.5.</li> <li>Made <code class="docutils literal"><span class="pre">paste.util.template</span></code> trim whitespace around statements that are on their own line.</li> <li><code class="docutils literal"><span class="pre">paste.fileapp.DataApp</span></code> now accepts <code class="docutils literal"><span class="pre">allowed_headers=[...]</span></code> to specify the allowed headers. By default only <code class="docutils literal"><span class="pre">GET</span></code> and <code class="docutils literal"><span class="pre">HEAD</span></code> are allowed.</li> <li>Added <code class="docutils literal"><span class="pre">paste.util.import_string.try_import_module</span></code>, which imports modules and catches <code class="docutils literal"><span class="pre">ImportError</span></code>, but only if it’s an error importing the specific module, not an uncaught <code class="docutils literal"><span class="pre">ImportError</span></code> in the module being imported.</li> </ul> </div> <div class="section" id="id20"> <h2><a class="toc-backref" href="#id60">1.2.1</a><a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li><code class="docutils literal"><span class="pre">paste.httpserver</span></code> didn’t implement the <code class="docutils literal"><span class="pre">readline</span></code> that the <code class="docutils literal"><span class="pre">cgi</span></code> module wants (regression in 1.2).</li> </ul> </div> <div class="section" id="id21"> <h2><a class="toc-backref" href="#id61">1.2</a><a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li><strong>Backward incompatible change</strong>: <code class="docutils literal"><span class="pre">paste.fileapp.FileApp</span></code> properly supports request methods, including HEAD. If you were subclassing <code class="docutils literal"><span class="pre">FileApp</span></code> or <code class="docutils literal"><span class="pre">DataApp</span></code> and overriding <code class="docutils literal"><span class="pre">__call__()</span></code> you may have to subclass <code class="docutils literal"><span class="pre">get()</span></code> instead.</li> <li>paste.httpheaders now parses the HTTP Accept-Language header and returns a list of languages the browser supports in the order it prefers them.</li> <li>paste.mimeparse module added that handles parsing HTTP Accept headers for quality and mime-types.</li> <li><code class="docutils literal"><span class="pre">paste.request.construct_url</span></code> was adding <code class="docutils literal"><span class="pre">SERVER_PORT</span></code> to <code class="docutils literal"><span class="pre">HTTP_HOST</span></code>; but <code class="docutils literal"><span class="pre">HTTP_HOST</span></code> (from the Host header) generally contains a port when necessary, and <code class="docutils literal"><span class="pre">SERVER_PORT</span></code> should only be used with <code class="docutils literal"><span class="pre">SERVER_NAME</span></code>.</li> <li>Added entry point for <code class="docutils literal"><span class="pre">paste.registry.RegistryManager</span></code> (<code class="docutils literal"><span class="pre">egg:Paste#registry</span></code>).</li> <li><code class="docutils literal"><span class="pre">paste.request.HeaderDict</span></code> fixed to know that <code class="docutils literal"><span class="pre">Content-Length</span></code> maps to <code class="docutils literal"><span class="pre">CONTENT_LENGTH</span></code>.</li> <li>Can use <code class="docutils literal"><span class="pre">paste.urlparser.StaticURLParser</span></code> with sub-instances other than <code class="docutils literal"><span class="pre">paste.fileapp.FileApp</span></code> (if you subclass and override <code class="docutils literal"><span class="pre">make_app</span></code>)</li> <li><code class="docutils literal"><span class="pre">paste.fixture.TestApp.get(status=X)</span></code> takes a list of allowed status codes for <code class="docutils literal"><span class="pre">X</span></code>.</li> <li>Added a small templating system for internal use (<code class="docutils literal"><span class="pre">paste.util.template</span></code>)</li> <li>Removed a bunch of long-deprecated modules (generally modules that have been moved to other names).</li> </ul> <div class="section" id="in-paste-wsgiwrappers"> <h3><a class="toc-backref" href="#id62">In paste.wsgiwrappers</a><a class="headerlink" href="#in-paste-wsgiwrappers" title="Permalink to this headline">¶</a></h3> <ul> <li><p class="first"><code class="docutils literal"><span class="pre">paste.wsgiwrappers.WSGIRequest</span></code> has match_accept() function to screen incoming HTPT Accept values against a list of mime-types.</p> </li> <li><p class="first"><code class="docutils literal"><span class="pre">paste.wsgiwrappers.WSGIRequest.defaults</span></code> now accepts a new key:</p> <dl class="docutils"> <dt><code class="docutils literal"><span class="pre">language</span></code>:</dt> <dd><p class="first last">The i18n language that should be used as the fallback should a translation not occur in a language file. See docs for details.</p> </dd> </dl> </li> <li><p class="first"><code class="docutils literal"><span class="pre">paste.wsgiwrappers.WSGIRequest</span></code> can now optionally decode form parameters to unicode when it has a <code class="docutils literal"><span class="pre">charset</span></code> value set.</p> </li> <li><p class="first">Deprecated the <code class="docutils literal"><span class="pre">paste.wsgiwrappers.settings</span></code> StackedObjectProxy dictionary for <code class="docutils literal"><span class="pre">paste.wsgiwrappers.WSGIResponse.defaults</span></code>.</p> </li> </ul> </div> <div class="section" id="in-paste-httpserver"> <h3><a class="toc-backref" href="#id63">In paste.httpserver</a><a class="headerlink" href="#in-paste-httpserver" title="Permalink to this headline">¶</a></h3> <ul class="simple"> <li>Regression in 1.1 fixed, where Paste’s HTTP server would drop trailing slashes from paths.</li> <li><code class="docutils literal"><span class="pre">paste.httpserver</span></code> 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. <code class="docutils literal"><span class="pre">egg:Paste#watch_threads</span></code> is an application that can display this information.</li> <li><code class="docutils literal"><span class="pre">paste.httpserver</span></code> now accepts all request methods, not just <code class="docutils literal"><span class="pre">GET</span></code>, <code class="docutils literal"><span class="pre">PUT</span></code>, etc. (Methods like <code class="docutils literal"><span class="pre">MKCOL</span></code> were previously rejected.)</li> <li><code class="docutils literal"><span class="pre">paste.httpserver</span></code> has a <code class="docutils literal"><span class="pre">wsgi.input</span></code> that now does not block if you try to read past the end (it is limited to returning the number of bytes given in <code class="docutils literal"><span class="pre">Content-Length</span></code>). Double-reading from <code class="docutils literal"><span class="pre">wsgi.input</span></code> won’t give you the same data, but it won’t cause blocking.</li> </ul> </div> </div> <div class="section" id="id22"> <h2><a class="toc-backref" href="#id64">1.1.1</a><a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed major issue with serving static files on Windows (a regression in Paste 1.1 where most static files would return 404 Not Found).</li> <li>Fixed <code class="docutils literal"><span class="pre">parse_dict_querystring</span></code> returning empty dicts instead of <code class="docutils literal"><span class="pre">MultiDict</span></code>s.</li> <li>Added <code class="docutils literal"><span class="pre">paste.config</span></code>, a rewrite of <code class="docutils literal"><span class="pre">paste.deploy.config</span></code> using <code class="docutils literal"><span class="pre">paste.registry</span></code>. This version of <code class="docutils literal"><span class="pre">ConfigMiddleware</span></code> will enable use of <code class="docutils literal"><span class="pre">paste.config.CONFIG</span></code> within the <code class="docutils literal"><span class="pre">EvalException</span></code> interactive debugger.</li> <li>Fixed problem where <code class="docutils literal"><span class="pre">paste.recursive</span></code> would leave <code class="docutils literal"><span class="pre">wsgi.input</span></code> and <code class="docutils literal"><span class="pre">CONTENT_LENGTH</span></code> set for recursive requests.</li> <li>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 <code class="docutils literal"><span class="pre">/file.html/extra/path</span></code>)</li> </ul> </div> <div class="section" id="id23"> <h2><a class="toc-backref" href="#id65">1.1</a><a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Security fix for <code class="docutils literal"><span class="pre">paste.urlparser.StaticURLParser</span></code>. The problem allowed escaping the root (and reading files) when used with <code class="docutils literal"><span class="pre">paste.httpserver</span></code> (this does not effect other servers, and does not apply when proxying requests from Apache to <code class="docutils literal"><span class="pre">paste.httpserver</span></code>).</li> <li><code class="docutils literal"><span class="pre">paste.httpserver</span></code> and <code class="docutils literal"><span class="pre">paste.fixture.TestApp</span></code> url-unquote <code class="docutils literal"><span class="pre">SCRIPT_NAME</span></code> and <code class="docutils literal"><span class="pre">PATH_INFO</span></code>, as specified in the CGI spec. Thanks to Jon Nelson for pointing out both these issues.</li> <li><code class="docutils literal"><span class="pre">paste.registry</span></code> now works within the <code class="docutils literal"><span class="pre">EvalException</span></code> interactive debugger.</li> <li>Fixed <code class="docutils literal"><span class="pre">paste.auth.open_id</span></code> failures not returning a correct response.</li> <li>Changed <code class="docutils literal"><span class="pre">paste.httpexceptions.HTTPUnauthorized</span></code> so that the <code class="docutils literal"><span class="pre">WWW-Authenticate</span></code> header is not required. 401 responses don’t <em>have</em> to have that header.</li> <li>In <code class="docutils literal"><span class="pre">paste.fixture.TestApp</span></code>: <code class="docutils literal"><span class="pre"><form></span></code> tags that have to <code class="docutils literal"><span class="pre">action</span></code> will preserve the existing query string. (Generally relative links that are completely empty should but were not preserving the query string)</li> <li>Made <code class="docutils literal"><span class="pre">paste.*</span></code> compatible with <a class="reference external" href="http://www.py2exe.org/">py2exe</a> by adding a <code class="docutils literal"><span class="pre">modulefinder</span></code> call in <code class="docutils literal"><span class="pre">__init__.py</span></code></li> <li>The <code class="docutils literal"><span class="pre">paste.gzipper</span></code> gzipping middleware wasn’t changing the Content-Length header properly; thanks to Brad Clements for the fix.</li> <li>Fixed <code class="docutils literal"><span class="pre">paste.proxy</span></code> to not use anything based on the dict form of <code class="docutils literal"><span class="pre">httplib..HTTPMessage</span></code>. This form folds headers together in a way that breaks <code class="docutils literal"><span class="pre">Set-Cookie</span></code> headers (two <code class="docutils literal"><span class="pre">Set-Cookie</span></code> headers would be merged into one).</li> <li><code class="docutils literal"><span class="pre">paste.request.parse_formvars</span></code> didn’t accept parameters in <code class="docutils literal"><span class="pre">CONTENT_TYPE</span></code>. <code class="docutils literal"><span class="pre">prototype.js</span></code> sets a <code class="docutils literal"><span class="pre">charset</span></code> parameter, which caused a problem.</li> <li>Added a <code class="docutils literal"><span class="pre">__traceback_decorator__</span></code> magic local variable, to allow arbitrary manipulation of the output of <code class="docutils literal"><span class="pre">paste.exceptions.collector</span></code> before formatting.</li> <li>Added unicorn power to <code class="docutils literal"><span class="pre">paste.pony</span></code> (from Chad Whitacre)</li> <li>For <code class="docutils literal"><span class="pre">paste.httpserver</span></code> SSL support: add support loading an explicit certificate context, and using <code class="docutils literal"><span class="pre">ssl_pem='*'</span></code> create an unsigned SSL certificate (from Jason Kirtland).</li> <li>Fix some cases where <code class="docutils literal"><span class="pre">paste.httpserver</span></code> can have an orphaned thread pool (causing the process to not shut down properly). Patch from jek.</li> </ul> </div> <div class="section" id="id24"> <h2><a class="toc-backref" href="#id66">1.0</a><a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed <code class="docutils literal"><span class="pre">parsed_formvars</span></code> potentially locking up on wsgi.input after modification of <code class="docutils literal"><span class="pre">QUERY_STRING</span></code>.</li> <li>Fixed problem where <code class="docutils literal"><span class="pre">paste.exceptions.errormiddleware</span></code> didn’t expose the <code class="docutils literal"><span class="pre">.close()</span></code> method of the app_iter that it wraps (to catch exceptions). This is a problem if the server about the errormiddleware aborts the request; it should then call <code class="docutils literal"><span class="pre">.close()</span></code>, but won’t necessarily exhaust the iterator to do so.</li> <li>Added entry point for <code class="docutils literal"><span class="pre">paste.translogger</span></code> (<code class="docutils literal"><span class="pre">egg:Paste#translogger</span></code>)</li> <li>Fixed some cases where long data (e.g., a file upload) would show up in the error report, creating a very very large report. Also, put in a monkeypatch for the <code class="docutils literal"><span class="pre">cgi</span></code> module so that <code class="docutils literal"><span class="pre">repr(uploaded_field)</span></code> won’t load the entire field into memory (from its temporary file location).</li> <li>Added a <code class="docutils literal"><span class="pre">force_host</span></code> option to <code class="docutils literal"><span class="pre">paste.proxy.TransparentProxy</span></code>, which will force all incoming requests to the same host, but leave the <code class="docutils literal"><span class="pre">Host</span></code> header intact.</li> <li>Added automatic cleanup of old sessions for <code class="docutils literal"><span class="pre">paste.session</span></code>, from Amir Salihefendic.</li> <li>Quote the function name in tracebacks in the exception formatter; Genshi has function names that use <code class="docutils literal"><span class="pre"><></span></code>.</li> </ul> </div> <div class="section" id="id25"> <h2><a class="toc-backref" href="#id67">0.9.9</a><a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed <code class="docutils literal"><span class="pre">paste.response.HeaderDict</span></code> <code class="docutils literal"><span class="pre">get</span></code> and <code class="docutils literal"><span class="pre">setdefault</span></code> methods to be case insensitive</li> <li>Fix use of <code class="docutils literal"><span class="pre">TestApp().post(params={'key':</span> <span class="pre">['list</span> <span class="pre">of',</span> <span class="pre">'values']})</span></code> as reported by Syver Enstad.</li> <li><code class="docutils literal"><span class="pre">paste.fileapp.DataApp</span></code> is now directly usable (was previously only usable as an abstract base class).</li> </ul> </div> <div class="section" id="id26"> <h2><a class="toc-backref" href="#id68">0.9.8</a><a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed <code class="docutils literal"><span class="pre">wsgiwrappers.WSGIResponse.delete_cookie</span></code>. It also now takes optional path and domain arguments</li> <li><code class="docutils literal"><span class="pre">wsgiwrappers.WSGIResponse</span></code> now handles generator/iterator content more cleanly, and properly encodes unicode content according to its specified charset</li> <li>Fixed <code class="docutils literal"><span class="pre">wsgiwrappers.WSGIResponse</span></code> mishandling multiple headers of the same name</li> <li>Added a Paste Deploy entry point for <code class="docutils literal"><span class="pre">paste.auth.cookie</span></code></li> <li>Moved Paste Deploy dependencies out of top-level modules and into Paste-Deploy-specific entry point functions. This should make Paste more-or-less Paste Deploy independent. <code class="docutils literal"><span class="pre">paste.urlparser</span></code> and <code class="docutils literal"><span class="pre">paste.exceptions.errormiddleware</span></code> still have some leftover bits.</li> <li>Added another redirector type to <code class="docutils literal"><span class="pre">paste.recursive</span></code>, <code class="docutils literal"><span class="pre">environ['paste.recursive.include_app_iter']</span></code> which gives access to the original app_iter.</li> <li>Bug with <code class="docutils literal"><span class="pre">wsgilib.catch_errors</span></code> and app_iters with no <code class="docutils literal"><span class="pre">close()</span></code> method.</li> <li>Long words in tracebacks weren’t being wrapped correctly at all. Also, large data would cause the wrapping routine to give a recursion error. Now large data is truncated (at 1000 characters), and recursion won’t be a problem. Also, wrapping shouldn’t lose characters.</li> <li>Better exception if you try to put a non-str into environ when using <code class="docutils literal"><span class="pre">paste.auth.cookie</span></code></li> <li><code class="docutils literal"><span class="pre">paste.exceptions.collector</span></code> produces an <code class="docutils literal"><span class="pre">exc_data.exception_type</span></code> that is a class, not a string. This helps it get formatted better in Python 2.5.</li> <li>All the tests pass on Python 2.5!</li> <li>Added <code class="docutils literal"><span class="pre">paste.proxy.TransparentProxy</span></code>, which just sends the request described in the WSGI environ on without any modification. More useful for WSGI clients than servers, it effectively allows any WSGI-based request mechanism to act like an httplib-based request mechanism.</li> <li>Added a <code class="docutils literal"><span class="pre">cache_max_age</span></code> argument to <code class="docutils literal"><span class="pre">paste.urlparser.StaticURLParser</span></code>, which allows you to encourage the caching of static files. Patch from Brad Clements.</li> <li>Added <code class="docutils literal"><span class="pre">suppress_http_headers</span></code> to <code class="docutils literal"><span class="pre">paste.proxy.Proxy</span></code>, which will filter out HTTP headers from the request before passing it on. Patch from Brad Clements.</li> </ul> </div> <div class="section" id="id27"> <h2><a class="toc-backref" href="#id69">0.9.7</a><a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>The <code class="docutils literal"><span class="pre">EvalException</span></code> ‘full traceback’ button is now only displayed when the full traceback differs from the regular (includes hidden frames).</li> <li>Fixed <code class="docutils literal"><span class="pre">EvalException</span></code> returning a Content-type of ‘text-html’ instead of ‘text/html’ in some cases.</li> </ul> </div> <div class="section" id="id28"> <h2><a class="toc-backref" href="#id70">0.9.6</a><a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Renamed the <code class="docutils literal"><span class="pre">paste.util.multidict.multidict</span></code> class to <code class="docutils literal"><span class="pre">paste.util.multidict.MultiDict</span></code></li> </ul> </div> <div class="section" id="id29"> <h2><a class="toc-backref" href="#id71">0.9.5</a><a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h2> <ul> <li><p class="first">Fixed a security vulnerability in <code class="docutils literal"><span class="pre">paste.urlparser</span></code>‘s StaticURLParser and PkgResourcesParser where, with some servers, you could escape the document root.</p> </li> <li><p class="first">Significantly improved <code class="docutils literal"><span class="pre">paste.httpserver</span></code>‘s (egg:Paste#http) performance. It now uses a thread pool: previously it created a new thread for every request. To revert back to the old, slower behavior, set:</p> <div class="highlight-python"><div class="highlight"><pre><span class="n">use_threadpool</span> <span class="o">=</span> <span class="n">false</span> </pre></div> </div> <p>in the [server:main] section of the config file.</p> </li> <li><p class="first">More control of where the output of <code class="docutils literal"><span class="pre">paste.debug.prints</span></code> goes.</p> </li> <li><p class="first">Added a warning to <code class="docutils literal"><span class="pre">paste.wsgilib.add_close</span></code> if the upstream app_iter consumer doesn’t call the <code class="docutils literal"><span class="pre">app_iter.close()</span></code> method.</p> </li> <li><p class="first">Fixed <code class="docutils literal"><span class="pre">testapp.post(params={})</span></code></p> </li> <li><p class="first">Fixed <code class="docutils literal"><span class="pre">paste.translogger.TransLogger</span></code> to log to the Apache combined log format as advertised.</p> </li> <li><p class="first">Fixed <code class="docutils literal"><span class="pre">paste.urlparser</span></code> classes to handle quoted characters (e.g. %20) in URL paths.</p> </li> <li><p class="first">Changed <code class="docutils literal"><span class="pre">paste.session</span></code> to allow manipulating a session for the first time after <code class="docutils literal"><span class="pre">start_response</span></code> is called.</p> </li> <li><p class="first">Added <code class="docutils literal"><span class="pre">paste.wsgilib.add_start_close</span></code> which calls a function just before returning the first chunk of the app_iter.</p> </li> <li><p class="first">Changed <code class="docutils literal"><span class="pre">paste.urlmap</span></code> so that it matches domain-specific mappings before domain-neutral mappings.</p> </li> <li><p class="first">Fixed IE 6 potentially receiving the following <code class="docutils literal"><span class="pre">"400</span> <span class="pre">Bad</span> <span class="pre">Request"</span></code> error on file downloads:</p> <div class="highlight-python"><div class="highlight"><pre>Please check your system clock. According to this server, the time provided in the If-Modified-Since header is in the future. </pre></div> </div> </li> <li><p class="first">Added a ‘no’ keyword argument to <code class="docutils literal"><span class="pre">TestResponse.mustcontain</span></code>, so you can assert that a response does contain some strings at the same time that you assert that a response <em>does not</em> contain other strings, like:</p> <div class="highlight-python"><div class="highlight"><pre><span class="n">res</span> <span class="o">=</span> <span class="n">app</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'/'</span><span class="p">)</span> <span class="n">res</span><span class="o">.</span><span class="n">mustcontain</span><span class="p">(</span><span class="s">'this must be there'</span><span class="p">,</span> <span class="n">no</span><span class="o">=</span><span class="p">[</span><span class="s">'error'</span><span class="p">,</span> <span class="s">'unexpected'</span><span class="p">])</span> </pre></div> </div> </li> <li><p class="first">Fixed <code class="docutils literal"><span class="pre">fileapp.FileApp</span></code> to pay attention to the <code class="docutils literal"><span class="pre">If-None-Match</span></code> header, which does ETag matching; before only <code class="docutils literal"><span class="pre">If-Modified-Since</span></code> was supported, even though an <code class="docutils literal"><span class="pre">ETag</span></code> header was being sent; in particular Firefox would then only send <code class="docutils literal"><span class="pre">If-None-Match</span></code> and so conditional requests never worked.</p> </li> <li><p class="first">Changed usage of <code class="docutils literal"><span class="pre">paste.request.MultiDict</span></code> to <code class="docutils literal"><span class="pre">paste.util.multidict</span></code>, particularly in <code class="docutils literal"><span class="pre">paste.wsgiwrappers</span></code> where <code class="docutils literal"><span class="pre">request.GET</span></code> returns a new style of dictionary interface.</p> </li> <li><p class="first">Be more careful in <code class="docutils literal"><span class="pre">paste.request.parse_formvars</span></code> not to let the <code class="docutils literal"><span class="pre">cgi</span></code> module read from <code class="docutils literal"><span class="pre">wsgi.input</span></code> when there are no parsable variables in the input (based on <code class="docutils literal"><span class="pre">CONTENT_TYPE</span></code>).</p> </li> </ul> </div> <div class="section" id="id30"> <h2><a class="toc-backref" href="#id72">0.9.4</a><a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>This released was lost in a tragic clerical accident.</li> </ul> </div> <div class="section" id="id31"> <h2><a class="toc-backref" href="#id73">0.9.3</a><a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>0.9.2 Included a version of MochiKit that was no longer compatible with evalexception; 0.9.3 reverts to a previous version.</li> <li>Change wsgi.run_once=False for <code class="docutils literal"><span class="pre">paste.httpserver</span></code></li> <li>Added entry points for debug apps</li> </ul> </div> <div class="section" id="id32"> <h2><a class="toc-backref" href="#id74">0.9.2</a><a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fix in paste.urlmap when connecting with host:port.</li> <li>Added <code class="docutils literal"><span class="pre">/_debug/summary</span></code> to evalexception, which gives a JSON-formatted list of all the exceptions in memory.</li> </ul> </div> <div class="section" id="id33"> <h2><a class="toc-backref" href="#id75">0.9.1</a><a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>A fix for paste.errordocument, when doing an internal redirect from a POST request (the request is rewritten as a GET request)</li> </ul> </div> <div class="section" id="id34"> <h2><a class="toc-backref" href="#id76">0.9</a><a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Added <a class="reference external" href="class-paste.request.WSGIRequest.html">paste.request.WSGIRequest</a>, a request object that wraps the WSGI environment.</li> <li>Added <a class="reference external" href="module-paste.registry.html">paste.registry</a>, which is middleware for registering threadlocal objects in a request.</li> <li>Avoid annoying warning from paste.recursive</li> <li><code class="docutils literal"><span class="pre">paste.httpserver</span></code> now removes HTTPServer’s transaction logging, which was doing a reverse DNS lookup.</li> <li>Added <code class="docutils literal"><span class="pre">has_session</span></code> to <code class="docutils literal"><span class="pre">paste.session</span></code></li> <li>Allow for conditional <code class="docutils literal"><span class="pre">paste.wsgilib.intercept_output</span></code> which should be slightly faster (and streamable) compared to doing the condition manually.</li> <li>Added entry point for <a class="reference external" href="module-paste.proxy.html">paste.proxy</a>, plus improvements from Brad Clements (support path in target, filter request methods)</li> <li>Added <a class="reference external" href="module-paste.pony.html">paste.pony</a> so pony power can be added to any WSGI application.</li> <li>Added port matching to <code class="docutils literal"><span class="pre">paste.urlmap</span></code>.</li> </ul> </div> <div class="section" id="id35"> <h2><a class="toc-backref" href="#id77">0.5</a><a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Added <a class="reference external" href="module-paste.auth.auth_tkt.html">paste.auth.auth_tkt</a></li> <li>Added <a class="reference external" href="module-paste.auth.grantip.html">paste.auth.grantip</a></li> </ul> </div> <div class="section" id="id36"> <h2><a class="toc-backref" href="#id78">0.4.1</a><a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Some bug fixes to the <a class="reference external" href="module-paste.httpserver.html">built-in HTTP server</a>.</li> <li>Experimental <a class="reference external" href="module-paste.progress.html">paste.progress</a> middleware for tracking upload progress</li> <li>Some tweaking of how <a class="reference external" href="module-paste.reload.html">paste.reload</a> works, especially with respect to shutdown.</li> </ul> </div> <div class="section" id="id37"> <h2><a class="toc-backref" href="#id79">0.4</a><a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h2> <ul class="simple"> <li>Fixed up paste documentation (especially for new packages/modules)</li> <li>Added <a class="reference external" href="module-paste.auth.html">paste.auth</a> package for authentication related WSGI middle-ware components:<ul> <li><code class="docutils literal"><span class="pre">basic</span></code> and <code class="docutils literal"><span class="pre">digest</span></code> HTTP authentication as described by RFC 2617</li> <li>support for Yale’s Central Authentication System (<code class="docutils literal"><span class="pre">cas</span></code>)</li> <li><code class="docutils literal"><span class="pre">open_id</span></code> supports single sign-on originally developed for LiveJournal (see <a class="reference external" href="http://openid.net">http://openid.net</a>)</li> <li><code class="docutils literal"><span class="pre">cookie</span></code> digitally signs cookies to record the current authenticated user (<code class="docutils literal"><span class="pre">REMOTE_USER</span></code>), session identifier (<code class="docutils literal"><span class="pre">REMOTE_SESSION</span></code>), and other WSGI entries in the <code class="docutils literal"><span class="pre">environ</span></code>.</li> <li>a <code class="docutils literal"><span class="pre">form</span></code> module (to be used with <code class="docutils literal"><span class="pre">cookie</span></code> or an equivalent) provides a simple HTML based form authentication.</li> <li>the <code class="docutils literal"><span class="pre">multi</span></code> module is an <em>experimental</em> mechanism for choosing an authentication mechanism based on the WSGI <code class="docutils literal"><span class="pre">environ</span></code></li> </ul> </li> <li>Added <a class="reference external" href="module-paste.httpserver.html">paste.httpserver</a> module which provides a very simple WSGI server built upon python’s <code class="docutils literal"><span class="pre">BaseHTTPServer</span></code>; this server has support for several features:<ul> <li>support for SSL connections via OpenSSL</li> <li>support for HTTP/1.1 <code class="docutils literal"><span class="pre">100</span> <span class="pre">Continue</span></code> messages as required by the WSGI specification (many HTTP server implementations don’t do this)</li> <li>implemented as a Mix-In so that it can be used with other more enchanted versions of <code class="docutils literal"><span class="pre">BaseHTTPServer</span></code></li> <li>support for ‘Keep-Alive’ (standard in HTTP/1.1) by either providing a content-length or closing a connection if one is not available</li> </ul> </li> <li>Improved the <a class="reference external" href="module-paste.httpexceptions.html">paste.httpexceptions</a> module:<ul> <li>added missing exception objects, and better descriptions</li> <li>fixed several bugs in how exceptions are caught and propagated</li> <li>usage as a <code class="docutils literal"><span class="pre">wsgi_application()</span></code> enables exceptions to be returned without throwing or catching the error</li> <li>support for plain/text messages for text-only clients such as curl, python’s urllib, or Microsoft Excel</li> <li>allows customization of the HTML template for higher-level frameworks</li> </ul> </li> <li>Added <a class="reference external" href="module-paste.httpheaders.html">paste.httpheaders</a> module to provide a uniform mechanism to access/update standard HTTP headers in a WSGI <code class="docutils literal"><span class="pre">environ</span></code> and <code class="docutils literal"><span class="pre">response_headers</span></code> collection; it includes specific support for:<ul> <li>providing “common” header names and sorting them as suggested by RFC 2616</li> <li>validated support for <code class="docutils literal"><span class="pre">Cache-Control</span></code> header construction</li> <li>validated support for <code class="docutils literal"><span class="pre">Content-Disposition</span></code> header construction</li> <li>parsing of <code class="docutils literal"><span class="pre">If-Modified-Since</span></code> and other date oriented headers</li> <li>parsing of Range header for partial-content delivery</li> <li>composition of HTTP/1.1 digest <code class="docutils literal"><span class="pre">Authorization</span></code> responses</li> </ul> </li> <li>Improved <a class="reference external" href="module-paste.fileapp.html">paste.fileapp</a> to support:<ul> <li>static in-memory resources</li> <li>incremental downloading of files from disk</li> <li>responding to ‘Range’ requests to handle partial downloads</li> <li>allowing cache settings to be easily provided; including support for HTTP/1.0 ‘Expires’ and HTTP/1.1 ‘Cache-Control’</li> </ul> </li> <li>Added an <em>experimental</em> <a class="reference external" href="module-paste.transaction.html">paste.transaction</a> module for handling commit/rollback of standard DBAPI database connections</li> <li>Added a <a class="reference external" href="module-paste.util.datetimeutil.html">paste.util.datetimeutil</a> module for parsing standard date/time user-generated text values</li> <li>Added a <a class="reference external" href="module-paste.debug.html">debug</a> package, which includes:<ul> <li>previous top-level modules <code class="docutils literal"><span class="pre">prints</span></code>, <code class="docutils literal"><span class="pre">profile</span></code>, <code class="docutils literal"><span class="pre">wdg_validate</span></code> and <code class="docutils literal"><span class="pre">doctest_webapp</span></code></li> <li>a <code class="docutils literal"><span class="pre">testserver</span></code> module suitable to test HTTP socket connections via <code class="docutils literal"><span class="pre">py.test</span></code></li> </ul> </li> <li>Re-factored <a class="reference external" href="module-paste.wsgilib.html">paste.wsgilib</a> into several other modules:<ul> <li>functions regarding header manipulation moved to <a class="reference external" href="module-paste.response.html">paste.response</a></li> <li>functions regarding cookies and arguments moved to <a class="reference external" href="module-paste.request.html">paste.request</a></li> </ul> </li> <li>Significant improvements to <code class="docutils literal"><span class="pre">wsgiutils.wsgilib</span></code> module:<ul> <li>added a <code class="docutils literal"><span class="pre">dump_environ</span></code> application to help debugging</li> <li>fixes to <code class="docutils literal"><span class="pre">raw_interactive</span></code> to comply with WSGI specifications</li> <li><code class="docutils literal"><span class="pre">raw_interactive</span></code> now logs all 5xx exceptions and sets HTTP_HOST</li> </ul> </li> <li>Added an argument <code class="docutils literal"><span class="pre">no_profile</span></code> to <a class="reference external" href="module-paste.debug.profile.html#profile_decorator">paste.debug.profile.profile_decorator</a>; if that option is false, then don’t profile the function at all.</li> <li>Changed <a class="reference external" href="module-paste.lint.html">paste.lint</a> to check that the status contains a message (e.g., <code class="docutils literal"><span class="pre">"404</span> <span class="pre">Not</span> <span class="pre">Found"</span></code> instead of just <code class="docutils literal"><span class="pre">"404"</span></code>). Check that environmental variables <code class="docutils literal"><span class="pre">HTTP_CONTENT_TYPE</span></code> and <code class="docutils literal"><span class="pre">HTTP_CONTENT_LENGTH</span></code> are no present. Made unknown <code class="docutils literal"><span class="pre">REQUEST_METHOD</span></code> a warning (not an error).</li> <li>Added parameter <code class="docutils literal"><span class="pre">cwd</span></code> to <a class="reference external" href="class-paste.fixture.TestFileEnvironment.html#run">TestFileEnvironment.run</a></li> <li><a class="reference external" href="class-paste.fixture.TestApp.html">paste.fixture.TestApp</a>:<ul> <li>Form filling code (use <code class="docutils literal"><span class="pre">response.forms[0]</span></code> to get a <a class="reference external" href="class-paste.fixture.Form.html">form object</a>)</li> <li>Added <a class="reference external" href="class-paste.fixture.TestResponse.html#click">click method</a>.</li> <li>Better attribute errors.</li> <li>You can force set hidden fields using <code class="docutils literal"><span class="pre">form.fields[name].force_value(value)</span></code> (normally setting the value of a hidden field is an error).</li> <li>Frameworks can now add custom attributes to the response object.</li> </ul> </li> <li><code class="docutils literal"><span class="pre">paste.wsgilib.capture_output</span></code> is deprecated in favor of <a class="reference external" href="module-paste.wsgilib.html#intercept_output">paste.wsgilib.intercept_output</a></li> <li>Remove use of exceptions in <a class="reference external" href="class-paste.cascade.Cascade.html">paste.cascade.Cascade</a>, which causes weird effects in some cases. Generally we aren’t using exceptions internally now, only return status codes. Also in cascade, be careful to keep cascaded requests from sharing the same environment.</li> <li><code class="docutils literal"><span class="pre">paste.wsgilib.error_response</span></code> is deprecated (<a class="reference external" href="module-paste.httpexceptions.html">paste.httpexceptions</a> replaces this with exception’s <code class="docutils literal"><span class="pre">.wsgi_application</span></code> method).</li> <li>Moved <code class="docutils literal"><span class="pre">paste.login</span></code> to the attic, since <a class="reference external" href="module-paste.auth.html">paste.auth</a> pretty much replaces it.</li> <li><a class="reference external" href="module-paste.urlparser.html">paste.urlparser</a> improvements:<ul> <li>Added an application <a class="reference external" href="class-paste.urlparser.StaticURLParser.html">urlparser.StaticURLParser</a> for serving static files.</li> <li>Added an application <a class="reference external" href="class-paste.urlparser.PkgResourcesParser.html">urlparser.PkgResourcesParser</a> for serving static files found with <code class="docutils literal"><span class="pre">pkg_resources</span></code> (e.g., out of zipped Eggs).</li> <li>Be less picky about ambiguous filenames when using <a class="reference external" href="class-paste.urlparser.URLParser.html">URLParser</a>; if an exact file match exists, use that. (<code class="docutils literal"><span class="pre">file.gif.bak</span></code> would cause a request for <code class="docutils literal"><span class="pre">file.gif</span></code> to be ambiguous before)</li> <li>Now looks for a <code class="docutils literal"><span class="pre">.wsgi_application</span></code> attribute when serving Python files/modules, as a general hook for returning a WSGI application version of an object.</li> </ul> </li> <li>The <a class="reference external" href="class-paste.exceptions.errormiddleware.ErrorMiddleware.html">ErrorMiddleware</a>:<ul> <li>Returns trimmed-down exceptions if there is a <code class="docutils literal"><span class="pre">_</span></code> GET variable in the request (which is meant to signal an XMLHttpRequest). Exceptions displayed in this context are best when they are smaller and easier to display.</li> <li>Includes a text version of the traceback, for easier copy-and-paste.</li> <li>Avoid printing exceptions to <code class="docutils literal"><span class="pre">wsgi.errors</span></code> if they are already displayed elsewhere (at least by default).</li> <li>Highlight Python code.</li> </ul> </li> <li>Use <code class="docutils literal"><span class="pre">pkg_resources.declare_namespace</span></code> so that there are less problems about confusing the <code class="docutils literal"><span class="pre">paste</span></code> package that is provided by Paste, Paste Script, Paste Deploy, and Paste WebKit. Before you could get one of these at random if you didn’t use <code class="docutils literal"><span class="pre">pkg_resources.require</span></code> first.</li> <li>Cleaned up use of <code class="docutils literal"><span class="pre">exc_info</span></code> argument in <code class="docutils literal"><span class="pre">start_response</span></code> calls (both accepting and producing), in a variety of places.</li> </ul> </div> </div> </div> </div> </div> <div class="sphinxsidebar" role="navigation" aria-label="main navigation"> <div class="sphinxsidebarwrapper"> <h3><a href="http://pythonpaste.org/" class="invisible-link">Python Paste</a></h3> <ul> <li><a href="https://bitbucket.org/ianb/pastescript/issues/">Issue tracker</a></li> <li><a href="http://pythonpaste.org/">Paste core</a></li> <li><a href="http://webob.org/">WebOb</a></li> <li><a href="http://pythonpaste.org/deploy/">Paste Deploy</a></li> <li><a href="http://pythonpaste.org/script/">Paste Script</a></li> <li><a href="http://webtest.pythonpaste.org/">WebTest</a></li> <li><a href="http://pythonpaste.org/scripttest/">ScriptType</a></li> <li><a href="http://pythonpaste.org/initools/">INITools</a></li> <li><a href="http://pythonpaste.org/tempita/">Tempita</a></li> <li><a href="http://pythonpaste.org/waitforit/">WaitForIt</a></li> <li><a href="http://pythonpaste.org/wphp/">WPHP</a></li> <li><a href="http://pythonpaste.org/wsgifilter/">WSGIFilter</a></li> <li><a href="http://pythonpaste.org/wsgiproxy/">WSGIProxy</a></li> </ul> <h3><a href="index.html">Table Of Contents</a></h3> <ul> <li><a class="reference internal" href="#">News</a><ul> <li><a class="reference internal" href="#id1">2.0.2</a></li> <li><a class="reference internal" href="#id2">2.0.1</a></li> <li><a class="reference internal" href="#id3">2.0</a></li> <li><a class="reference internal" href="#id4">1.7.5.1</a></li> <li><a class="reference internal" href="#id5">1.7.5</a></li> <li><a class="reference internal" href="#id6">1.7.4</a></li> <li><a class="reference internal" href="#id7">1.7.3.1</a></li> <li><a class="reference internal" href="#id8">1.7.3</a></li> <li><a class="reference internal" href="#id9">1.7.2</a></li> <li><a class="reference internal" href="#id10">1.7.1</a></li> <li><a class="reference internal" href="#id11">1.7</a></li> <li><a class="reference internal" href="#id12">1.6.1</a></li> <li><a class="reference internal" href="#id13">1.6</a></li> <li><a class="reference internal" href="#id14">1.5.1</a></li> <li><a class="reference internal" href="#id15">1.5</a></li> <li><a class="reference internal" href="#id16">1.4.2</a></li> <li><a class="reference internal" href="#id17">1.4.1</a></li> <li><a class="reference internal" href="#id18">1.4</a></li> <li><a class="reference internal" href="#id19">1.3</a></li> <li><a class="reference internal" href="#id20">1.2.1</a></li> <li><a class="reference internal" href="#id21">1.2</a><ul> <li><a class="reference internal" href="#in-paste-wsgiwrappers">In paste.wsgiwrappers</a></li> <li><a class="reference internal" href="#in-paste-httpserver">In paste.httpserver</a></li> </ul> </li> <li><a class="reference internal" href="#id22">1.1.1</a></li> <li><a class="reference internal" href="#id23">1.1</a></li> <li><a class="reference internal" href="#id24">1.0</a></li> <li><a class="reference internal" href="#id25">0.9.9</a></li> <li><a class="reference internal" href="#id26">0.9.8</a></li> <li><a class="reference internal" href="#id27">0.9.7</a></li> <li><a class="reference internal" href="#id28">0.9.6</a></li> <li><a class="reference internal" href="#id29">0.9.5</a></li> <li><a class="reference internal" href="#id30">0.9.4</a></li> <li><a class="reference internal" href="#id31">0.9.3</a></li> <li><a class="reference internal" href="#id32">0.9.2</a></li> <li><a class="reference internal" href="#id33">0.9.1</a></li> <li><a class="reference internal" href="#id34">0.9</a></li> <li><a class="reference internal" href="#id35">0.5</a></li> <li><a class="reference internal" href="#id36">0.4.1</a></li> <li><a class="reference internal" href="#id37">0.4</a></li> </ul> </li> </ul> <div class="relations"> <h3>Related Topics</h3> <ul> <li><a href="index.html">Documentation overview</a><ul> <li>Previous: <a href="index.html" title="previous chapter">Python Paste</a></li> <li>Next: <a href="future.html" title="next chapter">The Future Of Paste</a></li> </ul></li> </ul> </div> <div role="note" aria-label="source link"> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="_sources/news.txt" rel="nofollow">Show Source</a></li> </ul> </div> <div id="searchbox" style="display: none" role="search"> <h3>Quick search</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <script type="text/javascript">$('#searchbox').show(0);</script> </div> </div> <div class="clearer"></div> </div> <div class="footer"> ©2008, Ian Bicking. | Powered by <a href="http://sphinx-doc.org/">Sphinx 1.3.1</a> & <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.6</a> | <a href="_sources/news.txt" rel="nofollow">Page source</a> </div> </body> </html>