news.txt 31 KB

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