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 日

#238HTTP 客户端

Download history 132/week @ 2024-06-07 192/week @ 2024-06-14 3/week @ 2024-06-21 102/week @ 2024-07-12 122/week @ 2024-07-19 581/week @ 2024-07-26 265/week @ 2024-08-02 9/week @ 2024-08-09 160/week @ 2024-08-16

每月 1,015 次下载

ISC 许可证

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"));
                },
            }
        }
    });
}

客户端

请求分为三个阶段,每个阶段都有相应的函数

  1. 建立连接(《connect》)。

    这包括地址解析,包括 ipv4/ipv6 解析的“happy eyes”。

    您可以重用此连接,或创建自己的连接池。除了这一点之外,没有连接管理。

  2. 发送请求并等待头部(《send》)

  3. 读取主体(《receive》)或(《receive_stream》)

有辅助方法结合上述 2 和 3

  • send_simple
  • post
  • post_json

原因

流行库的各种接口不安全类型,使得各种边缘情况的自定义行为难以实现或无法实现。实现很大,内部紧密耦合,维护者不倾向于不常见的用例。

这个库主要是我自己的消费,但我想让它对有类似愿景(可组合、最小抽象、最小泛型使用、最小宏使用)的其他人也有用。

依赖项

~22–34MB
~651K SLoC