#request-headers #async #http-request #async-client #http #client

aahc

异步、无内存分配的HTTP客户端,与执行器选择无关

1 个不稳定版本

0.1.0 2020年10月25日

#344 in HTTP客户端

GPL-3.0-only

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)]。它的依赖项是httparsefutures-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