15 个版本 (4 个破坏性更新)
新 0.5.5 | 2024 年 8 月 18 日 |
---|---|
0.5.4 | 2024 年 8 月 4 日 |
0.5.2 | 2024 年 7 月 30 日 |
0.4.2 | 2024 年 7 月 28 日 |
0.1.2 | 2024 年 6 月 13 日 |
#238 在 HTTP 客户端
每月 1,015 次下载
49KB
1K SLoC
使用 hyper
作为 HTTP 客户端或服务器的最小封装和常用工具。
服务器
直接使用 hyper
作为 HTTP 服务器很简单,所以这里没有太多内容,主要是
- 生成常见响应的实用程序和
- 支持范围访问的静态文件服务方法(已在 Chrome 和 Firefox 中测试用于 HTTP 音频/视频媒体服务)
在我的经验中,与大型 HTTP 服务器框架相比,主要缺失的是路由器,即一个基于前缀的高效映射,以便匹配动态路径。
示例
async fn handle_req(state: Arc<State>, req: Request<Incoming>) -> Result<Response<Body>, Infallible> {
return Ok(response_200());
}
let mut listener = TcpSocket::bind(&addr)?;
while let Some((conn, _)) = listener.accept().await.ok() {
tokio::spawn({
let state = state.clone();
async move {
match async move {
hyper_util::server::conn::auto::Builder::new(
hyper_util::rt::TokioExecutor::new(),
)
.serve_connection(
hyper_util::rt::TokioIo::new(conn),
hyper::service::service_fn(move |req| handle_req(state, req)),
)
.await
.map_err(
|e| loga::err_with(
"Error serving HTTP on connection",
ea!(err = e.to_string()),
),
)?;
return Ok(()) as Result<(), loga::Error>;
}.await {
Ok(_) => (),
Err(e) => {
log.log_err(StandardFlag::Debug, e.context("Error serving connection"));
},
}
}
});
}
客户端
请求分为三个阶段,每个阶段都有相应的函数
-
建立连接(《connect》)。
这包括地址解析,包括 ipv4/ipv6 解析的“happy eyes”。
您可以重用此连接,或创建自己的连接池。除了这一点之外,没有连接管理。
-
发送请求并等待头部(《send》)
-
读取主体(《receive》)或(《receive_stream》)
有辅助方法结合上述 2 和 3
send_simple
post
post_json
原因
流行库的各种接口不安全类型,使得各种边缘情况的自定义行为难以实现或无法实现。实现很大,内部紧密耦合,维护者不倾向于不常见的用例。
这个库主要是我自己的消费,但我想让它对有类似愿景(可组合、最小抽象、最小泛型使用、最小宏使用)的其他人也有用。
依赖项
~22–34MB
~651K SLoC