Rust in Everything
基于 hyper 1.12.0

body

body 在两条主线上都有两个方向:收到的(服务端的请求 body、客户端的响应 body)和发出去的(服务端的响应 body、客户端的请求 body)。hyper 只实现了收到的那一种,叫 Incoming;发出去的 body 可以是任何实现了 http_body::Body 的类型,常用的都在 http-body-util 里。Body trait 本身见 Service 与 Body,HTTP/1 上 body 的字节格式见 body 的解码与编码。

  1. Incoming 与 body 通道:Incoming 的几种 Kind、DecodedLength 怎么用一个 u64 表示长度和两种「不知道」;HTTP/1 的通道只有一个数据槽,Dispatcher 槽空了才读 socket,want 只给 Expect: 100-continue 用;处理函数不读 body 时,hyper 只再解码一步,读不完就在响应后关连接。
  2. http-body-util:Full、Empty、StreamBody、Channel 怎么报告长度,frame 和 collect 怎么读,Limited 按帧检查、报 length limit exceeded,以及分支返回不同 body 时用同一类型、Either 还是 BoxBody / UnsyncBoxBody。
flowchart TB
  sock["socket"] --> disp["Dispatcher"]
  disp -->|"一个槽"| inc["Incoming"]
  inc --> handler["处理函数"]
  handler -->|"frame / collect / Limited"| usebody["读请求 body"]
  handler --> resp["Full / StreamBody / BoxBody"]
  resp -->|poll_frame| disp

上半段是第一章,下半段的类型和读 body 的方法是第二章。图画的是服务端;客户端把「请求」和「响应」对调,用的是同一套类型。

💬 关联讨论

发起讨论
加载中...