1.1版的更改#
1.1.2(2016年7月21日)#
Python 2:
sendall在非阻塞的套接字上,可能会出现假故障并超时。如果
sys.stderr已进行猴修补(不推荐),但集线器报告没有丢失,仍然可以捕获的例外。报告时间: issue #825 杰尔·斯密特。selectors.SelectSelector不管进口订单如何,都要正确地修补。报告时间: issue #835 作者:Przemys_aw w_grzyn。Python 2:
reload(site)不再失败TypeError如果Gevent已经进口。报告时间: issue #805 杰克·希尔顿。
1.1.1(2016年4月4日)#
设置和清除事件的嵌套回调不再导致
wait过早返回。报告时间: issue #771 作者:Sergey Vasilyev。在Solaris 10上修复内部版本。报告时间: issue #777 作者:Wiggin15。
这个
ref参数到gevent.os.fork_and_watch()被忽略。Python 3:
gevent.queue.Channel现在可以正确地进行迭代,而不是提升TypeError.python 3:添加对
socket.socket.sendmsg(),socket.socket.recvmsg()和socket.socket.recvmsg_into()在定义它们的平台上。首字母 pull request #773 作者:Jakub Klama。
1.1.0(2016年3月5日)#
Python 3:有补丁的猴子
threading.RLock现在适当地阻塞(或死锁)acquire如果默认值为 超时 使用的是-1(不同于gevent的默认值none)。这个acquire方法也会引发相同的ValueError标准库对无效参数执行的异常。报告时间: issue #750 郑大喜。修正比赛条件
Event所以它又回来了False当事件被相同的greenlet设置和清除后,才允许切换到已经等待的greenlet。(由3.4和3.5标准库测试套件找到;与python相同 bug 13502 . 注意,python 2标准库仍然有这个竞争条件。)Event和AsyncResult现在以相同(未指定)的顺序唤醒等待的绿小菜。以前,AsyncResult倾向于使用先进先出订单,但这从未得到保证。这两个类也使用较少的每个实例内存。使用A
Logger作为一个pywsgi错误或请求日志流不再产生额外的换行符。报告时间: issue #756 根据AEL规范。Windows:从pypi上的sdist(.tar.gz)安装不再需要先安装cython。(请注意,在Windows上首选二进制安装格式(Wheels、Exes、MSI)。报告于 issue #757 内德·巴切尔德。
在以下情况下发出警告:
patch_all()被调用os设置为假( not 违约)但是signal仍然为真(默认值)。此参数组合将导致SIGCHLD不被呼叫。将来,这可能会导致错误。乔希·祖克报道。在以下情况下发出警告:
patch_all()使用不同的参数多次调用。这会导致所有真参数的累积集被修补,这可能会导致意外的结果。修复返回某些
threading属性来自gevent.monkey.get_original().
1.1RC5(2016年2月24日)#
ssl:尝试使用发送空数据
sendall()具有超时的gevent ssl套接字的方法现在立即返回(与标准库一样),而不是错误地引发ssl.SSLEOFError. (请注意,使用send()方法 does 提升SSLEOFError在gevent和标准库中)报告 issue #719 由Mustafa Atik和Tymur Maryokhin提供,Timo Savola提供了一个可复制的测试案例。
1.1RC4(2016年2月16日)#
python 2:在导入时使用阻塞API,当多个greenlet同时导入时,不应导致
LoopExit. 报告时间: issue #728 加勒特高跟鞋。Python 2:不要升高
OverflowError当使用readline当客户端上载大量数据时,不带大小提示或带有大大小提示的wsgi输入流的方法。(这只影响了cpython 2;pypy和python 3已经处理了这一点。)中报告 issue #289 作者:Ggjlldd,作者:Nathan Hoad。BaseServer它的子类是WSGIServer避免为每个请求分配新的闭包,从而减少开销。python 2:在2.7.9及更高版本下(或当PEP 466 SSL接口可用时),执行与标准库相同的主机名验证;以前跳过了这一点。另外,阅读、写作或握手
SSLSocket现在提高同样的水平ValueError标准库可以,而不是AttributeError. 通过更新gevent的标准库测试用例副本找到。最初报告于 issue #735 作者:Dmitrij D.Czarkoff。python 3:修复
unwrap()以及SNI的回电。同时对未连接的SSL套接字提出正确的异常,并正确验证SSL主机名。通过更新的标准库测试找到。python 3:添加缺少的对
socket.socket.sendfile(). 通过更新的标准库测试找到。python 3.4+:添加对
socket.socket.get_inheritable()和set_inheritable(). 通过更新的标准库测试找到。
1.1RC3(2016年1月4日)#
python 2:支持新的pep 466
ssl提供它们的任何python 2版本上的接口,而不仅仅是它正式附带的版本。一些Linux发行版,包括Redhat/CentOS和Amazon,已经将更改反向移植到旧版本。报告时间: issue #702 .pypy:Cython编译的代码和垃圾收集器之间的交互导致pypy在以前分配的信号量用于
__del__方法,在流行的库中执行的操作requests和urllib3. 由于这个和其他与cython相关的问题,cython不再在pypy上编译信号量类。这意味着它现在是可追踪的,并不像赛通版本那样具有原子性,尽管整体语义应该保持不变。报告时间: issue #704 肖恩·克拉普顿。pypy:优化cffi后端以使用更少的内存(每个观察者有两个指针)。
python 3:wsgi
PATH_INFO条目是使用拉丁文-1而不是UTF-8从URL转义中解码的。这提高了对PEP 3333的遵从性和与Django等一些框架的兼容性。固定在 pull request #712 由鲁本·德维舍尔撰文。
1.1RC2(2015年12月11日)#
gevent的ssl套接字引发的异常更符合标准库(例如,gevent的python 3 ssl套接字引发
socket.timeout而不是ssl.SSLError在python 3.2中引入了一个更改)。python 2:gevent的套接字
sendall方法在某些情况下可以完全忽略超时。超时现在是指sendall.Gevent的SSL套接字
sendall方法不应再提升SSL3_WRITE_PENDING在极少数情况下,当发送大型缓冲区时。报告时间: issue #317 .gevent.signal.signal()现在允许重置(sig_dfl)和忽略(sig_ign)进程级别的sigchld信号(尽管这可能允许与libev子观察程序的争用条件)。报告时间: issue #696 作者:亚当·宁。gevent.spawn_raw()现在接受关键字参数,正如以前(错误地)记录的那样。报告时间: issue #680 罗恩罗斯曼。PYPY:现在需要PYPY 2.6.1或更高版本(建议使用4.0.1或更高版本)。
cffi后端现在在cpython实现上构建并可用(在Windows上除外),如果
cffi在安装Gevent之前安装。要使用cffi后端,请设置环境变量GEVENT_CORE_CFFI_ONLY在启动python之前。在某些情况下,这有助于调试,并有助于确保所有受支持平台组合的奇偶性。cffi后端现在调用观察者的回调
args属性设置为None就像赛通后端一样。它也只允许args是一个元组或None,再次匹配cython后端。pypy/cffi:修复使用stat watchers时可能发生的崩溃。
pypy/cffi:使用
sys.getfilesystemencoding()就像赛通后端。内部实现模块
gevent._fileobject2,gevent._fileobject3和gevent._util已删除。自1.1b1以来,这些设备尚未使用或测试。
1.1RC1(2015年11月14日)#
Windows/python 3:完成移植
gevent.subprocess模块,修复大量失败的测试。故障示例如下 issue #668 和 issue #669 由斯罗斯报道。python 3:sslsocket类应返回空的
bytes对象,而不是str. 固定在 pull request #674 作者:Dahong Kim。python 2:解决stdlib中的缓冲错误
io导致FileObjectPosix在某些情况下比需要的慢。报告时间: issue #675 作者:wgh-。Pypy:修复一个崩溃。报告时间: issue #676 杰伊·奥斯特。
小心
还有一些相对罕见的Pypy崩溃,但其最终原因尚不清楚(Gevent、CFFI、Greenlet、Pypy GC?).pypy用户可以 issue #677 帮助追踪他们。
pypy:处理循环回调函数引发的错误时引发的异常的行为类似于cpython实现:异常被打印,其余回调继续处理。
如果一个具有活动观察程序的中心对象被破坏,然后为同一线程创建另一个中心对象,然后用
destroy_loop=True,进程可能崩溃。记录在 issue #237 并根据 pull request #238 均出自Jan Philip Gehrcke。python 3:在多个本机后台线程中首次同时初始化gevent的hub可能会失败
AttributeError和ImportError. 报告时间: issue #687 作者:Gregory Petukhov。
1.1B6(2015年10月17日)#
pypy:修复为分配和处理多个代码的内存泄漏
gevent.lock.Semaphore子类。如果猴子修补了,这也适用于threading.Semaphore物体。报告时间: issue #660 杰伊·奥斯特。pypy:cython版本0.23.4或更高版本必须用于避免内存泄漏 (details) . 多亏了杰伊·奥斯特。
允许子类
WSGIHandler处理无效的HTTP客户端请求。不是鲍勃报道的。WSGIServer更有力的支持Logger-类似的参数log和error_log(如1.1b1所述,这可能导致与Gunicorn的集成问题)。报告时间: issue #663 杰伊·奥斯特。_DummyThread对象,当threading.current_thread()在一个新的greenlet中调用(这通常是隐式发生的,例如日志记录时),重量要轻得多。例如,它们不再分配,然后删除Semaphore这对Pypy尤其重要。请求登录
gevent.pywsgi在python 3上正确格式化状态代码。报告时间: issue #664 作者:陈凯文。恢复对
gevent.lock.Semaphore作为制作的一部分被无意中移除Semaphore1.1b1上Pypy上的原子。报告时间: issue #666 作者:朱依凡。为python 3.5构建Windows轮子。报告时间: pull request #665 用六角链钳。
1.1B5(2015年9月18日)#
gevent.subprocess在python 3.5下工作。通常,Python3.5有初步的支持。报告时间: issue #653 发出吱吱声。Popen.communicate荣誉Atimeout参数,即使无法与子进程通信(stdin、stdout和stderr均未设置为PIPE)。作为新函数的python 3.5测试套件的一部分被注意到subprocess.run但影响所有版本 (timeout是python 3下的官方参数,也是python 2下语义稍有不同的gevent扩展。修复一个可能的
ValueError从Queue.peek. 报告时间: issue #647 作者:陈凯文。恢复向后兼容性以便使用
gevent.signal作为可调用项,根据进口顺序,可在添加gevent.signal模块。报告时间: issue #648 西尔文·齐默。在python 2下对系统进行monkey修补后,在模块的顶层执行的gevent阻塞操作可能导致
LoopExit而不是完成预期的阻塞操作。请注意,通常不建议在模块的顶层执行gevent阻塞操作,但当monkey修补现有脚本时,可能会出现这种情况。报告时间: issue #651 和 issue #652 作者:迈克·卡普林斯基。SIGCHLD和waitpid现在为(猴子补丁)返回的pids工作os.forkpty和pty.fork函数的作用方式与os.fork功能。报告时间: issue #650 作者:Erich Heine。WSGIServer和WSGIHandler在start_response()按照 WSGI specification . 此外,在python 2下,为了使应用程序一致,可以避免不必要的编码和编码(通常是通过ASCII编码进行的)。这是对已经记录并部分强制的约束的增强:从1.1a1开始,在python 2下,u'abc'以前通常是允许的,但是u'\u1f4a3'不会;现在,也不允许这样做,更接近规范,改进可调试性和性能,允许应用程序和gevent更好地处理错误(以前,某些编码错误可能导致gevent写入无效/格式错误的HTTP响应).由Greg Higgins和Carlos Sanchez报道。现在报告了测试的代码覆盖率 coveralls.io .
1.1B4(2015年9月4日)#
即使启用了python解释器优化,也会检测并引发几种重要编程错误类型的错误。
-O或PYTHONOPTIMIZE. 以前,如果启用了优化,就不会检测到这些问题,这可能导致不稳定、难以调试的行为。修复一个
AttributeError从gevent.queue.Queue什么时候?peek在一个空的Queue. 报告时间: issue #643 作者:Michaelvol。制作
SIGCHLD指定给的处理程序gevent.signal.signal()使用默认情况下使用的子观察程序。也制造gevent.os.waitpid()使用-1的第一个参数。(也适用于相应的monkey-patched stdlib函数。)由gunicorn的用户指出。在python 2下,当使用
socket.makefile. 报告时间: issue #644 卡兰·里昂。
1.1B3(2015年8月16日)#
修复一个
AttributeError从gevent.monkey.patch_builtins在python 2上 future 库也已安装。卡洛斯·桑切斯报道。Pypy:修复A
DistutilsModuleError或ImportError如果CFFI模块支持gevent.core在初始化集线器时需要编译(由于丢失或无效__pycache__目录)。现在,模块将在导入gevent时自动编译(这可能会在stdout上生成编译器输出)。报告时间: issue #619 通过Thinh Nguyen和 issue #631 安迪·弗里兰,杰伊·奥斯特和马特·杜普的贡献。Pypy:提高
gevent.socket.socket:sendall输入量大。 bench_sendall.py 现在在Pypy上的性能和在Cpython上的性能差不多,提高了10倍(从~60MB/s到~630MB/s)。看看这个 pypy bug 有关详细信息。修复一个可能的
TypeError打电话时gevent.socket.wait. Lanstin在635年报告。gevent.socket.socket:sendto正确地尊重套接字的阻塞状态(这意味着它现在可以在以前没有的情况下引发ewouldBlock)。报告时间: pull request #634 作者:迈克·卡普林斯基。使用的常见查找错误
threaded resolver不再总是打印到stderr,因为它们通常超出程序员的控制范围并被显式捕获。(编程错误如TypeError仍在打印。)报告 issue #617 作者:杰伊·奥斯特和卡洛斯·桑切斯。Pypy:修复A
TypeError从gevent.idle(). 报告时间: issue #639 由Chilun2008。这个
imap_unordered()类池对象的方法支持maxsize用于限制等待使用者的缓冲结果数的参数。报告时间: issue #638 西尔文·齐默。班级
gevent.queue.Queue现在不断地命令多个阻塞等待put和get呼叫者按他们到达的顺序。以前,由于实现的奇怪,这通常在cpython下是大致如此,但在pypy下不是。现在他们的行为都一样了。班级
gevent.queue.Queue现在支持len()功能。
1.1B2(2015年8月5日)#
启用使用
c-ares resolver在派比手下。请注意,它的性能特性可能是次优的。在某些平台(尤其是64位Linux上的2.6.0)上,启用
gevent.monkey.patch_builtins可能导致Pypy崩溃。报告时间: issue #618 杰伊·奥斯特。gevent.kill()在目标greenlet中引发正确的异常。报告时间: issue #623 作者:乔纳森·卡门斯。Windows上的各种修复程序。报告时间: issue #625 , issue #627 和 issue #628 作者:Jacekt和袁腾(Jeff)Pei。固定在 pull request #624 .
添加
readable()和writable()方法到FileObjectPosix;这修复了在monkey修补时python 3上的help()。
1.1B1(2015年7月17日)#
setup.py可以从包含空格的目录运行。报告时间: issue #319 伊万·斯米尔诺夫。setup.py可以在OSX上使用clang的新版本进行构建。它们加强了cflags和cppflags之间的区别。gevent.lock.Semaphore在Pypy上是原子的,就像在Cpyton上一样。这在Pypy上的性能成本很低。修复了未能设置
successful在运行greenlet之前杀死它时,值为false,并带有非默认异常。固定在 pull request #608 作者:Heungsub Lee。利贝夫的儿童观察者
os.waitpid()由于在POSIX平台上使用信号而变得不可靠。这在使用时尤其明显gevent.subprocess与multiprocessing. 现在,猴子修补了os模块提供waitpid()旨在改善这一状况的职能。报告时间: issue #600 由Champax和 issue #452 作者:Ukasz Kawczy_ski。在实现的平台上
select.poll,提供一个Gevent友好型gevent.select.poll以及相应的猴子补丁。实施于 pull request #604 埃迪·林德。允许将事件传递到pypy下的IO回调。报告时间: issue #531 作者:M.Nunberg,于 pull request #604 .
gevent.thread.allocate_lock()(于是一个猴子修补的标准库allocate_lock())更接近于内置的行为:无法释放未锁定的锁,尝试这样做会引发正确的异常 (thread.error在python 2上,RuntimeError在python 3上)。以前,过度释放锁被静默地忽略。报告时间: issue #308 作者:J_Drzej Nowak。gevent.fileobject.FileObjectThread使用threadpool关闭下划线文件类对象。报告时间: issue #201 作者:维塔利·克鲁格。恶意或格式错误的HTTP分块传输编码数据发送到
pywsgi handler处理更为严格,导致“HTP400错误请求”响应,而不是500个错误,或者在最坏的情况下,服务器端挂起。报告时间: issue #229 作者:Bj_rn Lindqvist。导入标准库
threading模块 之前 使用gevent.monkey.patch_all()不再导致python 3.4无法获取repr主线程和其他cpython平台返回一个不可行的dummathread。(注意,不建议这样做。)报告于 issue #153 .在python 2下,使用
io要实现的包FileObjectPosix. 这将代码与Python3实现统一,并解决了使用seek(). 见 issue #151 .在python 2下,从多个greenlet中导入一个在顶层使用gevent阻塞函数的模块不再产生导入错误(python 3本机处理这种情况)。报告时间: issue #108 由Shaun和Sylvain Zimmer基于代码的初始修复。
gevent.spawn(),spawn_raw()和spawn_later()以及Greenlet构造器,立即产生有用的TypeErrors如果要求运行无法运行的内容。在此之前,繁殖的绿叶小菜会在未被捕获的情况下死去。TypeError第一次切换到。报告时间: issue #119 斯蒂芬。递归使用
ThreadPool.apply不再提高LoopExit错误(使用ThreadPool.spawn然后get结果仍然可以;您必须小心使用正确的集线器)。报告时间: issue #131 到5月8日。当
threading模块是monkey-patched,模块级锁定logging模块被设置为greenlet-aware,任何配置的处理程序的实例锁也是如此。这使得导入使用创建模块级别的标准模式的模块更加安全。Logger猴子修补前的实例。正在配置logging使用基本配置,然后猴子修补也更安全(但不包括涉及SocketHandler)修复猴子修补
threading.RLock在python 3下。在python 3中,在由另一个模块导入的模块的顶层进行monkey修补可能会导致
RuntimeError从importlib. 报告时间: issue #615 作者:丹尼尔·米兹里基。(如果threading.RLock是围绕着猴子打补丁的电话进行的;这不太可能,但用进口挂钩也不可能。)修复在64位平台上运行时为32位python配置C-ares的问题。报告时间: issue #381 固定在 pull request #616 克里斯·莱恩。附加修复 pull request #626 作者:陈凯文。
(实验)让
pywsgi.WSGIServer接受logging.Logger其实例log和(新)error_log参数。如果尝试这样做,请注意系统在进程生命周期的早期就完全进行了猴子补丁,并注意,尚未测试非文件处理程序。修正 issue #106 .
1.1a2(2015年7月8日)#
gevent.threadpool.ThreadPool.imap和imap_unordered现在接受多个iterables。(实验)使用
ThreadPool或Group映射/应用程序函数现在应该具有原始的回溯。gevent.threadpool.ThreadPool.apply()now raises any exception raised by the called function, the same asGroup/Pool还有内置的apply()功能。这会使没有证件的人apply_e功能。原始pr issue #556 罗伯特·埃斯特尔。猴子修补
selectors模块从patch_all和patch_select在python 3.4上。见 issue #591 .的附加查询函数
gevent.monkey模块允许知道修补了什么。在中讨论 issue #135 并在 pull request #325 内森·霍德。在python 2.7.9或更高版本或python 3下的非monkey补丁环境中,使用gevent ssl套接字可能导致greenlet阻塞。见 issue #597 大卫·福特。
gevent.socket.socket.sendall()支持实现缓冲区协议的任意对象(如CTypes结构),就像本机套接字一样。报告时间: issue #466 作者:Tzickel。增加了对
onerrorcffi 1.2.0中存在的属性用于在pypy下更好地处理信号。感谢Armin Rigo和Omer Katz。(请参阅https://bitback.org/cffi/cffi/issue/152/handling-errors-from-signal-handlers-in)这个
gevent.subprocess模块的行为更接近于Python3下的标准库,至少在POSIX上是如此。这个pass_fds,restore_signals和start_new_session现在实现了参数,正如timeout各种功能的参数。在python 2下,以前未记录的timeout参数到Popen.communicate引发一个类似于其python 3对应的异常。用启动子进程的异常
gevent.subprocess模块不再泄漏文件描述符。报告时间: pull request #374 陈小玉。这个例子
echoserver.py不再绑定到标准x11 TCP端口。报告时间: issue #485 以分钟为单位。gevent.iwait()不再投掷LoopExit如果调用者在返回值之间切换greenlet。报告和初始补丁 issue #467 作者:亚历克赛·博岑科夫。默认的threadpool和默认的线程分解器在分叉的子进程中工作,例如
multiprocessing.Process. 以前,子进程将无限期挂起。报告时间: issue #230 作者:LX Yu。fork观察程序更可能(最终)在多线程程序中被调用(在Windows上除外)。见 issue #154 .
gevent.killall()接受一个任意不可杀死的绿小子。报告时间: issue #404 由Martin Bachwerk编写;与旧版本的简单请求结合使用。gevent.local.local对象现在可以在greenlet运行完成后立即进行垃圾收集,以匹配内置的行为threading.local(本机实现时)。报告时间: issue #387 由Ausiv提供。杀了一个格林莱特
gevent.kill()或gevent.Greenlet.kill())在它实际启动并切换到now之前,将阻止greenlet运行,而不是在稍后切换到时引发异常。见 issue #330 乔纳森卡门斯报道。
1.1A1(2015年6月29日)#
添加对python 3.3和3.4的支持。许多人为此作出了贡献,包括但不限于Fantix King、Hashstat、Elizabeth Myers、Jander、Luke Woydziak等。见 issue #38 .
添加对pypy的支持。见 issue #248 . 请注意,为了获得最佳效果,您需要一个非常新的Pypy构建,包括CFFI 1.2.0。
放下对python 2.5的支持。python 2.5用户可以继续使用gevent 1.0.x。
固定
gevent.joinall()不忽略count什么时候?raise_error是假的。见 pull request #512 伊万·迪奥。固定
gevent.subprocess.Popen不要忽视bufsize参数。请注意,这会更改(依赖于平台的)默认值,通常从Buffered更改为UnBuffered。见 pull request #542 罗穆拉德·布鲁内。将C-ARES升级到1.10.0。见 pull request #579 作者:奥马尔·卡茨。
小心
C战神
configure脚本现在对环境变量(如CFLAGS和LDFLAGS它们可能需要修改(例如,CFLAGS不再允许包含-I指令,必须放在CPPFLAGS)添加
count参数gevent.iwait(). 见 pull request #482 作者:Wiggin15。添加
timeout参数gevent.queue.JoinableQueue.join()现在返回是否等待所有项目。gevent.queue.JoinableQueue对待items传递给__init__就像未完成的任务一样put. 首字母 pull request #554 杜尔松。gevent.pywsgi不再为过早断开客户端连接的正常情况打印调试信息。见 issue #136 ,固定在 pull request #377 保罗·科利尔。(实验性的)等待或从提出异常的greenlet获得结果现在通常会引发原始的回溯。这应该有助于像哨兵这样的人跟踪最初的问题。见 issue #450 和 issue #528 由Rodolfo和Eddi Linder和 issue #240 埃里克·艾里克。
升级至libev 4.20。见 pull request #590 作者:Peter Renstr_m.
固定
gevent.baseserver.BaseServer当其handle函数本身就是一个InstanceMethod。见 pull request #501 乔·杰夫尼克。使
acquire方法gevent.lock.DummySemaphore始终返回true,将其用例支持为“无限”或无限信号量,不提供排除,并允许使用if sem.acquire(): .... 见 pull request #544 作者:穆阿德·本奇奥伊。补丁
subprocess默认在gevent.monkey.patch_all. 见 issue #446 .gevent.pool.Group.imap和imap_unordered现在接受多个iterables,比如itertools.imap. issue #565 托马斯·斯坦纳报道。兼容性说明 :
gevent.baseserver.BaseServer及其子类gevent.server.StreamServer现在,当请求处理程序返回时,确定地关闭客户机套接字。以前,套接字是留给垃圾收集器的;在cpython 2.x下,这意味着当最后一个引用消失时,这通常是,但不一定是,当请求处理程序返回时,但在pypypy下,它是将来的某个任意点,在cpython 3.x下是一个资源。无法生成CEWarning。这是未记录的行为,在请求处理程序意外或故意返回之后,客户机套接字可以保持打开状态。兼容性说明 :
pywsgi现在确保头可以用拉丁语1(ISO-8859-1)编码。这提高了对HTTP标准的遵从性(并且在Python3下是必需的)。在某些情况下,以前的版本可能允许发送非ISO-8859-1头文件,但不知道合格接收者对这些文件的解释;现在,将引发一个单代码错误。见 issue #614 .