13个不稳定版本 (3个破坏性更新)

0.3.0 2024年7月4日
0.1.0 2024年5月8日
0.0.10 2024年3月30日
0.0.8 2023年12月20日
0.0.0 2022年11月1日

#25 in HTTP客户端

Download history 400/week @ 2024-05-04 244/week @ 2024-05-11 474/week @ 2024-05-18 285/week @ 2024-05-25 528/week @ 2024-06-01 298/week @ 2024-06-08 231/week @ 2024-06-15 178/week @ 2024-06-22 201/week @ 2024-06-29 102/week @ 2024-07-06 99/week @ 2024-07-13 67/week @ 2024-07-20 206/week @ 2024-07-27 200/week @ 2024-08-03 238/week @ 2024-08-10 112/week @ 2024-08-17

每月下载量 760次
4个crate中使用(通过salvo_core

MIT许可协议

685KB
15K SLoC

h3

异步HTTP/3实现。

License: MIT CI Discord chat

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

状态

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

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

Duvet

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

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

功能

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

概述

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

入门指南

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

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

服务器

let (endpoint, mut incoming) = http3_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 = http3_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中进行了测试,以在quic-interop-runner中进行互操作性和性能测试。您可以在(https://interop.seemann.io/)查看结果。

许可证

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

依赖关系

~6–15MB
~181K SLoC