1 个不稳定版本
0.0.6-alpha1 | 2024 年 2 月 4 日 |
---|
#9 在 #quinn
每月 37 次下载
在 kvarn 中使用
665KB
15K SLoC
h3
临时 Kvarn 分支将在 Quinn 0.11 发布并支持 rustls 0.22 时被移除。
一个异步 HTTP/3 实现。
这个 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 传输实现
入门
示例目录可以通过两种方式帮助您入门:
- 提供了可立即使用的
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
互操作性
此软件包以及 quic 实现已在 quinn、s2n-quic 中进行过互操作性和性能测试。您可以在 quic-interop-runner 中查看结果。结果可以在 (https://interop.seemann.io/) 中查看。
许可证
h3 在 MIT 许可证下提供。请参阅 LICENSE。
依赖项
~6–15MB
~185K SLoC