Rust in Everything
基于 hyper 1.12.0

动手

前面各部分是读 hyper 的源码,这一部分反过来:不依赖 hyper,自己把服务端主线写一遍。写完再回头看,Conn 为什么要有读写两个状态、头没收全时为什么只做快速扫描、body 为什么要走一个只有一个槽的通道,都会变成你自己碰到过的问题。

  1. 从零写一个 HTTP/1.1 服务端:读缓冲、httparse 解析请求头、按 Content-Length 切 body、keep-alive 循环;用 hyper 客户端发 keep-alive 请求,用手写字节发 pipelining、拆开的头、Connection: close,输出逐字贴出;最后一张表列出它和 hyper 的差距:chunked、Expect、升级、读头超时、自适应缓冲、大小上限、pipelining 的 flush、body 背压。
flowchart TB
  parse["httparse 解析请求头"] --> body["按 Content-Length 切 body"]
  body --> resp[写响应]
  resp --> ka["keep-alive 循环"]
  ka --> parse
  ka --> verify["hyper 客户端与手写字节验证"]
  verify --> diff["对照 Dispatcher 与 Conn"]

💬 关联讨论

发起讨论
加载中...