NEWS 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. 0.30.2
  2. ======
  3. * greendns: patch ssl to fix RecursionError on SSLContext.options.__set__ https://github.com/eventlet/eventlet/issues/677
  4. 0.30.1
  5. ======
  6. * patcher: built-in open() did not accept kwargs https://github.com/eventlet/eventlet/issues/683
  7. 0.30.0
  8. ======
  9. * pyopenssl tsafe module was deprecated and removed in v20.0.0
  10. * deprecate pyevent hub
  11. * Deprecate CPython 2.7 and 3.4 support
  12. * py39: Add _at_fork_reinit method to Semaphores
  13. 0.29.1
  14. ======
  15. patcher: [py27] recursion error in pytest/python2.7 installing register_at_fork https://github.com/eventlet/eventlet/issues/660
  16. patcher: monkey_patch(builtins=True) failed on py3 because `file` class is gone https://github.com/eventlet/eventlet/issues/541
  17. don't crash on PyPy 7.0.0 https://github.com/eventlet/eventlet/pull/547
  18. Only install monotonic on python2 https://github.com/eventlet/eventlet/pull/583
  19. 0.29.0
  20. ======
  21. * ssl: context wrapped listener fails accept() https://github.com/eventlet/eventlet/issues/651
  22. 0.28.1
  23. ======
  24. * Sorry, Eventlet was broken on Windows for versions 0.27-0.28
  25. patcher: no os.register_at_fork on Windows (#654)
  26. * Clean up TypeError in __del__
  27. 0.28.0
  28. ======
  29. * Always remove the right listener from the hub https://github.com/eventlet/eventlet/pull/645
  30. 0.27.0
  31. ======
  32. * patcher: Clean up threading book-keeping at fork when monkey-patched
  33. * backdoor: handle disconnects better
  34. 0.26.1
  35. ======
  36. * pin dnspython <2.0.0 https://github.com/eventlet/eventlet/issues/619
  37. 0.26.0
  38. ======
  39. * Fix compatibility with SSLContext usage >= Python 3.7
  40. * wsgi: Fix header capitalization on py3
  41. * Fix #508: Py37 Deadlock ThreadPoolExecutor (#598)
  42. * drop Python 3.4 support
  43. * Fix misc SyntaxWarning's under Python 3.8
  44. * Remove unnecessary assignment in _recv_loop (#601)
  45. 0.25.2
  46. ======
  47. * green.ssl: redundant set_nonblocking() caused SSLWantReadError
  48. 0.25.1
  49. ======
  50. * wsgi (tests): Stop using deprecated cgi.parse_qs() to support Python 3.8; Thanks to Miro Hrončok
  51. * os: Add workaround to `open` for pathlib on py 3.7; Thanks to David Szotten
  52. 0.25.0
  53. ======
  54. * wsgi: Only send 100 Continue response if no response has been sent yet; Thanks to Tim Burke
  55. * wsgi: Return 400 on negative Content-Length request headers; Thanks to Tim Burke
  56. * Make a GreenPile with no spawn()s an empty sequence; Thanks to nat-goodspeed
  57. * wsgi: fix Input.readlines when dealing with chunked input; Thanks to Tim Burke
  58. * wsgi: fix Input.readline on Python 3; Thanks to Tim Burke
  59. * wsgi: Stop replacing invalid UTF-8 on py3; Thanks to Tim Burke
  60. * ssl: Fix compatibility with Python 3.7 ssl.SSLSocket; Thanks to Junyi
  61. * reimport submodule as well in patcher.inject; Thanks to Junyi
  62. * use Python 2 compatible syntax for keyword-only args; Thanks to nat-goodspeed
  63. * wsgi: Catch and swallow IOErrors during discard(); Thanks to Tim Burke
  64. * Fix for Python 3.7; Thanks to Marcel Plch
  65. * Fix race that could cause using epolls as default hub even when platform does not support it; Thanks to Sergey Shepelev
  66. * wsgi: make Expect 100-continue field-value case-insensitive; Thanks to Julien Kasarherou
  67. * greenthread: optimize _exit_funcs getattr/del dance; Thanks to Alex Kashirin
  68. * New benchmarks runner; Thanks to Sergey Shepelev
  69. * ssl: fix connect to use monotonic clock for timeout; Thanks to Sergey Shepelev
  70. 0.24.1
  71. ======
  72. * greendns: don't contact nameservers if one entry is returned from hosts file; Thanks to Daniel Alvarez
  73. 0.24.0
  74. ======
  75. * greendns: Fix infinite loop when UDP source address mismatch; Thanks to Lon Hohberger
  76. * greendns: Fix bad ipv6 comparison; Thanks to Lon Hohberger
  77. * wsgi: Use byte strings on py2 and unicode strings on py3; Thanks to Tim Burke
  78. * pools: put to empty pool would block sometimes; Thanks to Sam Merritt
  79. * greendns: resolving over TCP produced ValueError; Thanks to Jaume Marhuenda
  80. * support.greendns: ImportError when dns.rdtypes was imported before eventlet; Thanks to Jaume Marhuenda
  81. * greendns: full comment lines were not skipped; Thanks to nat-goodspeed
  82. * Drop support for Python3.3; Python2.6 and python-epoll package
  83. * external dependencies for six, monotonic, dnspython; Thanks to nat-goodspeed
  84. * wsgi: Don't strip all Unicode whitespace from headers on py3; Thanks to Tim Burke
  85. 0.23.0
  86. ======
  87. * green.threading: current_thread() did not see new monkey-patched threads; Thanks to Jake Tesler
  88. * tpool: exception in tpool-ed call leaked memory via backtrace
  89. * wsgi: latin-1 encoding dance for environ[PATH_INFO]
  90. 0.22.1
  91. ======
  92. * Fixed issue installing excess enum34 on Python3.4+ (rebuild with updated setuptools)
  93. * event: Event.wait() timeout=None argument to be compatible with upstream CPython
  94. * greendns: Treat /etc/hosts entries case-insensitive; Thanks to Ralf Haferkamp
  95. 0.22.0
  96. ======
  97. * convenience: (SO_REUSEPORT) socket.error is not OSError on Python 2; Thanks to JacoFourie@github
  98. * convenience: SO_REUSEPORT is not available on WSL platform (Linux on Windows)
  99. * convenience: skip SO_REUSEPORT for bind on random port (0)
  100. * dns: reading /etc/hosts raised DeprecationWarning for universal lines on Python 3.4+; Thanks to Chris Kerr
  101. * green.openssl: Drop OpenSSL.rand support; Thanks to Haikel Guemar
  102. * green.subprocess: keep CalledProcessError identity; Thanks to Linbing@github
  103. * greendns: be explicit about expecting bytes from sock.recv; Thanks to Matt Bennett
  104. * greendns: early socket.timeout was breaking IO retry loops
  105. * GreenSocket.accept does not notify_open; Thanks to orishoshan
  106. * patcher: set locked RLocks' owner only when patching existing locks; Thanks to Quan Tian
  107. * patcher: workaround for monotonic "no suitable implementation"; Thanks to Geoffrey Thomas
  108. * queue: empty except was catching too much
  109. * socket: context manager support; Thanks to Miguel Grinberg
  110. * support: update monotonic 1.3 (5c0322dc559bf)
  111. * support: upgrade bundled dnspython to 1.16.0 (22e9de1d7957e) https://github.com/eventlet/eventlet/issues/427
  112. * websocket: fd leak when client did not close connection properly; Thanks to Konstantin Enchant
  113. * websocket: support permessage-deflate extension; Thanks to Costas Christofi and Peter Kovary
  114. * wsgi: close idle connections (also applies to websockets)
  115. * wsgi: deprecated options are one step closer to removal
  116. * wsgi: handle remote connection resets; Thanks to Stefan Nica
  117. 0.21.0
  118. ======
  119. * New timeout error API: .is_timeout=True on exception object
  120. It's now easy to test if network error is transient and retry is appropriate.
  121. Please spread the word and invite other libraries to support this interface.
  122. * hubs: use monotonic clock by default (bundled package); Thanks to Roman Podoliaka and Victor Stinner
  123. * dns: EVENTLET_NO_GREENDNS option is back, green is still default
  124. * dns: hosts file was consulted after nameservers
  125. * ssl: RecursionError on Python3.6+; Thanks to justdoit0823@github and Gevent developers
  126. * wsgi: log_output=False was not disabling startup and accepted messages
  127. * greenio: Fixed OSError: [WinError 10038] Socket operation on nonsocket
  128. * dns: EAI_NODATA was removed from RFC3493 and FreeBSD
  129. * green.select: fix mark_as_closed() wrong number of args
  130. * green.zmq: socket.{recv,send}_* signatures did not match recent upstream pyzmq
  131. * New feature: Add zipkin tracing to eventlet
  132. * db_pool: proxy Connection.set_isolation_level()
  133. * green.zmq: support RCVTIMEO (receive timeout)
  134. * green.profile: Python3 compatibility; Thanks to Artur Stawiarski
  135. * support: upgrade bundled six to 1.10 (dbfbfc818e3d)
  136. * python3.6: http.client.request support chunked_encoding
  137. 0.20.1
  138. ======
  139. * dns: try unqualified queries as top level
  140. * test_import_patched_defaults bended to play with pyopenssl>=16.1.0
  141. * Explicit environ flag for importing eventlet.__version__ without ignoring import errors
  142. * Type check Semaphore, GreenPool arguments; Thanks to Matthew D. Pagel
  143. 0.20.0
  144. ======
  145. * IMPORTANT: removed select.poll() function
  146. * DNS resolving is always green with dnspython bundled in
  147. * greenio: only trampoline when we block
  148. * convenience: listen() sets SO_REUSEPORT when available; Thanks to Zhengwei Gao
  149. * ssl: Fix "TypeError: read() argument 2 must be read-write bytes-like object, not None"
  150. * greenio: _recv_loop behaviour with recv_into on closed sock
  151. * ipv6: getaddrinfo would fail with scope index
  152. * green.zmq: Support {send,recv}_{string,json,pyobj} wrappers
  153. * greendns: Return answers from /etc/hosts despite nameserver errors
  154. * patcher: fixed green existing locks fail (Python3)
  155. * Add DAGPool, a dependency-driven greenthread pool
  156. * wsgi: Unix socket address representation; Thanks to Samuel Merritt
  157. * tpool: isolate internal socket from default timeout; Thanks to Alex Villacís Lasso
  158. * wsgi: only skip Content-Type and Content-Length headers (GH-327)
  159. * wsgi: 400 on blank Content-Length headers (GH-334)
  160. * greenio: makefile related pypy socket ref counting
  161. * ssl: Fix recv_into blocking when reading chunks of data
  162. * websocket: support Gunicorn environ['gunicorn.socket']
  163. 0.19.0
  164. ======
  165. * ssl: IMPORTANT DoS FIX do_handshake_connect=False in server accept(); Thanks to Garth Mollett
  166. * patcher: patch existing threading locks; Thanks to Alexis Lee
  167. * green.urllib2: missing patched ssl module; Thanks to Collin RM Stocks
  168. * wsgi: environ[headers_raw] tuple of unmodified name: value pairs
  169. * test against modern pyopenssl 16.0.0 for Python 2.7+; Thanks to Victor Stinner
  170. * wsgi: document compatibility with python `logging`
  171. * Minor grammatical improvements and typo fixes to the docs; Thanks to Steven Erenst
  172. 0.18.4
  173. ======
  174. * wsgi: change TCP_NODELAY to TCP_QUICKACK, ignore socket error when not available
  175. 0.18.3
  176. ======
  177. * wsgi: Use buffered writes - fixes partial socket.send without custom
  178. writelines(); Github issue #295
  179. * wsgi: TCP_NODELAY enabled by default
  180. 0.18.2
  181. ======
  182. * wsgi: Fix data loss on partial writes (socket.send); Thanks to Jakub Stasiak
  183. 0.18.1
  184. ======
  185. * IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1
  186. * patcher: Fix AttributeError in subprocess communicate()
  187. * greenio: Fix "TypeError: an integer is required" in sendto()
  188. 0.18.0
  189. ======
  190. * IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1
  191. * greenio: Fixed a bug that could cause send() to start an endless loop on
  192. ENOTCONN; Thanks to Seyeong Kim
  193. * wsgi: Fixed UNIX socket address being trimmed in "wsgi starting" log; Thanks
  194. to Ihar Hrachyshka
  195. * ssl: Ported eventlet.green.OpenSSL to Python 3; Thanks to Victor Stinner
  196. * greenio: Made read() support buflen=-1 and added readall() (Python 3);
  197. Thanks to David Szotten
  198. * wsgi: Made the error raised in case of chunk read failures more precise (this
  199. should be backwards compatible as the new exception class,
  200. wsgi.ChunkReadError, is a subclass of ValueError which was being used there
  201. before); Thanks to Samuel Merritt
  202. * greenio: Fixed socket.recv() sometimes returning str instead of bytes on
  203. Python 3; Thanks to Janusz Harkot
  204. * wsgi: Improved request body discarding
  205. * websocket: Fixed TypeError on empty websocket message (Python 3); Thanks to
  206. Fukuchi Daisuke
  207. * subprocess: Fixed universal_newlines support
  208. * wsgi: Output of 0-byte chunks is now suppressed; Thanks to Samuel Merritt
  209. * Improved the documentation; Thanks to Ramakrishnan G, ashutosh-mishra and
  210. Azhar Hussain
  211. * greenio: Changed GreenFileIO.write() (Python 3) to always write all data to
  212. match the behavior on Python 2; Thanks to Victor Stinner
  213. * subprocess: Fixed missing subprocess.mswindows attribute on Python 3.5;
  214. Thanks to Josh VanderLinden
  215. * ssl/monkey patching: Fixed a bug that would cause merely importing eventlet
  216. to monkey patch the ssl module; Thanks to David Szotten
  217. * documentation: Added support for building plain text documentation; thanks
  218. to Levente Polyak
  219. * greenio: Fixed handling blocking IO errors in various GreenSocket methods;
  220. Thanks to Victor Stinner
  221. * greenio: Fixed GreenPipe ignoring the bufsize parameter on Python 2; Thanks
  222. to Phus Lu
  223. * backdoor: Added Unix and IPv6 socket support; Thanks to Eric Urban
  224. Backwards incompatible:
  225. * monkey patching: The following select methods and selector classes are now
  226. removed, instead of being left in their respective modules after patching
  227. even though they are not green (this also fixes HTTPServer.serve_forever()
  228. blocking whole process on Python 3):
  229. * select.poll
  230. * select.epoll
  231. * select.devpoll
  232. * select.kqueue
  233. * select.kevent
  234. * selectors.PollSelector
  235. * selectors.EpollSelector
  236. * selectors.DevpollSelector
  237. * selectors.KqueueSelector
  238. Additionally selectors.DefaultSelector points to a green SelectSelector
  239. * greenio: Fixed send() to no longer behave like sendall() which makes it
  240. consistent with Python standard library and removes a source of very subtle
  241. errors
  242. 0.17.4
  243. ======
  244. * ssl: incorrect initalization of default context; Thanks to stuart-mclaren
  245. 0.17.3
  246. ======
  247. * green.thread: Python3.3+ fixes; Thanks to Victor Stinner
  248. * Semaphore.acquire() accepts timeout=-1; Thanks to Victor Stinner
  249. 0.17.2
  250. ======
  251. * wsgi: Provide python logging compatibility; Thanks to Sean Dague
  252. * greendns: fix premature connection closing in DNS proxy; Thanks to Tim Simmons
  253. * greenio: correct fd close; Thanks to Antonio Cuni and Victor Sergeyev
  254. * green.ssl: HTTPS client Python 2.7.9+ compatibility
  255. * setup: tests.{isolated,manual} polluted top-level packages
  256. 0.17.1
  257. ======
  258. * greendns: fix dns.name import and Python3 compatibility
  259. 0.17
  260. ====
  261. * Full Python3 compatibility; Thanks to Jakub Stasiak
  262. * greendns: IPv6 support, improved handling of /etc/hosts; Thanks to Floris Bruynooghe
  263. * tpool: make sure we return results during killall; Thanks to David Szotten
  264. * semaphore: Don't hog a semaphore if someone else is waiting for it; Thanks to Shaun Stanworth
  265. * green.socket: create_connection() was wrapping all exceptions in socket.error; Thanks to Donagh McCabe
  266. * Make sure SSL retries are done using the exact same data buffer; Thanks to Lior Neudorfer
  267. * greenio: shutdown already closed sockets without error; Thanks to David Szotten
  268. 0.16.1
  269. ======
  270. * Wheel build 0.16.0 incorrectly shipped removed module eventlet.util.
  271. 0.16.0
  272. ======
  273. * Fix SSL socket wrapping and Python 2.7.9 compatibility; Thanks to Jakub Stasiak
  274. * Fix monkey_patch() on Python 3; Thanks to Victor Stinner
  275. * Fix "maximum recursion depth exceeded in GreenSocket.__del__"; Thanks to Jakub Stasiak
  276. * db_pool: BaseConnectionPool.clear updates .current_size #139; Thanks to Andrey Gubarev
  277. * Fix __str__ method on the TimeoutExpired exception class.; Thanks to Tomaz Muraus
  278. * hubs: drop Twisted support
  279. * Removed deprecated modules: api, most of coros, pool, proc, processes and util
  280. * Improved Python 3 compatibility (including patch by raylu); Thanks to Jakub Stasiak
  281. * Allow more graceful shutdown of wsgi server; Thanks to Stuart McLaren
  282. * wsgi.input: Make send_hundred_continue_headers() a public API; Thanks to Tushar Gohad
  283. * tpool: Windows compatibility, fix ResourceWarning. Thanks to Victor Stinner
  284. * tests: Fix timers not cleaned up on MySQL test skips; Thanks to Corey Wright
  285. 0.15.2
  286. ======
  287. * greenio: fixed memory leak, introduced in 0.15.1; Thanks to Michael Kerrin, Tushar Gohad
  288. * wsgi: Support optional headers w/ "100 Continue" responses; Thanks to Tushar Gohad
  289. 0.15.1
  290. ======
  291. * greenio: Fix second simultaneous read (parallel paramiko issue); Thanks to Jan Grant, Michael Kerrin
  292. * db_pool: customizable connection cleanup function; Thanks to Avery Fay
  293. 0.15
  294. ====
  295. * Python3 compatibility -- **not ready yet**; Thanks to Astrum Kuo, Davanum Srinivas, Jakub Stasiak, Victor Sergeyev
  296. * coros: remove Actor which was deprecated in 2010-01
  297. * saranwrap: remove saranwrap which was deprecated in 2010-02
  298. * PyPy compatibility fixes; Thanks to Dmitriy Kruglyak, Jakub Stasiak
  299. * green.profile: accumulate results between runs; Thanks to Zhang Hua
  300. * greenthread: add .unlink() method; Thanks to Astrum Kuo
  301. * packaging: Generate universal wheels; Thanks to Jakub Stasiak
  302. * queue: Make join not wait if there are no unfinished tasks; Thanks to Jakub Stasiak
  303. * tpool: proxy __enter__, __exit__ fixes Bitbucket-158; Thanks to Eric Urban
  304. * websockets: Add websockets13 support; handle lack of Upgrade header; Thanks to Edward George
  305. * wsgi: capitalize_response_headers option
  306. 0.14
  307. ====
  308. * wsgi: handle connection socket timeouts; Thanks to Paul Oppenheim
  309. * wsgi: close timed out client connections
  310. * greenio: socket pypy compatibility; Thanks to Alex Gaynor
  311. * wsgi: env['wsgi.input'] was returning 1 byte strings; Thanks to Eric Urban
  312. * green.ssl: fix NameError; Github #17; Thanks to Jakub Stasiak
  313. * websocket: allow "websocket" in lowercase in Upgrade header; Compatibility with current Google Chrome; Thanks to Dmitry Orlov
  314. * wsgi: allow minimum_chunk_size to be overriden on a per request basis; Thanks to David Goetz
  315. * wsgi: configurable socket_timeout
  316. 0.13
  317. ====
  318. * hubs: kqueue support! Thanks to YAMAMOTO Takashi, Edward George
  319. * greenio: Fix AttributeError on MacOSX; Bitbucket #136; Thanks to Derk Tegeler
  320. * green: subprocess: Fix subprocess.communicate() block on Python 2.7; Thanks to Edward George
  321. * green: select: ensure that hub can .wait() at least once before timeout; Thanks to YAMAMOTO Takashi
  322. * tpool: single request queue to avoid deadlocks; Bitbucket pull request 31,32; Thanks to Edward George
  323. * zmq: pyzmq 13.x compatibility; Thanks to Edward George
  324. * green: subprocess: Popen.wait() accepts new `timeout` kwarg; Python 3.3 and RHEL 6.1 compatibility
  325. * hubs: EVENTLET_HUB can point to external modules; Thanks to Edward George
  326. * semaphore: support timeout for acquire(); Thanks to Justin Patrin
  327. * support: do not clear sys.exc_info if can be preserved (greenlet >= 0.3.2); Thanks to Edward George
  328. * Travis continous integration; Thanks to Thomas Grainger, Jakub Stasiak
  329. * wsgi: minimum_chunk_size of last Server altered all previous (global variable); Thanks to Jakub Stasiak
  330. * doc: hubs: Point to the correct function in exception message; Thanks to Floris Bruynooghe
  331. 0.12
  332. ====
  333. * zmq: Fix 100% busy CPU in idle after .bind(PUB) (thanks to Geoff Salmon)
  334. * greenio: Fix socket.settimeout() did not switch back to blocking mode (thanks to Peter Skirko)
  335. * greenio: socket.dup() made excess fcntl syscalls (thanks to Peter Portante)
  336. * setup: Remove legacy --without-greenlet option and unused httplib2 dependency (thanks to Thomas Grainger)
  337. * wsgi: environ[REMOTE_PORT], also available in log_format, log accept event (thanks to Peter Portante)
  338. * tests: Support libzmq 3.0 SNDHWM option (thanks to Geoff Salmon)
  339. 0.11
  340. ====
  341. * ssl: Fix 100% busy CPU in socket.sendall() (thanks to Raymon Lu)
  342. * zmq: Return linger argument to Socket.close() (thanks to Eric Windisch)
  343. * tests: SSL tests were always skipped due to bug in skip_if_no_ssl decorator
  344. 0.10
  345. ====
  346. * greenio: Fix relative seek() (thanks to AlanP)
  347. * db_pool: Fix pool.put() TypeError with min_size > 1 (thanks to Jessica Qi)
  348. * greenthread: Prevent infinite recursion with linking to current greenthread (thanks to Edward George)
  349. * zmq: getsockopt(EVENTS) wakes correct threads (thanks to Eric Windisch)
  350. * wsgi: Handle client disconnect while sending response (thanks to Clay Gerrard)
  351. * hubs: Ensure that new hub greenlet is parent of old one (thanks to Edward George)
  352. * os: Fix waitpid() returning (0, 0) (thanks to Vishvananda Ishaya)
  353. * tpool: Add set_num_threads() method to set the number of tpool threads (thanks to David Ibarra)
  354. * threading, zmq: Fix Python 2.5 support (thanks to Floris Bruynooghe)
  355. * tests: tox configuration for all supported Python versions (thanks to Floris Bruynooghe)
  356. * tests: Fix zmq._QueueLock test in Python2.6
  357. * tests: Fix patcher_test on Darwin (/bin/true issue) (thanks to Edward George)
  358. * tests: Skip SSL tests when not available (thanks to Floris Bruynooghe)
  359. * greenio: Remove deprecated GreenPipe.xreadlines() method, was broken anyway
  360. 0.9.17
  361. ======
  362. * ZeroMQ support calling send and recv from multiple greenthreads (thanks to Geoff Salmon)
  363. * SSL: unwrap() sends data, and so it needs trampolining (#104 thanks to Brandon Rhodes)
  364. * hubs.epolls: Fix imports for exception handler (#123 thanks to Johannes Erdfelt)
  365. * db_pool: Fix .clear() when min_size > 0
  366. * db_pool: Add MySQL's insert_id() method (thanks to Peter Scott)
  367. * db_pool: Close connections after timeout, fix get-after-close race condition with using TpooledConnectionPool (thanks to Peter Scott)
  368. * threading monkey patch fixes (#115 thanks to Johannes Erdfelt)
  369. * pools: Better accounting of current_size in pools.Pool (#91 thanks to Brett Hoerner)
  370. * wsgi: environ['RAW_PATH_INFO'] with request path as received from client (thanks to dweimer)
  371. * wsgi: log_output flag (thanks to Juan Manuel Garcia)
  372. * wsgi: Limit HTTP header size (thanks to Gregory Holt)
  373. * wsgi: Configurable maximum URL length (thanks to Tomas Sedovic)
  374. 0.9.16
  375. ======
  376. * SO_REUSEADDR now correctly set.
  377. 0.9.15
  378. ======
  379. * ZeroMQ support without an explicit hub now implemented! Thanks to Zed Shaw for the patch.
  380. * zmq module supports the NOBLOCK flag, thanks to rfk. (#76)
  381. * eventlet.wsgi has a debug flag which can be set to false to not send tracebacks to the client (per redbo's request)
  382. * Recursive GreenPipe madness forestalled by Soren Hansen (#77)
  383. * eventlet.green.ssl no longer busywaits on send()
  384. * EEXIST ignored in epoll hub (#80)
  385. * eventlet.listen's behavior on Windows improved, thanks to Nick Vatamaniuc (#83)
  386. * Timeouts raised within tpool.execute are propagated back to the caller (thanks again to redbo for being the squeaky wheel)
  387. 0.9.14
  388. ======
  389. * Many fixes to the ZeroMQ hub, which now requires version 2.0.10 or later. Thanks to Ben Ford.
  390. * ZeroMQ hub no longer depends on pollhub, and thus works on Windows (thanks, Alexey Borzenkov)
  391. * Better handling of connect errors on Windows, thanks again to Alexey Borzenkov.
  392. * More-robust Event delivery, thanks to Malcolm Cleaton
  393. * wsgi.py now distinguishes between an empty query string ("") and a non-existent query string (no entry in environ).
  394. * wsgi.py handles ipv6 correctly (thanks, redbo)
  395. * Better behavior in tpool when you give it nonsensical numbers, thanks to R. Tyler for the nonsense. :)
  396. * Fixed importing on 2.5 (#73, thanks to Ruijun Luo)
  397. * Hub doesn't hold on to invalid fds (#74, thanks to Edward George)
  398. * Documentation for eventlet.green.zmq, courtesy of Ben Ford
  399. 0.9.13
  400. ======
  401. * ZeroMQ hub, and eventlet.green.zmq make supersockets green. Thanks to Ben Ford!
  402. * eventlet.green.MySQLdb added. It's an interface to MySQLdb that uses tpool to make it appear nonblocking
  403. * Greenthread affinity in tpool. Each greenthread is assigned to the same thread when using tpool, making it easier to work with non-thread-safe libraries.
  404. * Eventlet now depends on greenlet 0.3 or later.
  405. * Fixed a hang when using tpool during an import causes another import. Thanks to mikepk for tracking that down.
  406. * Improved websocket draft 76 compliance, thanks to Nick V.
  407. * Rare greenthread.kill() bug fixed, which was probably brought about by a bugfix in greenlet 0.3.
  408. * Easy_installing eventlet should no longer print an ImportError about greenlet
  409. * Support for serving up SSL websockets, thanks to chwagssd for reporting #62
  410. * eventlet.wsgi properly sets 'wsgi.url_scheme' environment variable to 'https', and 'HTTPS' to 'on' if serving over ssl
  411. * Blocking detector uses setitimer on 2.6 or later, allowing for sub-second block detection, thanks to rtyler.
  412. * Blocking detector is documented now, too
  413. * socket.create_connection properly uses dnspython for nonblocking dns. Thanks to rtyler.
  414. * Removed EVENTLET_TPOOL_DNS, nobody liked that. But if you were using it, install dnspython instead. Thanks to pigmej and gholt.
  415. * Removed _main_wrapper from greenthread, thanks to Ambroff adding keyword arguments to switch() in 0.3!
  416. 0.9.12
  417. ======
  418. * Eventlet no longer uses the Twisted hub if Twisted is imported -- you must call eventlet.hubs.use_hub('twistedr') if you want to use it. This prevents strange race conditions for those who want to use both Twisted and Eventlet separately.
  419. * Removed circular import in twistedr.py
  420. * Added websocket multi-user chat example
  421. * Not using exec() in green modules anymore.
  422. * eventlet.green.socket now contains all attributes of the stdlib socket module, even those that were left out by bugs.
  423. * Eventlet.wsgi doesn't call print anymore, instead uses the logfiles for everything (it used to print exceptions in one place).
  424. * Eventlet.wsgi properly closes the connection when an error is raised
  425. * Better documentation on eventlet.event.Event.send_exception
  426. * Adding websocket.html to tarball so that you can run the examples without checking out the source
  427. 0.9.10
  428. ======
  429. * Greendns: if dnspython is installed, Eventlet will automatically use it to provide non-blocking DNS queries. Set the environment variable 'EVENTLET_NO_GREENDNS' if you don't want greendns but have dnspython installed.
  430. * Full test suite passes on Python 2.7.
  431. * Tests no longer depend on simplejson for >2.6.
  432. * Potential-bug fixes in patcher (thanks to Schmir, and thanks to Hudson)
  433. * Websockets work with query strings (thanks to mcarter)
  434. * WSGI posthooks that get called after the request completed (thanks to gholt, nice docs, too)
  435. * Blocking detector merged -- use it to detect places where your code is not yielding to the hub for > 1 second.
  436. * tpool.Proxy can wrap callables
  437. * Tweaked Timeout class to do something sensible when True is passed to the constructor
  438. 0.9.9
  439. =====
  440. * A fix for monkeypatching on systems with psycopg version 2.0.14.
  441. * Improved support for chunked transfers in wsgi, plus a bunch of tests from schmir (ported from gevent by redbo)
  442. * A fix for the twisted hub from Favo Yang
  443. 0.9.8
  444. =====
  445. * Support for psycopg2's asynchronous mode, from Daniele Varrazzo
  446. * websocket module is now part of core Eventlet with 100% unit test coverage thanks to Ben Ford. See its documentation at http://eventlet.net/doc/modules/websocket.html
  447. * Added wrap_ssl convenience method, meaning that we truly no longer need api or util modules.
  448. * Multiple-reader detection code protects against the common mistake of having multiple greenthreads read from the same socket at the same time, which can be overridden if you know what you're doing.
  449. * Cleaner monkey_patch API: the "all" keyword is no longer necessary.
  450. * Pool objects have a more convenient constructor -- no more need to subclass
  451. * amajorek's reimplementation of GreenPipe
  452. * Many bug fixes, major and minor.
  453. 0.9.7
  454. =====
  455. * GreenPipe is now a context manager (thanks, quad)
  456. * tpool.Proxy supports iterators properly
  457. * bug fixes in eventlet.green.os (thanks, Benoit)
  458. * much code cleanup from Tavis
  459. * a few more example apps
  460. * multitudinous improvements in Py3k compatibility from amajorek
  461. 0.9.6
  462. =====
  463. * new EVENTLET_HUB environment variable allows you to select a hub without code
  464. * improved GreenSocket and GreenPipe compatibility with stdlib
  465. * bugfixes on GreenSocket and GreenPipe objects
  466. * code coverage increased across the board
  467. * Queue resizing
  468. * internal DeprecationWarnings largely eliminated
  469. * tpool is now reentrant (i.e., can call tpool.execute(tpool.execute(foo)))
  470. * more reliable access to unpatched modules reduces some race conditions when monkeypatching
  471. * completely threading-compatible corolocal implementation, plus tests and enthusiastic adoption
  472. * tests stomp on each others' toes less
  473. * performance improvements in timers, hubs, greenpool
  474. * Greenlet-aware profile module courtesy of CCP
  475. * support for select26 module's epoll
  476. * better PEP-8 compliance and import cleanup
  477. * new eventlet.serve convenience function for easy TCP servers
  478. 0.9.5
  479. =====
  480. * support psycopg in db_pool
  481. * smart patcher that does the right patching when importing without needing to understand plumbing of patched module
  482. * patcher.monkey_patch() method replacing util.wrap_*
  483. * monkeypatch threading support
  484. * removed api.named
  485. * imported timeout module from gevent, replace exc_after and with_timeout()
  486. * replace call_after with spawn_after; this is so that users don't see the Timer class
  487. * added cancel() method to GreenThread to support the semantic of "abort if not already in the middle of something"
  488. * eventlet.green.os with patched read() and write(), etc
  489. * moved stuff from wrap_pipes_with_coroutine_pipe into green.os
  490. * eventlet.green.subprocess instead of eventlet.processes
  491. * improve patching docs, explaining more about patcher and why you'd use eventlet.green
  492. * better documentation on greenpiles
  493. * deprecate api.py completely
  494. * deprecate util.py completely
  495. * deprecate saranwrap
  496. * performance improvements in the hubs
  497. * much better documentation overall
  498. * new convenience functions: eventlet.connect and eventlet.listen. Thanks, Sergey!
  499. 0.9.4
  500. =====
  501. * Deprecated coros.Queue and coros.Channel (use queue.Queue instead)
  502. * Added putting and getting methods to queue.Queue.
  503. * Added eventlet.green.Queue which is a greened clone of stdlib Queue, along with stdlib tests.
  504. * Changed __init__.py so that the version number is readable even if greenlet's not installed.
  505. * Bugfixes in wsgi, greenpool
  506. 0.9.3
  507. =====
  508. * Moved primary api module to __init__ from api. It shouldn't be necessary to import eventlet.api anymore; import eventlet should do the same job.
  509. * Proc module deprecated in favor of greenthread
  510. * New module greenthread, with new class GreenThread.
  511. * New GreenPool class that replaces pool.Pool.
  512. * Deprecated proc module (use greenthread module instead)
  513. * tpooled gethostbyname is configurable via environment variable EVENTLET_TPOOL_GETHOSTBYNAME
  514. * Removed greenio.Green_fileobject and refactored the code therein to be more efficient. Only call makefile() on sockets now; makeGreenFile() is deprecated. The main loss here is that of the readuntil method. Also, Green_fileobjects used to be auto-flushing; flush() must be called explicitly now.
  515. * Added epoll support
  516. * Improved documentation across the board.
  517. * New queue module, API-compatible with stdlib Queue
  518. * New debug module, used for enabling verbosity within Eventlet that can help debug applications or Eventlet itself.
  519. * Bugfixes in tpool, green.select, patcher
  520. * Deprecated coros.execute (use eventlet.spawn instead)
  521. * Deprecated coros.semaphore (use semaphore.Semaphore or semaphore.BoundedSemaphore instead)
  522. * Moved coros.BoundedSemaphore to semaphore.BoundedSemaphore
  523. * Moved coros.Semaphore to semaphore.Semaphore
  524. * Moved coros.event to event.Event
  525. * Deprecated api.tcp_listener, api.connect_tcp, api.ssl_listener
  526. * Moved get_hub, use_hub, get_default_hub from eventlet.api to eventlet.hubs
  527. * Renamed libevent hub to pyevent.
  528. * Removed previously-deprecated features tcp_server, GreenSSL, erpc, and trap_errors.
  529. * Removed saranwrap as an option for making db connections nonblocking in db_pool.
  530. 0.9.2
  531. =====
  532. * Bugfix for wsgi.py where it was improperly expecting the environ variable to be a constant when passed to the application.
  533. * Tpool.py now passes its tests on Windows.
  534. * Fixed minor performance issue in wsgi.
  535. 0.9.1
  536. =====
  537. * PyOpenSSL is no longer required for Python 2.6: use the eventlet.green.ssl module. 2.5 and 2.4 still require PyOpenSSL.
  538. * Cleaned up the eventlet.green packages and their associated tests, this should result in fewer version-dependent bugs with these modules.
  539. * PyOpenSSL is now fully wrapped in eventlet.green.OpenSSL; using it is therefore more consistent with using other green modules.
  540. * Documentation on using SSL added.
  541. * New green modules: ayncore, asynchat, SimpleHTTPServer, CGIHTTPServer, ftplib.
  542. * Fuller thread/threading compatibility: patching threadlocal with corolocal so coroutines behave even more like threads.
  543. * Improved Windows compatibility for tpool.py
  544. * With-statement compatibility for pools.Pool objects.
  545. * Refactored copyrights in the files, added LICENSE and AUTHORS files.
  546. * Added support for logging x-forwarded-for header in wsgi.
  547. * api.tcp_server is now deprecated, will be removed in a future release.
  548. * Added instructions on how to generate coverage reports to the documentation.
  549. * Renamed GreenFile to Green_fileobject, to better reflect its purpose.
  550. * Deprecated erpc method in tpool.py
  551. * Bug fixes in: wsgi.py, twistedr.py, poll.py, greenio.py, util.py, select.py, processes.py, selects.py
  552. 0.9.0
  553. =====
  554. * Full-duplex sockets (simultaneous readers and writers in the same process).
  555. * Remove modules that distract from the core mission of making it straightforward to write event-driven networking apps:
  556. httpd, httpc, channel, greenlib, httpdate, jsonhttp, logutil
  557. * Removed test dependency on sqlite, using nose instead.
  558. * Marked known-broken tests using nose's mechanism (most of these are not broken but are simply run in the incorrect context, such as threading-related tests that are incompatible with the libevent hub).
  559. * Remove copied code from python standard libs (in tests).
  560. * Added eventlet.patcher which can be used to import "greened" modules.
  561. 0.8.16
  562. ======
  563. * GreenSSLObject properly masks ZeroReturnErrors with an empty read; with unit test.
  564. * Fixed 2.6 SSL compatibility issue.
  565. 0.8.15
  566. ======
  567. * GreenSSL object no longer converts ZeroReturnErrors into empty reads, because that is more compatible with the underlying SSLConnection object.
  568. * Fixed issue caused by SIGCHLD handler in processes.py
  569. * Stopped supporting string exceptions in saranwrap and fixed a few test failures.
  570. 0.8.14
  571. ======
  572. * Fixed some more Windows compatibility problems, resolving EVT-37 :
  573. http://jira.secondlife.com/browse/EVT-37
  574. * waiting() method on Pool class, which was lost when the Pool implementation
  575. replaced CoroutinePool.
  576. 0.8.13
  577. ======
  578. * 2.6 SSL compatibility patch by Marcus Cavanaugh.
  579. * Added greenlet and pyopenssl as dependencies in setup.py.
  580. 0.8.12
  581. ======
  582. * The ability to resize() pools of coroutines, which was lost when the
  583. Pool implementation replaced CoroutinePool.
  584. * Fixed Cesar's issue with SSL connections, and furthermore did a
  585. complete overhaul of SSL handling in eventlet so that it's much closer
  586. to the behavior of the built-in libraries. In particular, users of
  587. GreenSSL sockets must now call shutdown() before close(), exactly
  588. like SSL.Connection objects.
  589. * A small patch that makes Eventlet work on Windows. This is the first
  590. release of Eventlet that works on Windows.
  591. 0.8.11
  592. ======
  593. Eventlet can now run on top of twisted reactor. Twisted-based hub is enabled automatically if
  594. twisted.internet.reactor is imported. It is also possible to "embed" eventlet into a twisted
  595. application via eventlet.twistedutil.join_reactor. See the examples for details.
  596. A new package, eventlet.twistedutil, is added that makes integration of twisted and eventlet
  597. easier. It has block_on function that allows to wait for a Deferred to fire and it wraps
  598. twisted's Protocol in a synchronous interface. This is similar to and is inspired by Christopher
  599. Armstrong's corotwine library. Thanks to Dan Pascu for reviewing the package.
  600. Another new package, eventlet.green, was added to provide some of the standard modules
  601. that are fixed not to block other greenlets. This is an alternative to monkey-patching
  602. the socket, which is impossible to do if you are running twisted reactor.
  603. The package includes socket, httplib, urllib2.
  604. Much of the core functionality has been refactored and cleaned up, including the removal
  605. of eventlet.greenlib. This means that it is now possible to use plain greenlets without
  606. modification in eventlet, and the subclasses of greenlet instead of the old
  607. eventlet.greenlib.GreenletContext. Calling eventlet.api.get_hub().switch() now checks to
  608. see whether the current greenlet has a "switch_out" method and calls it if so, providing the
  609. same functionality that the GreenletContext.swap_out used to. The swap_in behavior can be
  610. duplicated by overriding the switch method, and the finalize functionality can be duplicated
  611. by having a try: finally: block around the greenlet's main implementation. The eventlet.backdoor
  612. module has been ported to this new scheme, although it's signature had to change slightly so
  613. existing code that used the backdoor will have to be modified.
  614. A number of bugs related to improper scheduling of switch calls has been fixed.
  615. The fixed functions and classes include api.trampoline, api.sleep, coros.event,
  616. coros.semaphore, coros.queue.
  617. Many methods of greenio.GreenSocket were fixed to make its behavior more like that of a regular
  618. socket. Thanks to Marcin Bachry for fixing GreenSocket.dup to preserve the timeout.
  619. Added proc module which provides an easy way to subscribe to coroutine's results. This makes
  620. it easy to wait for a single greenlet or for a set of greenlets to complete.
  621. wsgi.py now supports chunked transfer requests (patch by Mike Barton)
  622. The following modules were deprecated or removed because they were broken:
  623. hubs.nginx, hubs.libev, support.pycurls, support.twisteds, cancel method of coros.event class
  624. The following classes are still present but will be removed in the future version:
  625. - channel.channel (use coros.Channel)
  626. - coros.CoroutinePool (use pool.Pool)
  627. saranwrap.py now correctly closes the child process when the referring object is deleted,
  628. received some fixes to its detection of child process death, now correctly deals with the in
  629. keyword, and it is now possible to use coroutines in a non-blocking fashion in the child process.
  630. Time-based expiry added to db_pool. This adds the ability to expire connections both by idleness
  631. and also by total time open. There is also a connection timeout option.
  632. A small bug in httpd's error method was fixed.
  633. Python 2.3 is no longer supported.
  634. A number of tests was added along with a script to run all of them for all the configurations.
  635. The script generates an html page with the results.
  636. Thanks to Brian Brunswick for investigation of popen4 badness (eventlet.process)
  637. Thanks to Marcus Cavanaugh for pointing out some coros.queue(0) bugs.
  638. The twisted integration as well as many other improvements were funded by AG Projects (http://ag-projects.com), thanks!
  639. 0.8.x
  640. =====
  641. Fix a CPU leak that would cause the poll hub to consume 100% CPU in certain conditions, for example the echoserver example. (Donovan Preston)
  642. Fix the libev hub to match libev's callback signature. (Patch by grugq)
  643. Add a backlog argument to api.tcp_listener (Patch by grugq)
  644. 0.7.x
  645. =====
  646. Fix a major memory leak when using the libevent or libev hubs. Timers were not being removed from the hub after they fired. (Thanks Agusto Becciu and the grugq). Also, make it possible to call wrap_socket_with_coroutine_socket without using the threadpool to make dns operations non-blocking (Thanks the grugq).
  647. It's now possible to use eventlet's SSL client to talk to eventlet's SSL server. (Thanks to Ryan Williams)
  648. Fixed a major CPU leak when using select hub. When adding a descriptor to the hub, entries were made in all three dictionaries, readers, writers, and exc, even if the callback is None. Thus every fd would be passed into all three lists when calling select regardless of whether there was a callback for that event or not. When reading the next request out of a keepalive socket, the socket would come back as ready for writing, the hub would notice the callback is None and ignore it, and then loop as fast as possible consuming CPU.
  649. 0.6.x
  650. =====
  651. Fixes some long-standing bugs where sometimes failures in accept() or connect() would cause the coroutine that was waiting to be double-resumed, most often resulting in SwitchingToDeadGreenlet exceptions as well as weird tuple-unpacking exceptions in the CoroutinePool main loop.
  652. 0.6.1: Added eventlet.tpool.killall. Blocks until all of the threadpool threads have been told to exit and join()ed. Meant to be used to clean up the threadpool on exit or if calling execv. Used by Spawning.
  653. 0.5.x
  654. =====
  655. "The Pycon 2008 Refactor": The first release which incorporates libevent support. Also comes with significant refactoring and code cleanup, especially to the eventlet.wsgi http server. Docstring coverage is much higher and there is new extensive documentation: http://wiki.secondlife.com/wiki/Eventlet/Documentation
  656. The point releases of 0.5.x fixed some bugs in the wsgi server, most notably handling of Transfer-Encoding: chunked; previously, it would happily send chunked encoding to clients which asked for HTTP/1.0, which isn't legal.
  657. 0.2
  658. =====
  659. Initial re-release of forked linden branch.