1 个不稳定版本
0.1.0 | 2020年10月25日 |
---|
#344 in HTTP客户端
120KB
2K SLoC
概述
无差别的异步HTTP客户端(aahc)是一个轻量级的纯Rust异步HTTP/1.1客户端,不进行动态内存分配,不依赖于任何特定的异步执行器或执行器,不产生额外的线程。
设计目标
对执行器选择无差别
大多数其他异步HTTP客户端软件包都依赖于特定的异步运行时环境(通常是tokio或async-std,或者较少的是fibers)。其余的大部分都有功能标志,允许它们与两个或三个特定的执行器选择一起工作。aahc不依赖于任何特定的异步执行器或运行时环境,并且应该与任何提供套接字功能的执行器一起工作。这是通过要求用户提供用于发送HTTP请求的传输套接字来实现的,该套接字必须适合应用程序使用的异步运行时环境——在tokio中运行的应用程序会传入tokio套接字,在async-std中运行的应用程序会传入async-std套接字,在GTK中运行的应用程序会传入GLib套接字,依此类推。
无线程
我所知道的唯一真正无差别的异步HTTP客户端软件包是Isahc。Isahc通过启动一个辅助线程来执行I/O来实现这一目标。aahc不启动任何线程。
安全
aahc是#![forbid)]
。它的依赖项是httparse和futures-io,这两个都包含相对较少的不安全代码。
无内存分配
aahc在正常操作期间不执行任何堆分配。其底层的解析器httparse也不执行。注意,如果启用了detailed-errors
功能(这是默认设置),则一些错误会以堆分配的详细消息返回;如果禁用该功能,则这些错误会以较少的信息返回,但没有任何堆分配。
限制
HTTP/2+
aahc是一个HTTP/1.x客户端。它目前不支持HTTP/2+。
压缩
aahc目前不支持Transfer-Encoding
头中的HTTP压缩。
可以通过Content-Encoding
头进行压缩;作为端到端头(而不是跳转头),aahc认为Content-Encoding
是应用层的责任。
HTTP代理
SOCKS代理在传输层工作,在HTTP层之下。因此,应用可以连接到SOCKS代理,执行初始的SOCKS协商,并将生成的套接字传递给aahc。
使用CONNECT
方法的HTTP代理与SOCKS代理类似。因此,应用可以类似地连接到HTTP代理,执行初始的CONNECT
请求,并将生成的套接字传递给aahc。然而,aahc不支持自己发出CONNECT
请求,因此不能用于为其他消费者(或自身实例)提供CONNECT
风格的代理隧道。
不使用CONNECT
的HTTP代理由aahc支持。始终如一,应用负责创建和连接传输套接字,在这种情况下是连接到代理而不是原始服务器。然后应用可以提供绝对形式的请求目标,而不是源形式,这在与代理服务器通信时是合适的。
升级头
aahc不支持Upgrade
头。因此,它不能使用WebSocket。
1xx状态码
aahc目前忽略1xx(信息性)状态码。只将最终≥2xx的响应返回给应用。
尾部
aahc目前不支持在响应体后使用分块传输编码的尾部。应用不应在其请求头中设置TE: trailers
。
功能
详细错误
如果启用此功能,类型为InvalidData
的错误返回包含一个嵌套的错误对象,其中包含有关确切错误的更多详细信息;然而,由于std::io::Error
的实现,此类附加详细信息必须在堆上分配。如果禁用此功能,类型为InvalidData
的错误返回不包含嵌套错误对象。
依赖关系
~165KB