1 个不稳定版本

0.1.0 2023 年 11 月 6 日

#16 in #h3

Download history 234/week @ 2024-04-07 184/week @ 2024-04-14 210/week @ 2024-04-21 192/week @ 2024-04-28 200/week @ 2024-05-05 208/week @ 2024-05-12 126/week @ 2024-05-19 134/week @ 2024-05-26 169/week @ 2024-06-02 153/week @ 2024-06-09 206/week @ 2024-06-16 304/week @ 2024-06-23 151/week @ 2024-06-30 221/week @ 2024-07-07 143/week @ 2024-07-14 232/week @ 2024-07-21

752 次每月下载

MIT/Apache

660KB
15K SLoC

h3

异步 HTTP/3 实现。

License: MIT CI Discord chat

此软件包提供了一个通用的 HTTP/3 实现,它适用于提供的 QUIC 传输。这使得项目可以专注于 HTTP/3,同时让用户根据其特定需求选择 QUIC 实现。它包括客户端和服务器 API。有关更多详细信息,请查看原始的 设计

状态

h3 软件包仍然非常实验性。虽然客户端和服务器可以正常工作,但仍可能存在错误。API 可能会随着我们继续探索而发生变化。尽管如此,我们热切欢迎贡献、在测试环境中尝试并自行承担风险。

最终目标是将 h3 作为 hyper 的内部依赖项。

Duvet

此软件包使用 duvet 软件包 检查与 规范 的合规性。
生成的 报告 显示了规范要求的当前状态。

有关此工具的更多信息,请参阅 贡献文档

特性

  • HTTP/3 客户端和服务器实现
  • 仅异步 API
  • 通过 quic 模块中的特质实现 QUIC 传输抽象
  • 运行时独立(h3 不创建任务,与任何运行时一起工作)
  • 目前支持的 QUIC 实现包括 Quinn (h3-quinn) 和 s2n-quic (s2n-quic-h3)

概述

  • h3 HTTP/3 实现
  • h3-quinn 基于 Quinn 的 QUIC 传输实现

入门

examples 目录中,有两种方式可以帮助您入门:

  • 提供了可供使用的 clientserver 二进制文件,用于与其他 HTTP/3 对等方交互。请查看该目录中的 README 文件。
  • 这些示例的源代码可以帮助您了解如何将 h3 作为客户端或服务器使用。

服务器

let (endpoint, mut incoming) = h3_quinn::quinn::Endpoint::server(server_config, "[::]:443".parse()?)?;

while let Some((req, stream)) = h3_conn.accept().await? {
    loop {
        match h3_conn.accept().await {
            Ok(Some((req, mut stream))) => {
                let resp = http::Response::builder().status(Status::OK).body(())?;
                stream.send_response(resp).await?;

                stream.send_data(Bytes::new("It works!")).await?;
                stream.finish().await?;
            }
            Ok(None) => {
                 break;
            }
            Err(err) => {
                match err.get_error_level() {
                    ErrorLevel::ConnectionError => break,
                    ErrorLevel::StreamError => continue,
                }
            }
        }
    }
}
endpoint.wait_idle();

您可以在 examples/server.rs 中找到完整的服务器示例

客户端

let addr: SocketAddr = "[::1]:443".parse()?;

let quic = h3_quinn::Connection::new(client_endpoint.connect(addr, "server")?.await?);
let (mut driver, mut send_request) = h3::client::new(quinn_conn).await?;

let drive = async move {
    future::poll_fn(|cx| driver.poll_close(cx)).await?;
    Ok::<(), Box<dyn std::error::Error>>(())
};

let request = async move {
    let req = http::Request::builder().uri(dest).body(())?;

    let mut stream = send_request.send_request(req).await?;
    stream.finish().await?;

    let resp = stream.recv_response().await?;

    while let Some(mut chunk) = stream.recv_data().await? {
        let mut out = tokio::io::stdout();
        out.write_all_buf(&mut chunk).await?;
        out.flush().await?;
    }
    Ok::<_, Box<dyn std::error::Error>>(())
};

let (req_res, drive_res) = tokio::join!(request, drive);
req_res?;
drive_res?;

client_endpoint.wait_idle().await;

您可以在 examples/client.rs 中找到完整的客户端示例

QUIC 通用

如前所述,这个库的目标是在 QUIC 实现上具有通用性。为此,存在与 QUIC 库的集成

互操作性

这个 crate 以及 quic 实现都在 quic-interop-runner 中进行了互操作性和性能测试(quinns2n-quic)。您可以在 (https://interop.seemann.io/) 上查看结果。

许可证

h3 在 MIT 许可证下提供。请参阅 LICENSE


lib.rs:

提供 WebTransport 会话的客户端和服务器支持。

相关链接

WebTransport: https://www.w3.org/TR/webtransport/#biblio-web-transport-http3 WebTransport over HTTP/3: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3/

依赖关系

~3.5–5MB
~78K SLoC