news.txt 34 KB

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