body
body 在两条主线上都有两个方向:收到的(服务端的请求 body、客户端的响应 body)和发出去的(服务端的响应 body、客户端的请求 body)。hyper 只实现了收到的那一种,叫 Incoming;发出去的 body 可以是任何实现了 http_body::Body 的类型,常用的都在 http-body-util 里。Body trait 本身见 Service 与 Body,HTTP/1 上 body 的字节格式见 body 的解码与编码。
- Incoming 与 body 通道:
Incoming的几种Kind、DecodedLength怎么用一个u64表示长度和两种「不知道」;HTTP/1 的通道只有一个数据槽,Dispatcher槽空了才读 socket,want只给Expect: 100-continue用;处理函数不读 body 时,hyper 只再解码一步,读不完就在响应后关连接。 - 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 的方法是第二章。图画的是服务端;客户端把「请求」和「响应」对调,用的是同一套类型。
💬 关联讨论
发起讨论加载中...