PEP 268 – 扩展 HTTP 功能和 WebDAV
- 作者:
- Greg Stein <gstein at lyra.org>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建:
- 2001年8月20日
- Python 版本:
- 2.x
- 发布历史:
- 2001年8月21日
拒绝通知
此 PEP 已被拒绝。自提议以来六年,它未能获得足够的社区支持。
摘要
此 PEP 讨论了 Python 的 HTTP 支持的新模块和扩展功能。值得注意的是,添加了认证请求、代理支持、认证代理使用和 WebDAV 功能。
基本原理
Python 因其“自带电池”的定位而广受欢迎。其中一个使用最广泛的协议,HTTP(参见RFC 2616),多年来一直包含在 Python 中(httplib
)。但是,此支持尚未满足许多基于 HTTP 的应用程序和系统的全部需求。此外,基于 HTTP 的新协议,如 WebDAV 和 XML-RPC,变得越来越有用,并且使用量不断增加。提供此功能符合 Python 的“自带电池”角色,并使 Python 保持在最新技术的领先地位。
虽然认证和代理支持是 Python 核心 HTTP 处理中缺少的两个非常显著的功能,但它们作为 Python 的 URL 处理的一部分得到了最小的处理(urllib
和 urllib2
)。但是,需要细粒度或复杂 HTTP 处理的应用程序无法在这些功能驻留在 urllib 中时使用它们。将这些功能重构到可以直接与 HTTP 连接相关联的位置将提高它们对 urllib 和复杂应用程序的实用性。
此 PEP 的动机来自一些直接请求这些功能的人,以及 SourceForge 上的一些功能请求。由于要提供的模块的确切形式以及使用的类/架构可能会受到争论,因此创建了此 PEP 以为此类讨论提供一个焦点。
规范
将向标准库添加两个模块:httpx
(HTTP 扩展功能)和 davlib
(WebDAV 库)。
[ 欢迎提供模块名称建议;davlib
有一些先例,但类似 webdav
的名称可能更理想 ]
HTTP 认证
httpx
模块将提供一个混合类,用于执行 HTTP 认证(用于代理和源服务器认证)。此混合类(httpx.HandleAuthentication
)可以与 HTTPConnection
和 HTTPSConnection
类结合使用(此混合类可能与 HTTP 和 HTTPS 兼容类一起工作,但这并非必需)。
此混合类将认证过程委托给一个或多个“认证器”对象,允许多个连接共享认证器。使用单独的对象允许与认证系统(例如 LDAP)建立长期连接。将提供用于 Basic 和 Digest 机制的认证器(参见RFC 2617)。用户提供的认证器子类可以注册并由连接使用。
一个“凭据”对象(httpx.Credentials
)也与混合类相关联,并存储认证器所需的凭据(例如用户名和密码)。可以创建 Credentials 的子类来保存其他信息(例如 NT 域)。
混合类覆盖了 getresponse()
方法以检测 401 (Unauthorized)
和 407 (Proxy Authentication Required)
响应。找到此响应时,响应对象、连接和凭据将传递给与响应中指定的认证方案相对应的认证器(如果响应中有多个方案,则按安全性降序尝试多个认证器)。每个认证器都可以检查响应头并决定是否以及如何使用正确的认证头重新发送请求。如果没有任何认证器能够成功处理认证,则会引发异常。
使用适当的凭据重新发送请求是认证系统中比较困难的部分之一。困难在于记录最初发送的内容:请求行、头和正文。通过覆盖 putrequest、putheader 和 endheaders,我们可以捕获除正文之外的所有内容。一旦调用 endheaders 方法,我们就会捕获对 send() 的所有调用(直到下一个 putrequest 方法调用)以保存正文内容。混合类将对以这种方式保存的数据量设置可配置的限制(例如,仅保存最多 100k 的正文内容)。假设已存储整个正文,那么我们就可以使用适当的认证信息重新发送请求。
如果正文太大而无法存储,则 getresponse()
只会返回响应对象,指示 401 或 407 错误。由于认证信息已计算并缓存(到 Credentials 对象中;请参见下文),因此调用者可以简单地重新生成请求。混合类将附加适当的凭据。
“保护空间”(参见RFC 2617,第 1.2 节)定义为主机、端口和认证域的元组。当最初向 HTTP 服务器发送请求时,我们不知道认证域(只有在认证失败时才会返回域)。但是,我们确实拥有来自 URL 的路径,这对于确定要发送到服务器的凭据很有用。Basic 认证方案通常按层次结构设置:/path
的凭据可以尝试用于 /path/subpath
。Digest 认证方案对分层设置有明确的支持。httpx.Credentials
对象将存储多个保护空间的凭据,并且可以通过两种不同的方式查找
- 使用
(host, port, path)
查找 – 此查找方案用于在生成我们不知道认证域的路径的请求时使用。 - 使用
(host, port, realm)
查找 – 此机制在认证过程中使用,此时服务器已指定 Request-URI 位于特定域内。
HandleAuthentication
混合类将覆盖 putrequest()
以自动插入凭据(如果可用)。putrequest 中的 URL 用于确定要使用的适当认证信息。
还需要注意的是,使用了两种凭据集,并由混合类存储。一组用于可能使用的任何代理,另一组用于目标源服务器。由于代理没有路径,因此代理凭据中的保护空间将始终使用“/”进行存储和通过路径查找。
代理处理
httpx
模块将提供一个混合类,用于使用代理执行 HTTP(S) 操作。此混合类(httpx.UseProxy
)可以与 HTTPConnection
和 HTTPSConnection
类结合使用(此混合类可能与 HTTP 和 HTTPS 兼容类一起工作,但这并非必需)。
混合类将记录要使用的代理的 (host, port)
。XXX 将被覆盖以使用此主机/端口组合进行连接,并将请求 URL 重写为引用源服务器的绝对 URI(这些 URI 传递给代理服务器)。
代理认证由 httpx.HandleAuthentication
类处理,因为用户可以直接使用 HTTP(S)Connection
与代理通信。
WebDAV 功能
davlib
模块将提供一个混合类,用于向启用 WebDAV 的服务器发送 WebDAV 请求。此混合类(davlib.DAVClient
)可以与 HTTPConnection
和 HTTPSConnection
类结合使用(此混合类可能与 HTTP 和 HTTPS 兼容类一起工作,但这并非必需)。
此混合类提供方法来执行 HTTP 中定义的各种 HTTP 方法RFC 2616,以及 WebDAV 中定义的各种 HTTP 方法RFC 2518。
自定义响应对象用于解码 207 (Multi-Status)
响应。响应对象将使用标准库的 xml 包来解析 multistatus XML 信息,生成一个简单的对象结构来保存 multistatus 数据。将按速度降序尝试/使用多种解析方案。
参考实现
实际(未来/最终)实现正在 /nondist/sandbox/Lib
目录中开发,直到它被接受并移入主 Lib 目录。
版权
本文档已进入公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0268.rst