summaryrefslogtreecommitdiff
path: root/doc/changelog.html
blob: 293c8fc4ecaa8151d02b6e984232945383260ce1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />

    <title>0.32.0 &#8212; Eventlet 0.32.0 documentation</title>
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
    <link rel="stylesheet" type="text/css" href="_static/classic.css" />
    
    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
    <script src="_static/jquery.js"></script>
    <script src="_static/underscore.js"></script>
    <script src="_static/doctools.js"></script>
    
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" /> 
  </head><body>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             accesskey="I">index</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">0.32.0</a></li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <section id="id1">
<h1>0.32.0<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: compatibility with dnspython v2 <a class="reference external" href="https://github.com/eventlet/eventlet/pull/722">https://github.com/eventlet/eventlet/pull/722</a></p></li>
<li><p>green.ssl: wrap_socket now accepts argument <cite>ciphers</cite> <a class="reference external" href="https://github.com/eventlet/eventlet/pull/718">https://github.com/eventlet/eventlet/pull/718</a></p></li>
<li><p>websocket: control frames are now always uncompressed per RFC 7692; Thanks to Onno Kortmann</p></li>
</ul>
</section>
<section id="id2">
<h1>0.31.1<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: py3.6 using client certificates raised ValueError: check_hostname needs server_hostname argument <a class="reference external" href="https://github.com/eventlet/eventlet/pull/705">https://github.com/eventlet/eventlet/pull/705</a></p></li>
</ul>
</section>
<section id="id3">
<h1>0.31.0<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: websocket: Limit maximum uncompressed frame length to 8MiB <a class="reference external" href="https://github.com/eventlet/eventlet/security/advisories/GHSA-9p9m-jm8w-94p2">https://github.com/eventlet/eventlet/security/advisories/GHSA-9p9m-jm8w-94p2</a></p></li>
</ul>
</section>
<section id="id4">
<h1>0.30.3<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: websocket ALREADY_HANDLED flag on corolocal</p></li>
<li><p>green.ssl: Set suppress_ragged_eofs default based on SSLSocket defaults</p></li>
<li><p>greenio: socket.connect_ex returned None instead of 0 on success</p></li>
<li><p>Use _imp instead of deprecated imp</p></li>
</ul>
</section>
<section id="id5">
<h1>0.30.2<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: patch ssl to fix RecursionError on SSLContext.options.__set__ <a class="reference external" href="https://github.com/eventlet/eventlet/issues/677">https://github.com/eventlet/eventlet/issues/677</a></p></li>
</ul>
</section>
<section id="id6">
<h1>0.30.1<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>patcher: built-in open() did not accept kwargs <a class="reference external" href="https://github.com/eventlet/eventlet/issues/683">https://github.com/eventlet/eventlet/issues/683</a></p></li>
</ul>
</section>
<section id="id7">
<h1>0.30.0<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>pyopenssl tsafe module was deprecated and removed in v20.0.0</p></li>
<li><p>deprecate pyevent hub</p></li>
<li><p>Deprecate CPython 2.7 and 3.4 support</p></li>
<li><p>py39: Add _at_fork_reinit method to Semaphores</p></li>
</ul>
</section>
<section id="id8">
<h1>0.29.1<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h1>
<p>patcher: [py27] recursion error in pytest/python2.7 installing register_at_fork <a class="reference external" href="https://github.com/eventlet/eventlet/issues/660">https://github.com/eventlet/eventlet/issues/660</a>
patcher: monkey_patch(builtins=True) failed on py3 because <cite>file</cite> class is gone <a class="reference external" href="https://github.com/eventlet/eventlet/issues/541">https://github.com/eventlet/eventlet/issues/541</a>
don’t crash on PyPy 7.0.0 <a class="reference external" href="https://github.com/eventlet/eventlet/pull/547">https://github.com/eventlet/eventlet/pull/547</a>
Only install monotonic on python2 <a class="reference external" href="https://github.com/eventlet/eventlet/pull/583">https://github.com/eventlet/eventlet/pull/583</a></p>
</section>
<section id="id9">
<h1>0.29.0<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: context wrapped listener fails accept() <a class="reference external" href="https://github.com/eventlet/eventlet/issues/651">https://github.com/eventlet/eventlet/issues/651</a></p></li>
</ul>
</section>
<section id="id10">
<h1>0.28.1<a class="headerlink" href="#id10" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Sorry, Eventlet was broken on Windows for versions 0.27-0.28
patcher: no os.register_at_fork on Windows (#654)</p></li>
<li><p>Clean up TypeError in __del__</p></li>
</ul>
</section>
<section id="id11">
<h1>0.28.0<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Always remove the right listener from the hub <a class="reference external" href="https://github.com/eventlet/eventlet/pull/645">https://github.com/eventlet/eventlet/pull/645</a></p></li>
</ul>
</section>
<section id="id12">
<h1>0.27.0<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>patcher: Clean up threading book-keeping at fork when monkey-patched</p></li>
<li><p>backdoor: handle disconnects better</p></li>
</ul>
</section>
<section id="id13">
<h1>0.26.1<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>pin dnspython &lt;2.0.0 <a class="reference external" href="https://github.com/eventlet/eventlet/issues/619">https://github.com/eventlet/eventlet/issues/619</a></p></li>
</ul>
</section>
<section id="id14">
<h1>0.26.0<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fix compatibility with SSLContext usage &gt;= Python 3.7</p></li>
<li><p>wsgi: Fix header capitalization on py3</p></li>
<li><p>Fix #508: Py37 Deadlock ThreadPoolExecutor (#598)</p></li>
<li><p>drop Python 3.4 support</p></li>
<li><p>Fix misc SyntaxWarning’s under Python 3.8</p></li>
<li><p>Remove unnecessary assignment in _recv_loop (#601)</p></li>
</ul>
</section>
<section id="id15">
<h1>0.25.2<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>green.ssl: redundant set_nonblocking() caused SSLWantReadError</p></li>
</ul>
</section>
<section id="id16">
<h1>0.25.1<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi (tests): Stop using deprecated cgi.parse_qs() to support Python 3.8; Thanks to Miro Hrončok</p></li>
<li><p>os: Add workaround to <cite>open</cite> for pathlib on py 3.7; Thanks to David Szotten</p></li>
</ul>
</section>
<section id="id17">
<h1>0.25.0<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Only send 100 Continue response if no response has been sent yet; Thanks to Tim Burke</p></li>
<li><p>wsgi: Return 400 on negative Content-Length request headers; Thanks to Tim Burke</p></li>
<li><p>Make a GreenPile with no spawn()s an empty sequence; Thanks to nat-goodspeed</p></li>
<li><p>wsgi: fix Input.readlines when dealing with chunked input; Thanks to Tim Burke</p></li>
<li><p>wsgi: fix Input.readline on Python 3; Thanks to Tim Burke</p></li>
<li><p>wsgi: Stop replacing invalid UTF-8 on py3; Thanks to Tim Burke</p></li>
<li><p>ssl: Fix compatibility with Python 3.7 ssl.SSLSocket; Thanks to Junyi</p></li>
<li><p>reimport submodule as well in patcher.inject; Thanks to Junyi</p></li>
<li><p>use Python 2 compatible syntax for keyword-only args; Thanks to nat-goodspeed</p></li>
<li><p>wsgi: Catch and swallow IOErrors during discard(); Thanks to Tim Burke</p></li>
<li><p>Fix for Python 3.7; Thanks to Marcel Plch</p></li>
<li><p>Fix race that could cause using epolls as default hub even when platform does not support it; Thanks to Sergey Shepelev</p></li>
<li><p>wsgi: make Expect 100-continue field-value case-insensitive; Thanks to Julien Kasarherou</p></li>
<li><p>greenthread: optimize _exit_funcs getattr/del dance; Thanks to Alex Kashirin</p></li>
<li><p>New benchmarks runner; Thanks to Sergey Shepelev</p></li>
<li><p>ssl: fix connect to use monotonic clock for timeout; Thanks to Sergey Shepelev</p></li>
</ul>
</section>
<section id="id18">
<h1>0.24.1<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: don’t contact nameservers if one entry is returned from hosts file; Thanks to Daniel Alvarez</p></li>
</ul>
</section>
<section id="id19">
<h1>0.24.0<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: Fix infinite loop when UDP source address mismatch; Thanks to Lon Hohberger</p></li>
<li><p>greendns: Fix bad ipv6 comparison; Thanks to Lon Hohberger</p></li>
<li><p>wsgi: Use byte strings on py2 and unicode strings on py3; Thanks to Tim Burke</p></li>
<li><p>pools: put to empty pool would block sometimes; Thanks to Sam Merritt</p></li>
<li><p>greendns: resolving over TCP produced ValueError; Thanks to Jaume Marhuenda</p></li>
<li><p>support.greendns: ImportError when dns.rdtypes was imported before eventlet; Thanks to Jaume Marhuenda</p></li>
<li><p>greendns: full comment lines were not skipped; Thanks to nat-goodspeed</p></li>
<li><p>Drop support for Python3.3; Python2.6 and python-epoll package</p></li>
<li><p>external dependencies for six, monotonic, dnspython; Thanks to nat-goodspeed</p></li>
<li><p>wsgi: Don’t strip all Unicode whitespace from headers on py3; Thanks to Tim Burke</p></li>
</ul>
</section>
<section id="id20">
<h1>0.23.0<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>green.threading: current_thread() did not see new monkey-patched threads; Thanks to Jake Tesler</p></li>
<li><p>tpool: exception in tpool-ed call leaked memory via backtrace</p></li>
<li><p>wsgi: latin-1 encoding dance for environ[PATH_INFO]</p></li>
</ul>
</section>
<section id="id21">
<h1>0.22.1<a class="headerlink" href="#id21" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fixed issue installing excess enum34 on Python3.4+ (rebuild with updated setuptools)</p></li>
<li><p>event: Event.wait() timeout=None argument to be compatible with upstream CPython</p></li>
<li><p>greendns: Treat /etc/hosts entries case-insensitive; Thanks to Ralf Haferkamp</p></li>
</ul>
</section>
<section id="id22">
<h1>0.22.0<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>convenience: (SO_REUSEPORT) socket.error is not OSError on Python 2; Thanks to <a class="reference external" href="mailto:JacoFourie&#37;&#52;&#48;github">JacoFourie<span>&#64;</span>github</a></p></li>
<li><p>convenience: SO_REUSEPORT is not available on WSL platform (Linux on Windows)</p></li>
<li><p>convenience: skip SO_REUSEPORT for bind on random port (0)</p></li>
<li><p>dns: reading /etc/hosts raised DeprecationWarning for universal lines on Python 3.4+; Thanks to Chris Kerr</p></li>
<li><p>green.openssl: Drop OpenSSL.rand support; Thanks to Haikel Guemar</p></li>
<li><p>green.subprocess: keep CalledProcessError identity; Thanks to <a class="reference external" href="mailto:Linbing&#37;&#52;&#48;github">Linbing<span>&#64;</span>github</a></p></li>
<li><p>greendns: be explicit about expecting bytes from sock.recv; Thanks to Matt Bennett</p></li>
<li><p>greendns: early socket.timeout was breaking IO retry loops</p></li>
<li><p>GreenSocket.accept does not notify_open; Thanks to orishoshan</p></li>
<li><p>patcher: set locked RLocks’ owner only when patching existing locks; Thanks to Quan Tian</p></li>
<li><p>patcher: workaround for monotonic “no suitable implementation”; Thanks to Geoffrey Thomas</p></li>
<li><p>queue: empty except was catching too much</p></li>
<li><p>socket: context manager support; Thanks to Miguel Grinberg</p></li>
<li><p>support: update monotonic 1.3 (5c0322dc559bf)</p></li>
<li><p>support: upgrade bundled dnspython to 1.16.0 (22e9de1d7957e) <a class="reference external" href="https://github.com/eventlet/eventlet/issues/427">https://github.com/eventlet/eventlet/issues/427</a></p></li>
<li><p>websocket: fd leak when client did not close connection properly; Thanks to Konstantin Enchant</p></li>
<li><p>websocket: support permessage-deflate extension; Thanks to Costas Christofi and Peter Kovary</p></li>
<li><p>wsgi: close idle connections (also applies to websockets)</p></li>
<li><p>wsgi: deprecated options are one step closer to removal</p></li>
<li><p>wsgi: handle remote connection resets; Thanks to Stefan Nica</p></li>
</ul>
</section>
<section id="id23">
<h1>0.21.0<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>New timeout error API: .is_timeout=True on exception object
It’s now easy to test if network error is transient and retry is appropriate.
Please spread the word and invite other libraries to support this interface.</p></li>
<li><p>hubs: use monotonic clock by default (bundled package); Thanks to Roman Podoliaka and Victor Stinner</p></li>
<li><p>dns: EVENTLET_NO_GREENDNS option is back, green is still default</p></li>
<li><p>dns: hosts file was consulted after nameservers</p></li>
<li><p>ssl: RecursionError on Python3.6+; Thanks to <a class="reference external" href="mailto:justdoit0823&#37;&#52;&#48;github">justdoit0823<span>&#64;</span>github</a> and Gevent developers</p></li>
<li><p>wsgi: log_output=False was not disabling startup and accepted messages</p></li>
<li><p>greenio: Fixed OSError: [WinError 10038] Socket operation on nonsocket</p></li>
<li><p>dns: EAI_NODATA was removed from RFC3493 and FreeBSD</p></li>
<li><p>green.select: fix mark_as_closed() wrong number of args</p></li>
<li><p>green.zmq: socket.{recv,send}_* signatures did not match recent upstream pyzmq</p></li>
<li><p>New feature: Add zipkin tracing to eventlet</p></li>
<li><p>db_pool: proxy Connection.set_isolation_level()</p></li>
<li><p>green.zmq: support RCVTIMEO (receive timeout)</p></li>
<li><p>green.profile: Python3 compatibility; Thanks to Artur Stawiarski</p></li>
<li><p>support: upgrade bundled six to 1.10 (dbfbfc818e3d)</p></li>
<li><p>python3.6: http.client.request support chunked_encoding</p></li>
</ul>
</section>
<section id="id24">
<h1>0.20.1<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>dns: try unqualified queries as top level</p></li>
<li><p>test_import_patched_defaults bended to play with pyopenssl&gt;=16.1.0</p></li>
<li><p>Explicit environ flag for importing eventlet.__version__ without ignoring import errors</p></li>
<li><p>Type check Semaphore, GreenPool arguments; Thanks to Matthew D. Pagel</p></li>
</ul>
</section>
<section id="id25">
<h1>0.20.0<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: removed select.poll() function</p></li>
<li><p>DNS resolving is always green with dnspython bundled in</p></li>
<li><p>greenio: only trampoline when we block</p></li>
<li><p>convenience: listen() sets SO_REUSEPORT when available; Thanks to Zhengwei Gao</p></li>
<li><p>ssl: Fix “TypeError: read() argument 2 must be read-write bytes-like object, not None”</p></li>
<li><p>greenio: _recv_loop behaviour with recv_into on closed sock</p></li>
<li><p>ipv6: getaddrinfo would fail with scope index</p></li>
<li><p>green.zmq: Support {send,recv}_{string,json,pyobj} wrappers</p></li>
<li><p>greendns: Return answers from /etc/hosts despite nameserver errors</p></li>
<li><p>patcher: fixed green existing locks fail (Python3)</p></li>
<li><p>Add DAGPool, a dependency-driven greenthread pool</p></li>
<li><p>wsgi: Unix socket address representation; Thanks to Samuel Merritt</p></li>
<li><p>tpool: isolate internal socket from default timeout; Thanks to Alex Villacís Lasso</p></li>
<li><p>wsgi: only skip Content-Type and Content-Length headers (GH-327)</p></li>
<li><p>wsgi: 400 on blank Content-Length headers (GH-334)</p></li>
<li><p>greenio: makefile related pypy socket ref counting</p></li>
<li><p>ssl: Fix recv_into blocking when reading chunks of data</p></li>
<li><p>websocket: support Gunicorn environ[‘gunicorn.socket’]</p></li>
</ul>
</section>
<section id="id26">
<h1>0.19.0<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: IMPORTANT DoS FIX do_handshake_connect=False in server accept(); Thanks to Garth Mollett</p></li>
<li><p>patcher: patch existing threading locks; Thanks to Alexis Lee</p></li>
<li><p>green.urllib2: missing patched ssl module; Thanks to Collin RM Stocks</p></li>
<li><p>wsgi: environ[headers_raw] tuple of unmodified name: value pairs</p></li>
<li><p>test against modern pyopenssl 16.0.0 for Python 2.7+; Thanks to Victor Stinner</p></li>
<li><p>wsgi: document compatibility with python <cite>logging</cite></p></li>
<li><p>Minor grammatical improvements and typo fixes to the docs; Thanks to Steven Erenst</p></li>
</ul>
</section>
<section id="id27">
<h1>0.18.4<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: change TCP_NODELAY to TCP_QUICKACK, ignore socket error when not available</p></li>
</ul>
</section>
<section id="id28">
<h1>0.18.3<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Use buffered writes - fixes partial socket.send without custom
writelines(); Github issue #295</p></li>
<li><p>wsgi: TCP_NODELAY enabled by default</p></li>
</ul>
</section>
<section id="id29">
<h1>0.18.2<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Fix data loss on partial writes (socket.send); Thanks to Jakub Stasiak</p></li>
</ul>
</section>
<section id="id30">
<h1>0.18.1<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1</p></li>
<li><p>patcher: Fix AttributeError in subprocess communicate()</p></li>
<li><p>greenio: Fix “TypeError: an integer is required” in sendto()</p></li>
</ul>
</section>
<section id="id31">
<h1>0.18.0<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>IMPORTANT: do not use Eventlet 0.18.0 and 0.18.1</p></li>
<li><p>greenio: Fixed a bug that could cause send() to start an endless loop on
ENOTCONN; Thanks to Seyeong Kim</p></li>
<li><p>wsgi: Fixed UNIX socket address being trimmed in “wsgi starting” log; Thanks
to Ihar Hrachyshka</p></li>
<li><p>ssl: Ported eventlet.green.OpenSSL to Python 3; Thanks to Victor Stinner</p></li>
<li><p>greenio: Made read() support buflen=-1 and added readall() (Python 3);
Thanks to David Szotten</p></li>
<li><p>wsgi: Made the error raised in case of chunk read failures more precise (this
should be backwards compatible as the new exception class,
wsgi.ChunkReadError, is a subclass of ValueError which was being used there
before); Thanks to Samuel Merritt</p></li>
<li><p>greenio: Fixed socket.recv() sometimes returning str instead of bytes on
Python 3; Thanks to Janusz Harkot</p></li>
<li><p>wsgi: Improved request body discarding</p></li>
<li><p>websocket: Fixed TypeError on empty websocket message (Python 3); Thanks to
Fukuchi Daisuke</p></li>
<li><p>subprocess: Fixed universal_newlines support</p></li>
<li><p>wsgi: Output of 0-byte chunks is now suppressed; Thanks to Samuel Merritt</p></li>
<li><p>Improved the documentation; Thanks to Ramakrishnan G, ashutosh-mishra and
Azhar Hussain</p></li>
<li><p>greenio: Changed GreenFileIO.write() (Python 3) to always write all data to
match the behavior on Python 2; Thanks to Victor Stinner</p></li>
<li><p>subprocess: Fixed missing subprocess.mswindows attribute on Python 3.5;
Thanks to Josh VanderLinden</p></li>
<li><p>ssl/monkey patching: Fixed a bug that would cause merely importing eventlet
to monkey patch the ssl module; Thanks to David Szotten</p></li>
<li><p>documentation: Added support for building plain text documentation; thanks
to Levente Polyak</p></li>
<li><p>greenio: Fixed handling blocking IO errors in various GreenSocket methods;
Thanks to Victor Stinner</p></li>
<li><p>greenio: Fixed GreenPipe ignoring the bufsize parameter on Python 2; Thanks
to Phus Lu</p></li>
<li><p>backdoor: Added Unix and IPv6 socket support; Thanks to Eric Urban</p></li>
</ul>
<p>Backwards incompatible:</p>
<ul>
<li><p>monkey patching: The following select methods and selector classes are now
removed, instead of being left in their respective modules after patching
even though they are not green (this also fixes HTTPServer.serve_forever()
blocking whole process on Python 3):</p>
<ul class="simple">
<li><p>select.poll</p></li>
<li><p>select.epoll</p></li>
<li><p>select.devpoll</p></li>
<li><p>select.kqueue</p></li>
<li><p>select.kevent</p></li>
<li><p>selectors.PollSelector</p></li>
<li><p>selectors.EpollSelector</p></li>
<li><p>selectors.DevpollSelector</p></li>
<li><p>selectors.KqueueSelector</p></li>
</ul>
<p>Additionally selectors.DefaultSelector points to a green SelectSelector</p>
</li>
<li><p>greenio: Fixed send() to no longer behave like sendall() which makes it
consistent with Python standard library and removes a source of very subtle
errors</p></li>
</ul>
</section>
<section id="id32">
<h1>0.17.4<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: incorrect initalization of default context; Thanks to stuart-mclaren</p></li>
</ul>
</section>
<section id="id33">
<h1>0.17.3<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>green.thread: Python3.3+ fixes; Thanks to Victor Stinner</p></li>
<li><p>Semaphore.acquire() accepts timeout=-1; Thanks to Victor Stinner</p></li>
</ul>
</section>
<section id="id34">
<h1>0.17.2<a class="headerlink" href="#id34" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: Provide python logging compatibility; Thanks to Sean Dague</p></li>
<li><p>greendns: fix premature connection closing in DNS proxy; Thanks to Tim Simmons</p></li>
<li><p>greenio: correct fd close; Thanks to Antonio Cuni and Victor Sergeyev</p></li>
<li><p>green.ssl: HTTPS client Python 2.7.9+ compatibility</p></li>
<li><p>setup: tests.{isolated,manual} polluted top-level packages</p></li>
</ul>
</section>
<section id="id35">
<h1>0.17.1<a class="headerlink" href="#id35" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greendns: fix dns.name import and Python3 compatibility</p></li>
</ul>
</section>
<section id="id36">
<h1>0.17<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Full Python3 compatibility; Thanks to Jakub Stasiak</p></li>
<li><p>greendns: IPv6 support, improved handling of /etc/hosts; Thanks to Floris Bruynooghe</p></li>
<li><p>tpool: make sure we return results during killall; Thanks to David Szotten</p></li>
<li><p>semaphore: Don’t hog a semaphore if someone else is waiting for it; Thanks to Shaun Stanworth</p></li>
<li><p>green.socket: create_connection() was wrapping all exceptions in socket.error; Thanks to Donagh McCabe</p></li>
<li><p>Make sure SSL retries are done using the exact same data buffer; Thanks to Lior Neudorfer</p></li>
<li><p>greenio: shutdown already closed sockets without error; Thanks to David Szotten</p></li>
</ul>
</section>
<section id="id37">
<h1>0.16.1<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Wheel build 0.16.0 incorrectly shipped removed module eventlet.util.</p></li>
</ul>
</section>
<section id="id38">
<h1>0.16.0<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fix SSL socket wrapping and Python 2.7.9 compatibility; Thanks to Jakub Stasiak</p></li>
<li><p>Fix monkey_patch() on Python 3; Thanks to Victor Stinner</p></li>
<li><p>Fix “maximum recursion depth exceeded in GreenSocket.__del__”; Thanks to Jakub Stasiak</p></li>
<li><p>db_pool: BaseConnectionPool.clear updates .current_size #139; Thanks to Andrey Gubarev</p></li>
<li><p>Fix __str__ method on the TimeoutExpired exception class.; Thanks to Tomaz Muraus</p></li>
<li><p>hubs: drop Twisted support</p></li>
<li><p>Removed deprecated modules: api, most of coros, pool, proc, processes and util</p></li>
<li><p>Improved Python 3 compatibility (including patch by raylu); Thanks to Jakub Stasiak</p></li>
<li><p>Allow more graceful shutdown of wsgi server; Thanks to Stuart McLaren</p></li>
<li><p>wsgi.input: Make send_hundred_continue_headers() a public API; Thanks to Tushar Gohad</p></li>
<li><p>tpool: Windows compatibility, fix ResourceWarning. Thanks to Victor Stinner</p></li>
<li><p>tests: Fix timers not cleaned up on MySQL test skips; Thanks to Corey Wright</p></li>
</ul>
</section>
<section id="id39">
<h1>0.15.2<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greenio: fixed memory leak, introduced in 0.15.1; Thanks to Michael Kerrin, Tushar Gohad</p></li>
<li><p>wsgi: Support optional headers w/ “100 Continue” responses; Thanks to Tushar Gohad</p></li>
</ul>
</section>
<section id="id40">
<h1>0.15.1<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greenio: Fix second simultaneous read (parallel paramiko issue); Thanks to Jan Grant, Michael Kerrin</p></li>
<li><p>db_pool: customizable connection cleanup function; Thanks to Avery Fay</p></li>
</ul>
</section>
<section id="id41">
<h1>0.15<a class="headerlink" href="#id41" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Python3 compatibility – <strong>not ready yet</strong>; Thanks to Astrum Kuo, Davanum Srinivas, Jakub Stasiak, Victor Sergeyev</p></li>
<li><p>coros: remove Actor which was deprecated in 2010-01</p></li>
<li><p>saranwrap: remove saranwrap which was deprecated in 2010-02</p></li>
<li><p>PyPy compatibility fixes; Thanks to Dmitriy Kruglyak, Jakub Stasiak</p></li>
<li><p>green.profile: accumulate results between runs; Thanks to Zhang Hua</p></li>
<li><p>greenthread: add .unlink() method; Thanks to Astrum Kuo</p></li>
<li><p>packaging: Generate universal wheels; Thanks to Jakub Stasiak</p></li>
<li><p>queue: Make join not wait if there are no unfinished tasks; Thanks to Jakub Stasiak</p></li>
<li><p>tpool: proxy __enter__, __exit__ fixes Bitbucket-158; Thanks to Eric Urban</p></li>
<li><p>websockets: Add websockets13 support; handle lack of Upgrade header; Thanks to Edward George</p></li>
<li><p>wsgi: capitalize_response_headers option</p></li>
</ul>
</section>
<section id="id42">
<h1>0.14<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>wsgi: handle connection socket timeouts; Thanks to Paul Oppenheim</p></li>
<li><p>wsgi: close timed out client connections</p></li>
<li><p>greenio: socket pypy compatibility; Thanks to Alex Gaynor</p></li>
<li><p>wsgi: env[‘wsgi.input’] was returning 1 byte strings; Thanks to Eric Urban</p></li>
<li><p>green.ssl: fix NameError; Github #17; Thanks to Jakub Stasiak</p></li>
<li><p>websocket: allow “websocket” in lowercase in Upgrade header; Compatibility with current Google Chrome; Thanks to Dmitry Orlov</p></li>
<li><p>wsgi: allow minimum_chunk_size to be overriden on a per request basis; Thanks to David Goetz</p></li>
<li><p>wsgi: configurable socket_timeout</p></li>
</ul>
</section>
<section id="id43">
<h1>0.13<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>hubs: kqueue support! Thanks to YAMAMOTO Takashi, Edward George</p></li>
<li><p>greenio: Fix AttributeError on MacOSX; Bitbucket #136; Thanks to Derk Tegeler</p></li>
<li><p>green: subprocess: Fix subprocess.communicate() block on Python 2.7; Thanks to Edward George</p></li>
<li><p>green: select: ensure that hub can .wait() at least once before timeout; Thanks to YAMAMOTO Takashi</p></li>
<li><p>tpool: single request queue to avoid deadlocks; Bitbucket pull request 31,32; Thanks to Edward George</p></li>
<li><p>zmq: pyzmq 13.x compatibility; Thanks to Edward George</p></li>
<li><p>green: subprocess: Popen.wait() accepts new <cite>timeout</cite> kwarg; Python 3.3 and RHEL 6.1 compatibility</p></li>
<li><p>hubs: EVENTLET_HUB can point to external modules; Thanks to Edward George</p></li>
<li><p>semaphore: support timeout for acquire(); Thanks to Justin Patrin</p></li>
<li><p>support: do not clear sys.exc_info if can be preserved (greenlet &gt;= 0.3.2); Thanks to Edward George</p></li>
<li><p>Travis continous integration; Thanks to Thomas Grainger, Jakub Stasiak</p></li>
<li><p>wsgi: minimum_chunk_size of last Server altered all previous (global variable); Thanks to Jakub Stasiak</p></li>
<li><p>doc: hubs: Point to the correct function in exception message; Thanks to Floris Bruynooghe</p></li>
</ul>
</section>
<section id="id44">
<h1>0.12<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>zmq: Fix 100% busy CPU in idle after .bind(PUB) (thanks to Geoff Salmon)</p></li>
<li><p>greenio: Fix socket.settimeout() did not switch back to blocking mode (thanks to Peter Skirko)</p></li>
<li><p>greenio: socket.dup() made excess fcntl syscalls (thanks to Peter Portante)</p></li>
<li><p>setup: Remove legacy –without-greenlet option and unused httplib2 dependency (thanks to Thomas Grainger)</p></li>
<li><p>wsgi: environ[REMOTE_PORT], also available in log_format, log accept event (thanks to Peter Portante)</p></li>
<li><p>tests: Support libzmq 3.0 SNDHWM option (thanks to Geoff Salmon)</p></li>
</ul>
</section>
<section id="id45">
<h1>0.11<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ssl: Fix 100% busy CPU in socket.sendall() (thanks to Raymon Lu)</p></li>
<li><p>zmq: Return linger argument to Socket.close() (thanks to Eric Windisch)</p></li>
<li><p>tests: SSL tests were always skipped due to bug in skip_if_no_ssl decorator</p></li>
</ul>
</section>
<section id="id46">
<h1>0.10<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>greenio: Fix relative seek() (thanks to AlanP)</p></li>
<li><p>db_pool: Fix pool.put() TypeError with min_size &gt; 1 (thanks to Jessica Qi)</p></li>
<li><p>greenthread: Prevent infinite recursion with linking to current greenthread (thanks to Edward George)</p></li>
<li><p>zmq: getsockopt(EVENTS) wakes correct threads (thanks to Eric Windisch)</p></li>
<li><p>wsgi: Handle client disconnect while sending response (thanks to Clay Gerrard)</p></li>
<li><p>hubs: Ensure that new hub greenlet is parent of old one (thanks to Edward George)</p></li>
<li><p>os: Fix waitpid() returning (0, 0) (thanks to Vishvananda Ishaya)</p></li>
<li><p>tpool: Add set_num_threads() method to set the number of tpool threads (thanks to David Ibarra)</p></li>
<li><p>threading, zmq: Fix Python 2.5 support (thanks to Floris Bruynooghe)</p></li>
<li><p>tests: tox configuration for all supported Python versions (thanks to Floris Bruynooghe)</p></li>
<li><p>tests: Fix zmq._QueueLock test in Python2.6</p></li>
<li><p>tests: Fix patcher_test on Darwin (/bin/true issue) (thanks to Edward George)</p></li>
<li><p>tests: Skip SSL tests when not available (thanks to Floris Bruynooghe)</p></li>
<li><p>greenio: Remove deprecated GreenPipe.xreadlines() method, was broken anyway</p></li>
</ul>
</section>
<section id="id47">
<h1>0.9.17<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ZeroMQ support calling send and recv from multiple greenthreads (thanks to Geoff Salmon)</p></li>
<li><p>SSL: unwrap() sends data, and so it needs trampolining (#104 thanks to Brandon Rhodes)</p></li>
<li><p>hubs.epolls: Fix imports for exception handler (#123 thanks to Johannes Erdfelt)</p></li>
<li><p>db_pool: Fix .clear() when min_size &gt; 0</p></li>
<li><p>db_pool: Add MySQL’s insert_id() method (thanks to Peter Scott)</p></li>
<li><p>db_pool: Close connections after timeout, fix get-after-close race condition with using TpooledConnectionPool (thanks to Peter Scott)</p></li>
<li><p>threading monkey patch fixes (#115 thanks to Johannes Erdfelt)</p></li>
<li><p>pools: Better accounting of current_size in pools.Pool (#91 thanks to Brett Hoerner)</p></li>
<li><p>wsgi: environ[‘RAW_PATH_INFO’] with request path as received from client (thanks to dweimer)</p></li>
<li><p>wsgi: log_output flag (thanks to Juan Manuel Garcia)</p></li>
<li><p>wsgi: Limit HTTP header size (thanks to Gregory Holt)</p></li>
<li><p>wsgi: Configurable maximum URL length (thanks to Tomas Sedovic)</p></li>
</ul>
</section>
<section id="id48">
<h1>0.9.16<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>SO_REUSEADDR now correctly set.</p></li>
</ul>
</section>
<section id="id49">
<h1>0.9.15<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ZeroMQ support without an explicit hub now implemented!  Thanks to Zed Shaw for the patch.</p></li>
<li><p>zmq module supports the NOBLOCK flag, thanks to rfk. (#76)</p></li>
<li><p>eventlet.wsgi has a debug flag which can be set to false to not send tracebacks to the client (per redbo’s request)</p></li>
<li><p>Recursive GreenPipe madness forestalled by Soren Hansen (#77)</p></li>
<li><p>eventlet.green.ssl no longer busywaits on send()</p></li>
<li><p>EEXIST ignored in epoll hub (#80)</p></li>
<li><p>eventlet.listen’s behavior on Windows improved, thanks to Nick Vatamaniuc (#83)</p></li>
<li><p>Timeouts raised within tpool.execute are propagated back to the caller (thanks again to redbo for being the squeaky wheel)</p></li>
</ul>
</section>
<section id="id50">
<h1>0.9.14<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Many fixes to the ZeroMQ hub, which now requires version 2.0.10 or later.  Thanks to Ben Ford.</p></li>
<li><p>ZeroMQ hub no longer depends on pollhub, and thus works on Windows (thanks, Alexey Borzenkov)</p></li>
<li><p>Better handling of connect errors on Windows, thanks again to Alexey Borzenkov.</p></li>
<li><p>More-robust Event delivery, thanks to Malcolm Cleaton</p></li>
<li><p>wsgi.py now distinguishes between an empty query string (“”) and a non-existent query string (no entry in environ).</p></li>
<li><p>wsgi.py handles ipv6 correctly (thanks, redbo)</p></li>
<li><p>Better behavior in tpool when you give it nonsensical numbers, thanks to R. Tyler for the nonsense.  :)</p></li>
<li><p>Fixed importing on 2.5 (#73, thanks to Ruijun Luo)</p></li>
<li><p>Hub doesn’t hold on to invalid fds (#74, thanks to Edward George)</p></li>
<li><p>Documentation for eventlet.green.zmq, courtesy of Ben Ford</p></li>
</ul>
</section>
<section id="id51">
<h1>0.9.13<a class="headerlink" href="#id51" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>ZeroMQ hub, and eventlet.green.zmq make supersockets green.  Thanks to Ben Ford!</p></li>
<li><p>eventlet.green.MySQLdb added.  It’s an interface to MySQLdb that uses tpool to make it appear nonblocking</p></li>
<li><p>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.</p></li>
<li><p>Eventlet now depends on greenlet 0.3 or later.</p></li>
<li><p>Fixed a hang when using tpool during an import causes another import.  Thanks to mikepk for tracking that down.</p></li>
<li><p>Improved websocket draft 76 compliance, thanks to Nick V.</p></li>
<li><p>Rare greenthread.kill() bug fixed, which was probably brought about by a bugfix in greenlet 0.3.</p></li>
<li><p>Easy_installing eventlet should no longer print an ImportError about greenlet</p></li>
<li><p>Support for serving up SSL websockets, thanks to chwagssd for reporting #62</p></li>
<li><p>eventlet.wsgi properly sets ‘wsgi.url_scheme’ environment variable to ‘https’, and ‘HTTPS’ to ‘on’ if serving over ssl</p></li>
<li><p>Blocking detector uses setitimer on 2.6 or later, allowing for sub-second block detection, thanks to rtyler.</p></li>
<li><p>Blocking detector is documented now, too</p></li>
<li><p>socket.create_connection properly uses dnspython for nonblocking dns.  Thanks to rtyler.</p></li>
<li><p>Removed EVENTLET_TPOOL_DNS, nobody liked that.  But if you were using it, install dnspython instead.  Thanks to pigmej and gholt.</p></li>
<li><p>Removed _main_wrapper from greenthread, thanks to Ambroff adding keyword arguments to switch() in 0.3!</p></li>
</ul>
</section>
<section id="id52">
<h1>0.9.12<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>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.</p></li>
<li><p>Removed circular import in twistedr.py</p></li>
<li><p>Added websocket multi-user chat example</p></li>
<li><p>Not using exec() in green modules anymore.</p></li>
<li><p>eventlet.green.socket now contains all attributes of the stdlib socket module, even those that were left out by bugs.</p></li>
<li><p>Eventlet.wsgi doesn’t call print anymore, instead uses the logfiles for everything (it used to print exceptions in one place).</p></li>
<li><p>Eventlet.wsgi properly closes the connection when an error is raised</p></li>
<li><p>Better documentation on eventlet.event.Event.send_exception</p></li>
<li><p>Adding websocket.html to tarball so that you can run the examples without checking out the source</p></li>
</ul>
</section>
<section id="id53">
<h1>0.9.10<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>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.</p></li>
<li><p>Full test suite passes on Python 2.7.</p></li>
<li><p>Tests no longer depend on simplejson for &gt;2.6.</p></li>
<li><p>Potential-bug fixes in patcher (thanks to Schmir, and thanks to Hudson)</p></li>
<li><p>Websockets work with query strings (thanks to mcarter)</p></li>
<li><p>WSGI posthooks that get called after the request completed (thanks to gholt, nice docs, too)</p></li>
<li><p>Blocking detector merged – use it to detect places where your code is not yielding to the hub for &gt; 1 second.</p></li>
<li><p>tpool.Proxy can wrap callables</p></li>
<li><p>Tweaked Timeout class to do something sensible when True is passed to the constructor</p></li>
</ul>
</section>
<section id="id54">
<h1>0.9.9<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>A fix for monkeypatching on systems with psycopg version 2.0.14.</p></li>
<li><p>Improved support for chunked transfers in wsgi, plus a bunch of tests from schmir (ported from gevent by redbo)</p></li>
<li><p>A fix for the twisted hub from Favo Yang</p></li>
</ul>
</section>
<section id="id55">
<h1>0.9.8<a class="headerlink" href="#id55" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Support for psycopg2’s asynchronous mode, from Daniele Varrazzo</p></li>
<li><p>websocket module is now part of core Eventlet with 100% unit test coverage thanks to Ben Ford.  See its documentation at <a class="reference external" href="http://eventlet.net/doc/modules/websocket.html">http://eventlet.net/doc/modules/websocket.html</a></p></li>
<li><p>Added wrap_ssl convenience method, meaning that we truly no longer need api or util modules.</p></li>
<li><p>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.</p></li>
<li><p>Cleaner monkey_patch API: the “all” keyword is no longer necessary.</p></li>
<li><p>Pool objects have a more convenient constructor – no more need to subclass</p></li>
<li><p>amajorek’s reimplementation of GreenPipe</p></li>
<li><p>Many bug fixes, major and minor.</p></li>
</ul>
</section>
<section id="id56">
<h1>0.9.7<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>GreenPipe is now a context manager (thanks, quad)</p></li>
<li><p>tpool.Proxy supports iterators properly</p></li>
<li><p>bug fixes in eventlet.green.os (thanks, Benoit)</p></li>
<li><p>much code cleanup from Tavis</p></li>
<li><p>a few more example apps</p></li>
<li><p>multitudinous improvements in Py3k compatibility from amajorek</p></li>
</ul>
</section>
<section id="id57">
<h1>0.9.6<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>new EVENTLET_HUB environment variable allows you to select a hub without code</p></li>
<li><p>improved GreenSocket and GreenPipe compatibility with stdlib</p></li>
<li><p>bugfixes on GreenSocket and GreenPipe objects</p></li>
<li><p>code coverage increased across the board</p></li>
<li><p>Queue resizing</p></li>
<li><p>internal DeprecationWarnings largely eliminated</p></li>
<li><p>tpool is now reentrant (i.e., can call tpool.execute(tpool.execute(foo)))</p></li>
<li><p>more reliable access to unpatched modules reduces some race conditions when monkeypatching</p></li>
<li><p>completely threading-compatible corolocal implementation, plus tests and enthusiastic adoption</p></li>
<li><p>tests stomp on each others’ toes less</p></li>
<li><p>performance improvements in timers, hubs, greenpool</p></li>
<li><p>Greenlet-aware profile module courtesy of CCP</p></li>
<li><p>support for select26 module’s epoll</p></li>
<li><p>better PEP-8 compliance and import cleanup</p></li>
<li><p>new eventlet.serve convenience function for easy TCP servers</p></li>
</ul>
</section>
<section id="id58">
<h1>0.9.5<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>support psycopg in db_pool</p></li>
<li><p>smart patcher that does the right patching when importing without needing to understand plumbing of patched module</p></li>
<li><p>patcher.monkey_patch() method replacing util.wrap_*</p></li>
<li><p>monkeypatch threading support</p></li>
<li><p>removed api.named</p></li>
<li><p>imported timeout module from gevent, replace exc_after and with_timeout()</p></li>
<li><p>replace call_after with spawn_after; this is so that users don’t see the Timer class</p></li>
<li><p>added cancel() method to GreenThread to support the semantic of “abort if not already in the middle of something”</p></li>
<li><p>eventlet.green.os with patched read() and write(), etc</p></li>
<li><p>moved stuff from wrap_pipes_with_coroutine_pipe into green.os</p></li>
<li><p>eventlet.green.subprocess instead of eventlet.processes</p></li>
<li><p>improve patching docs, explaining more about patcher and why you’d use eventlet.green</p></li>
<li><p>better documentation on greenpiles</p></li>
<li><p>deprecate api.py completely</p></li>
<li><p>deprecate util.py completely</p></li>
<li><p>deprecate saranwrap</p></li>
<li><p>performance improvements in the hubs</p></li>
<li><p>much better documentation overall</p></li>
<li><p>new convenience functions: eventlet.connect and eventlet.listen.  Thanks, Sergey!</p></li>
</ul>
</section>
<section id="id59">
<h1>0.9.4<a class="headerlink" href="#id59" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Deprecated coros.Queue and coros.Channel (use queue.Queue instead)</p></li>
<li><p>Added putting and getting methods to queue.Queue.</p></li>
<li><p>Added eventlet.green.Queue which is a greened clone of stdlib Queue, along with stdlib tests.</p></li>
<li><p>Changed __init__.py so that the version number is readable even if greenlet’s not installed.</p></li>
<li><p>Bugfixes in wsgi, greenpool</p></li>
</ul>
</section>
<section id="id60">
<h1>0.9.3<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>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.</p></li>
<li><p>Proc module deprecated in favor of greenthread</p></li>
<li><p>New module greenthread, with new class GreenThread.</p></li>
<li><p>New GreenPool class that replaces pool.Pool.</p></li>
<li><p>Deprecated proc module (use greenthread module instead)</p></li>
<li><p>tpooled gethostbyname is configurable via environment variable EVENTLET_TPOOL_GETHOSTBYNAME</p></li>
<li><p>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.</p></li>
<li><p>Added epoll support</p></li>
<li><p>Improved documentation across the board.</p></li>
<li><p>New queue module, API-compatible with stdlib Queue</p></li>
<li><p>New debug module, used for enabling verbosity within Eventlet that can help debug applications or Eventlet itself.</p></li>
<li><p>Bugfixes in tpool, green.select, patcher</p></li>
<li><p>Deprecated coros.execute (use eventlet.spawn instead)</p></li>
<li><p>Deprecated coros.semaphore (use semaphore.Semaphore or semaphore.BoundedSemaphore instead)</p></li>
<li><p>Moved coros.BoundedSemaphore to semaphore.BoundedSemaphore</p></li>
<li><p>Moved coros.Semaphore to semaphore.Semaphore</p></li>
<li><p>Moved coros.event to event.Event</p></li>
<li><p>Deprecated api.tcp_listener, api.connect_tcp, api.ssl_listener</p></li>
<li><p>Moved get_hub, use_hub, get_default_hub from eventlet.api to eventlet.hubs</p></li>
<li><p>Renamed libevent hub to pyevent.</p></li>
<li><p>Removed previously-deprecated features tcp_server, GreenSSL, erpc, and trap_errors.</p></li>
<li><p>Removed saranwrap as an option for making db connections nonblocking in db_pool.</p></li>
</ul>
</section>
<section id="id61">
<h1>0.9.2<a class="headerlink" href="#id61" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Bugfix for wsgi.py where it was improperly expecting the environ variable to be a constant when passed to the application.</p></li>
<li><p>Tpool.py now passes its tests on Windows.</p></li>
<li><p>Fixed minor performance issue in wsgi.</p></li>
</ul>
</section>
<section id="id62">
<h1>0.9.1<a class="headerlink" href="#id62" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>PyOpenSSL is no longer required for Python 2.6: use the eventlet.green.ssl module. 2.5 and 2.4 still require PyOpenSSL.</p></li>
<li><p>Cleaned up the eventlet.green packages and their associated tests, this should result in fewer version-dependent bugs with these modules.</p></li>
<li><p>PyOpenSSL is now fully wrapped in eventlet.green.OpenSSL; using it is therefore more consistent with using other green modules.</p></li>
<li><p>Documentation on using SSL added.</p></li>
<li><p>New green modules: ayncore, asynchat, SimpleHTTPServer, CGIHTTPServer, ftplib.</p></li>
<li><p>Fuller thread/threading compatibility: patching threadlocal with corolocal so coroutines behave even more like threads.</p></li>
<li><p>Improved Windows compatibility for tpool.py</p></li>
<li><p>With-statement compatibility for pools.Pool objects.</p></li>
<li><p>Refactored copyrights in the files, added LICENSE and AUTHORS files.</p></li>
<li><p>Added support for logging x-forwarded-for header in wsgi.</p></li>
<li><p>api.tcp_server is now deprecated, will be removed in a future release.</p></li>
<li><p>Added instructions on how to generate coverage reports to the documentation.</p></li>
<li><p>Renamed GreenFile to Green_fileobject, to better reflect its purpose.</p></li>
<li><p>Deprecated erpc method in tpool.py</p></li>
<li><p>Bug fixes in: wsgi.py, twistedr.py, poll.py, greenio.py, util.py, select.py, processes.py, selects.py</p></li>
</ul>
</section>
<section id="id63">
<h1>0.9.0<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Full-duplex sockets (simultaneous readers and writers in the same process).</p></li>
<li><dl class="simple">
<dt>Remove modules that distract from the core mission of making it straightforward to write event-driven networking apps:</dt><dd><p>httpd, httpc, channel, greenlib, httpdate, jsonhttp, logutil</p>
</dd>
</dl>
</li>
<li><p>Removed test dependency on sqlite, using nose instead.</p></li>
<li><p>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).</p></li>
<li><p>Remove copied code from python standard libs (in tests).</p></li>
<li><p>Added eventlet.patcher which can be used to import “greened” modules.</p></li>
</ul>
</section>
<section id="id64">
<h1>0.8.16<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>GreenSSLObject properly masks ZeroReturnErrors with an empty read; with unit test.</p></li>
<li><p>Fixed 2.6 SSL compatibility issue.</p></li>
</ul>
</section>
<section id="id65">
<h1>0.8.15<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>GreenSSL object no longer converts ZeroReturnErrors into empty reads, because that is more compatible with the underlying SSLConnection object.</p></li>
<li><p>Fixed issue caused by SIGCHLD handler in processes.py</p></li>
<li><p>Stopped supporting string exceptions in saranwrap and fixed a few test failures.</p></li>
</ul>
</section>
<section id="id66">
<h1>0.8.14<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>Fixed some more Windows compatibility problems, resolving EVT-37 :</p></li>
</ul>
<p><a class="reference external" href="http://jira.secondlife.com/browse/EVT-37">http://jira.secondlife.com/browse/EVT-37</a>
* waiting() method on Pool class, which was lost when the Pool implementation
replaced CoroutinePool.</p>
</section>
<section id="id67">
<h1>0.8.13<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>2.6 SSL compatibility patch by Marcus Cavanaugh.</p></li>
<li><p>Added greenlet and pyopenssl as dependencies in setup.py.</p></li>
</ul>
</section>
<section id="id68">
<h1>0.8.12<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h1>
<ul class="simple">
<li><p>The ability to resize() pools of coroutines, which was lost when the</p></li>
</ul>
<p>Pool implementation replaced CoroutinePool.
* Fixed Cesar’s issue with SSL connections, and furthermore did a
complete overhaul of SSL handling in eventlet so that it’s much closer
to the behavior of the built-in libraries.  In particular, users of
GreenSSL sockets must now call shutdown() before close(), exactly
like SSL.Connection objects.
* A small patch that makes Eventlet work on Windows.  This is the first
release of Eventlet that works on Windows.</p>
</section>
<section id="id69">
<h1>0.8.11<a class="headerlink" href="#id69" title="Permalink to this headline">¶</a></h1>
<p>Eventlet can now run on top of twisted reactor. Twisted-based hub is enabled automatically if
twisted.internet.reactor is imported. It is also possible to “embed” eventlet into a twisted
application via eventlet.twistedutil.join_reactor. See the examples for details.</p>
<p>A new package, eventlet.twistedutil, is added that makes integration of twisted and eventlet
easier. It has block_on function that allows to wait for a Deferred to fire and it wraps
twisted’s Protocol in a synchronous interface. This is similar to and is inspired by Christopher
Armstrong’s corotwine library. Thanks to Dan Pascu for reviewing the package.</p>
<p>Another new package, eventlet.green, was added to provide some of the standard modules
that are fixed not to block other greenlets. This is an alternative to monkey-patching
the socket, which is impossible to do if you are running twisted reactor.
The package includes socket, httplib, urllib2.</p>
<p>Much of the core functionality has been refactored and cleaned up, including the removal
of eventlet.greenlib. This means that it is now possible to use plain greenlets without
modification in eventlet, and the subclasses of greenlet instead of the old
eventlet.greenlib.GreenletContext. Calling eventlet.api.get_hub().switch() now checks to
see whether the current greenlet has a “switch_out” method and calls it if so, providing the
same functionality that the GreenletContext.swap_out used to. The swap_in behavior can be
duplicated by overriding the switch method, and the finalize functionality can be duplicated
by having a try: finally: block around the greenlet’s main implementation. The eventlet.backdoor
module has been ported to this new scheme, although it’s signature had to change slightly so
existing code that used the backdoor will have to be modified.</p>
<p>A number of bugs related to improper scheduling of switch calls has been fixed.
The fixed functions and classes include api.trampoline, api.sleep, coros.event,
coros.semaphore, coros.queue.</p>
<p>Many methods of greenio.GreenSocket were fixed to make its behavior more like that of a regular
socket. Thanks to Marcin Bachry for fixing GreenSocket.dup to preserve the timeout.</p>
<p>Added proc module which provides an easy way to subscribe to coroutine’s results. This makes
it easy to wait for a single greenlet or for a set of greenlets to complete.</p>
<p>wsgi.py now supports chunked transfer requests (patch by Mike Barton)</p>
<p>The following modules were deprecated or removed because they were broken:
hubs.nginx, hubs.libev, support.pycurls, support.twisteds, cancel method of coros.event class</p>
<p>The following classes are still present but will be removed in the future version:
- channel.channel (use coros.Channel)
- coros.CoroutinePool (use pool.Pool)</p>
<p>saranwrap.py now correctly closes the child process when the referring object is deleted,
received some fixes to its detection of child process death, now correctly deals with the in
keyword, and it is now possible to use coroutines in a non-blocking fashion in the child process.</p>
<p>Time-based expiry added to db_pool.  This adds the ability to expire connections both by idleness
and also by total time open.  There is also a connection timeout option.</p>
<p>A small bug in httpd’s error method was fixed.</p>
<p>Python 2.3 is no longer supported.</p>
<p>A number of tests was added along with a script to run all of them for all the configurations.
The script generates an html page with the results.</p>
<p>Thanks to Brian Brunswick for investigation of popen4 badness (eventlet.process)
Thanks to Marcus Cavanaugh for pointing out some coros.queue(0) bugs.</p>
<p>The twisted integration as well as many other improvements were funded by AG Projects (<a class="reference external" href="http://ag-projects.com">http://ag-projects.com</a>), thanks!</p>
</section>
<section id="x">
<h1>0.8.x<a class="headerlink" href="#x" title="Permalink to this headline">¶</a></h1>
<p>Fix a CPU leak that would cause the poll hub to consume 100% CPU in certain conditions, for example the echoserver example. (Donovan Preston)</p>
<p>Fix the libev hub to match libev’s callback signature. (Patch by grugq)</p>
<p>Add a backlog argument to api.tcp_listener (Patch by grugq)</p>
</section>
<section id="id70">
<h1>0.7.x<a class="headerlink" href="#id70" title="Permalink to this headline">¶</a></h1>
<p>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).</p>
<p>It’s now possible to use eventlet’s SSL client to talk to eventlet’s SSL server. (Thanks to Ryan Williams)</p>
<p>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.</p>
</section>
<section id="id71">
<h1>0.6.x<a class="headerlink" href="#id71" title="Permalink to this headline">¶</a></h1>
<p>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.</p>
<p>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.</p>
</section>
<section id="id72">
<h1>0.5.x<a class="headerlink" href="#id72" title="Permalink to this headline">¶</a></h1>
<p>“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: <a class="reference external" href="http://wiki.secondlife.com/wiki/Eventlet/Documentation">http://wiki.secondlife.com/wiki/Eventlet/Documentation</a></p>
<p>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.</p>
</section>
<section id="id73">
<h1>0.2<a class="headerlink" href="#id73" title="Permalink to this headline">¶</a></h1>
<p>Initial re-release of forked linden branch.</p>
</section>


            <div class="clearer"></div>
          </div>
        </div>
      </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
  <h3><a href="index.html">Table of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">0.32.0</a></li>
<li><a class="reference internal" href="#id2">0.31.1</a></li>
<li><a class="reference internal" href="#id3">0.31.0</a></li>
<li><a class="reference internal" href="#id4">0.30.3</a></li>
<li><a class="reference internal" href="#id5">0.30.2</a></li>
<li><a class="reference internal" href="#id6">0.30.1</a></li>
<li><a class="reference internal" href="#id7">0.30.0</a></li>
<li><a class="reference internal" href="#id8">0.29.1</a></li>
<li><a class="reference internal" href="#id9">0.29.0</a></li>
<li><a class="reference internal" href="#id10">0.28.1</a></li>
<li><a class="reference internal" href="#id11">0.28.0</a></li>
<li><a class="reference internal" href="#id12">0.27.0</a></li>
<li><a class="reference internal" href="#id13">0.26.1</a></li>
<li><a class="reference internal" href="#id14">0.26.0</a></li>
<li><a class="reference internal" href="#id15">0.25.2</a></li>
<li><a class="reference internal" href="#id16">0.25.1</a></li>
<li><a class="reference internal" href="#id17">0.25.0</a></li>
<li><a class="reference internal" href="#id18">0.24.1</a></li>
<li><a class="reference internal" href="#id19">0.24.0</a></li>
<li><a class="reference internal" href="#id20">0.23.0</a></li>
<li><a class="reference internal" href="#id21">0.22.1</a></li>
<li><a class="reference internal" href="#id22">0.22.0</a></li>
<li><a class="reference internal" href="#id23">0.21.0</a></li>
<li><a class="reference internal" href="#id24">0.20.1</a></li>
<li><a class="reference internal" href="#id25">0.20.0</a></li>
<li><a class="reference internal" href="#id26">0.19.0</a></li>
<li><a class="reference internal" href="#id27">0.18.4</a></li>
<li><a class="reference internal" href="#id28">0.18.3</a></li>
<li><a class="reference internal" href="#id29">0.18.2</a></li>
<li><a class="reference internal" href="#id30">0.18.1</a></li>
<li><a class="reference internal" href="#id31">0.18.0</a></li>
<li><a class="reference internal" href="#id32">0.17.4</a></li>
<li><a class="reference internal" href="#id33">0.17.3</a></li>
<li><a class="reference internal" href="#id34">0.17.2</a></li>
<li><a class="reference internal" href="#id35">0.17.1</a></li>
<li><a class="reference internal" href="#id36">0.17</a></li>
<li><a class="reference internal" href="#id37">0.16.1</a></li>
<li><a class="reference internal" href="#id38">0.16.0</a></li>
<li><a class="reference internal" href="#id39">0.15.2</a></li>
<li><a class="reference internal" href="#id40">0.15.1</a></li>
<li><a class="reference internal" href="#id41">0.15</a></li>
<li><a class="reference internal" href="#id42">0.14</a></li>
<li><a class="reference internal" href="#id43">0.13</a></li>
<li><a class="reference internal" href="#id44">0.12</a></li>
<li><a class="reference internal" href="#id45">0.11</a></li>
<li><a class="reference internal" href="#id46">0.10</a></li>
<li><a class="reference internal" href="#id47">0.9.17</a></li>
<li><a class="reference internal" href="#id48">0.9.16</a></li>
<li><a class="reference internal" href="#id49">0.9.15</a></li>
<li><a class="reference internal" href="#id50">0.9.14</a></li>
<li><a class="reference internal" href="#id51">0.9.13</a></li>
<li><a class="reference internal" href="#id52">0.9.12</a></li>
<li><a class="reference internal" href="#id53">0.9.10</a></li>
<li><a class="reference internal" href="#id54">0.9.9</a></li>
<li><a class="reference internal" href="#id55">0.9.8</a></li>
<li><a class="reference internal" href="#id56">0.9.7</a></li>
<li><a class="reference internal" href="#id57">0.9.6</a></li>
<li><a class="reference internal" href="#id58">0.9.5</a></li>
<li><a class="reference internal" href="#id59">0.9.4</a></li>
<li><a class="reference internal" href="#id60">0.9.3</a></li>
<li><a class="reference internal" href="#id61">0.9.2</a></li>
<li><a class="reference internal" href="#id62">0.9.1</a></li>
<li><a class="reference internal" href="#id63">0.9.0</a></li>
<li><a class="reference internal" href="#id64">0.8.16</a></li>
<li><a class="reference internal" href="#id65">0.8.15</a></li>
<li><a class="reference internal" href="#id66">0.8.14</a></li>
<li><a class="reference internal" href="#id67">0.8.13</a></li>
<li><a class="reference internal" href="#id68">0.8.12</a></li>
<li><a class="reference internal" href="#id69">0.8.11</a></li>
<li><a class="reference internal" href="#x">0.8.x</a></li>
<li><a class="reference internal" href="#id70">0.7.x</a></li>
<li><a class="reference internal" href="#id71">0.6.x</a></li>
<li><a class="reference internal" href="#id72">0.5.x</a></li>
<li><a class="reference internal" href="#id73">0.2</a></li>
</ul>

  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="_sources/changelog.rst.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
   </div>
<div id="searchbox" style="display: none" role="search">
  <h3 id="searchlabel">Quick search</h3>
    <div class="searchformwrapper">
    <form class="search" action="search.html" method="get">
      <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
      <input type="submit" value="Go" />
    </form>
    </div>
</div>
<script>$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="General Index"
             >index</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Python Module Index"
             >modules</a> |</li>
        <li class="nav-item nav-item-0"><a href="index.html">Eventlet 0.32.0 documentation</a> &#187;</li>
        <li class="nav-item nav-item-this"><a href="">0.32.0</a></li> 
      </ul>
    </div>

    <div class="footer" role="contentinfo">
        &#169; Copyright 2005-2010, Eventlet Contributors.
      Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 4.1.2.
    </div>
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-42952223-1', 'eventlet.net');
  ga('send', 'pageview');
</script>

  </body>
</html>