8个版本

0.0.7 2024年7月1日
0.0.6 2024年5月20日
0.0.5 2024年1月24日
0.0.4 2023年10月23日
0.0.1 2023年3月9日

#723 in 网络编程

Download history 3737/week @ 2024-05-04 3372/week @ 2024-05-11 3801/week @ 2024-05-18 3126/week @ 2024-05-25 5642/week @ 2024-06-01 4594/week @ 2024-06-08 4399/week @ 2024-06-15 3893/week @ 2024-06-22 3788/week @ 2024-06-29 3489/week @ 2024-07-06 3496/week @ 2024-07-13 5048/week @ 2024-07-20 4167/week @ 2024-07-27 4675/week @ 2024-08-03 5605/week @ 2024-08-10 4906/week @ 2024-08-17

20,369 每月下载量
用于 35 个crate (13 直接)

MIT 许可证

665KB
15K SLoC

h3

一个异步HTTP/3实现。

License: MIT CI Discord chat

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

状态

h3 crate仍然非常实验性。虽然客户端和服务器可以正常工作,但可能仍然存在错误。并且API可能会随着我们的进一步探索而更改。尽管如此,我们热切欢迎贡献,尝试在测试环境中使用,并自行承担风险。

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

Duvet

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

贡献文档中了解更多关于此工具的信息。

特性

  • HTTP/3客户端和服务器实现
  • 仅异步API
  • 通过quic模块中的特质实现QUIC传输抽象
  • 与运行时无关(h3不会生成任务,与任何运行时一起工作)
  • 目前支持的QUIC实现包括Quinnh3-quinn)和s2n-quics2n-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库的集成

互操作性

此存储库以及QUIC实现已在quinns2n-quic中进行互操作性和性能测试。您可以在https://interop.seemann.io/查看结果。

许可证

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

依赖项

~6–15MB
~183K SLoC