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 网络编程
20,369 每月下载量
用于 35 个crate (13 直接)
665KB
15K SLoC
h3
一个异步HTTP/3实现。
这个crate提供了一个通用的HTTP/3实现,它基于提供的QUIC传输。这使得项目可以专注于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传输实现
入门
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
互操作性
此存储库以及QUIC实现已在quinn、s2n-quic中进行互操作性和性能测试。您可以在https://interop.seemann.io/查看结果。
许可证
h3在MIT许可证下提供。请参阅LICENSE。
依赖项
~6–15MB
~183K SLoC