Rust in Everything
基于 hyper 1.12.0

hyper 源码解析

这一卷对着 hyper 1.12.0(tag v1.12.0,commit 7f67699c)读源码,hyper-util 0.1.21(tag v0.1.21,commit 23a8689)里接 tokio 的部分、auto 服务端和 legacy 客户端一起讲,rt::tracing 的包装执行器、HTTP 隧道与 SOCKS 连接器、client::pool 的连接池积木各有一章。所有源码链接都指向这两个 tag。

hyper 只做一件事:把一条字节流(TCP、TLS、Unix socket,在 hyper 眼里都只是 rt::Read + rt::Write)变成一串 Request / Response,或者反过来。全卷沿这件事的两个方向读:

  • 服务端主线(字节 → 请求 → 响应 → 字节):连接上读到的字节被解析成 Request,交给你的 Service,它返回的 Response 再编码成字节写回去。
  • 客户端主线(请求 → 字节 → 响应):你交出一个 Request,后台的连接任务把它编码写出,读回响应头,再把 Response 交还给你。

两个方向共用同一套 HTTP/1 实现(proto/h1 里的 Dispatcher 和 Conn),区别只在两三个 trait 的实现上。

flowchart TB
  intro[00 导读] --> overview[01 全景]
  overview --> rt[02 运行时抽象]
  rt --> h1["03 HTTP/1 连接"]
  h1 --> body[04 body]
  h1 --> h2["05 HTTP/2"]
  body --> client[06 客户端]
  h2 --> client
  body --> util[07 hyper-util 服务端]
  h2 --> util
  client --> errors[08 错误]
  util --> errors
  errors --> design[09 设计取舍]
  design --> pit[10 常见坑]
  pit --> site[11 在本站中]
  site --> hands[12 动手]

从「导读」开始。只想会用 hyper 的读者,读 01、02、07 和常见坑四部分;想读懂实现的,按顺序读,03 HTTP/1 连接是全卷的重点。

hyper 不绑定运行时,但实际跑起来几乎总是在 tokio 上,IO、任务、计时器讲到时链回 tokio 卷;hyper 1.x 有自己的 Service trait,和 tower 的 Service 怎么接,链回 tower 卷。

💬 关联讨论

发起讨论
加载中...