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客户端
每月下载量 760次
在4个crate中使用(通过salvo_core)
685KB
15K SLoC
h3
异步HTTP/3实现。
此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目录中,有几种方法可以帮助您入门:
- 提供了现成的
client
和server
二进制文件,可以与其他 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库的集成
h3-quinn
:在同一个存储库中。s2n-quic-h3
互操作性
此存储库以及QUIC实现已在quinn、s2n-quic中进行了测试,以在quic-interop-runner中进行互操作性和性能测试。您可以在(https://interop.seemann.io/)查看结果。
许可证
h3提供在MIT许可证下。请参阅LICENSE。
依赖关系
~6–15MB
~181K SLoC