#quic #http-3 #client-server #h3 #transport #quinn #server-api

kvarn-h3-quinn

临时 Kvarn 分支:基于 Quinn 的 QUIC 传输实现

1 个不稳定版本

0.0.6-alpha12024 年 2 月 4 日

#9#quinn

每月 37 次下载
kvarn 中使用

MIT 许可证

665KB
15K SLoC

h3

临时 Kvarn 分支将在 Quinn 0.11 发布并支持 rustls 0.22 时被移除。

一个异步 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 模块中的 traits 进行 QUIC 传输抽象
  • 运行时独立(h3 不创建任务并与任何运行时一起工作)
  • 目前支持的 QUIC 实现包括 Quinn (h3-quinn) 和 s2n-quic (s2n-quic-h3)

概述

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

入门

示例目录可以通过两种方式帮助您入门:

  • 提供了可立即使用的 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 中进行过互操作性和性能测试。您可以在 quic-interop-runner 中查看结果。结果可以在 (https://interop.seemann.io/) 中查看。

许可证

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

依赖项

~6–15MB
~185K SLoC