服务员 WSGI 服务器
项目描述
Waitress 是一个生产质量的纯 Python WSGI 服务器,具有非常可接受的性能。除了存在于 Python 标准库中的之外,它没有依赖项。它在 Python 3.7+ 下的 Unix 和 Windows 上的 CPython 上运行。它还可以在 UNIX 上的 PyPy 3(兼容 3.7 版的 python)上运行。它支持 HTTP/1.0 和 HTTP/1.1。
有关更多信息,请参阅 Waitress 包的“docs”目录或访问 https://docs.pylonsproject.org/projects/waitress/en/latest/
2.1.2
错误修复
当启用expose_tracebacks 时,女服务员将无法正确编码unicode,从而在错误处理期间导致另一个错误。见 https://github.com/Pylons/waitress/pull/378
当通过多个套接字读取接收到数据时,标头长度检查的计算不正确。此计算已更正,Waitress 将不再发回 413 Request Entity Too Large。见https://github.com/Pylons/waitress/pull/376
安全漏洞修复
在 2.1.0 中引入了一个新特性,允许 WSGI 线程开始向套接字发送数据。然而,这引入了一种竞争条件,即当主线程即将调用 select() 时,发送线程中的套接字可能会关闭,从而导致整个应用程序被关闭。Waitress 将不再关闭 WSGI 线程中的套接字,而是唤醒主线程进行清理。见https://github.com/Pylons/waitress/pull/377
2.1.1
安全漏洞修复
Waitress 现在验证分块编码扩展是否有效,并且不包含不允许的无效字符。它们仍然被跳过/未处理,但如果它们包含无效数据,我们将不再继续并返回 400 Bad Request。这可以阻止潜在的 HTTP 异步/HTTP 请求走私。感谢张泽宇报告此问题。见 https://github.com/Pylons/waitress/security/advisories/GHSA-4f7p-27jc-3c36
Waitress 现在在解析分块编码时验证块长度仅是有效的十六进制数字,并且不再支持诸如0x01和+01之类的值。这可以阻止潜在的 HTTP 异步/HTTP 请求走私。感谢张泽宇报告此问题。见 https://github.com/Pylons/waitress/security/advisories/GHSA-4f7p-27jc-3c36
Waitress 现在验证远程发送的 Content-Length 是否仅包含符合 RFC7230 的数字,并且当 Content-Length 标头包含无效数据时将返回 400 Bad Request,例如+10之前会被解析为10并被接受。这阻止了潜在的 HTTP 不同步/HTTP 请求走私 感谢张泽宇报告此问题。见 https://github.com/Pylons/waitress/security/advisories/GHSA-4f7p-27jc-3c36
2.1.0
Python 版本支持
Waitress 不再支持 Python 3.6
Waitress 完全支持 Python 3.10
错误修复
wsgi.file_wrapper现在从底层文件设置seekable、seek和tell 属性(如果底层文件是可搜索的)。这允许 WSGI 中间件实现诸如范围请求之类的东西
见https://github.com/Pylons/waitress/issues/359和 https://github.com/Pylons/waitress/pull/363
在 Python 3中, OSError不再是可下标的,这导致 Windows 尝试循环查找可在触发器中使用的套接字时失败。
修复了BytesIO对象未正确关闭的问题,因此在垃圾收集解决它之前不会被清理。
这可能导致随机内存峰值/内存问题,请参阅 https://github.com/Pylons/waitress/pull/358和 https://github.com/Pylons/waitress/issues/357。
感谢 Florian Schulze 测试/验证此修复程序!
特征
当 WSGI 应用程序开始向输出缓冲区发送数据时,我们现在尝试将数据直接发送到套接字。这避免了需要唤醒主线程来开始发送数据。允许更快地传输第一个字节。见https://github.com/Pylons/waitress/pull/364
感谢 Michael Merickel 是一只很棒的橡皮鸭!
将 REQUEST_URI 添加到 WSGI 环境。
REQUEST_URI 类似于nginx 中的request_uri。它是一个字符串,在分隔查询字符串和解码%转义字符之前包含请求路径。