2个版本

0.3.15 2023年2月4日
0.3.14 2022年10月1日

#338 in HTTP客户端

Download history 300/week @ 2024-03-13 306/week @ 2024-03-20 366/week @ 2024-03-27 456/week @ 2024-04-03 422/week @ 2024-04-10 511/week @ 2024-04-17 673/week @ 2024-04-24 342/week @ 2024-05-01 476/week @ 2024-05-08 419/week @ 2024-05-15 685/week @ 2024-05-22 338/week @ 2024-05-29 347/week @ 2024-06-05 259/week @ 2024-06-12 353/week @ 2024-06-19 393/week @ 2024-06-26

1,371 每月下载量
用于 15 个Crate(直接使用2个)

MIT 许可证

745KB
17K SLoC

WebAssembly的H2

一个Tokio感知的HTTP/2客户端和服务器实现。编译为WebAssembly。

功能

  • 客户端和服务器HTTP/2实现。
  • 实现了完整的HTTP/2规范。
  • 通过 h2spec
  • 注重性能和正确性。
  • 基于 Tokio 构建。

非目标

该Crate的目的是仅实现HTTP/2规范。它不处理

  • 管理TCP连接
  • HTTP 1.0 升级
  • TLS
  • HTTP/2规范未描述的任何功能。

该Crate现在被 hyper 使用,它将提供所有这些功能。

用法

要使用 h2,首先将以下内容添加到您的 Cargo.toml

[dependencies]
h2_wasi = "0.3"

接下来,将以下内容添加到您的Crate

extern crate h2;

use h2::server::Connection;

fn main() {
    // ...
}

lib.rs:

异步HTTP/2服务器和客户端实现。

该库实现了 HTTP/2 规范。实现是异步的,使用 futures 作为API的基础。实现也解耦了TCP或TLS的细节。用户必须自行处理ALPN和HTTP/1.1升级。

入门

将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
h2 = "0.3"

布局

Crate被分为 clientserver 模块。同时适用于客户端和服务器的基本类型位于Crate的根目录。

有关如何使用 h2 的更多详细信息,请参阅模块级别的文档。

握手

客户端和服务器都需要确保连接处于就绪状态,以便开始HTTP/2握手。这个库不提供进行此操作的功能。

有三种方法可以达到开始HTTP/2握手所需的状态。

  • 打开一个HTTP/1.1连接并执行升级
  • 使用TLS打开连接并使用ALPN协商协议。
  • 打开一个预先知道的连接,即客户端和服务器假设一旦打开连接,连接就立即准备好开始HTTP/2握手。

一旦连接准备好开始HTTP/2握手,可以将其传递给server::handshakeclient::handshake。在此阶段,库将启动握手过程,该过程包括

  • 客户端发送连接序言(一个预定义的24个八位字节序列)。
  • 客户端和服务器发送一个SETTINGS帧。

有关更多详细信息,请参阅规范中的启动HTTP/2

流量控制

流量控制是HTTP/2的一个基本功能。《code>h2库将流量控制暴露给用户。

HTTP/2客户端或服务器不能无限地向对等方发送数据。当一个流被启动时,客户端和服务器都会为该流提供一个初始窗口大小。窗口大小是端点可以向对等方发送的字节数。在任何时候,对等方都可以通过发送一个WINDOW_UPDATE帧来增加这个窗口大小。一旦客户端或服务器已发送数据填满流的窗口,在该流上就不再发送进一步的数据,直到对等方增加窗口。

还有一个控制所有流上发送的数据的**连接级别**窗口。

通过FlowControl管理传入数据的流量控制。通过SendStream管理传出数据的流量控制。有关这两个类型的更多详细信息,请参阅结构级别文档。

依赖关系

~5–17MB
~148K SLoC