1 个不稳定版本
0.1.0 | 2023 年 11 月 6 日 |
---|
#16 in #h3
752 次每月下载
660KB
15K SLoC
h3
异步 HTTP/3 实现。
此软件包提供了一个通用的 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 目录中,有两种方式可以帮助您入门:
- 提供了可供使用的
client
和server
二进制文件,用于与其他 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 库的集成
h3-quinn
:在这个相同的存储库中。s2n-quic-h3
互操作性
这个 crate 以及 quic 实现都在 quic-interop-runner 中进行了互操作性和性能测试(quinn,s2n-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