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 在 RFC 2616 中定义以及 WebDAV 在 RFC 2518 中定义的各种 HTTP 方法。
自定义响应对象用于解码 207 (Multi-Status) 响应。响应对象将使用标准库的 xml 包来解析多状态 XML 信息,生成一个简单的对象结构来保存多状态数据。将尝试/使用多种解析方案,按速度递减的顺序。
参考实现
实际的(未来/最终)实现正在 /nondist/sandbox/Lib 目录中开发,直到它被接受并移动到主 Lib 目录。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0268.rst
最后修改时间:2025-02-01 08:55:40 GMT