请求生命周期
一次 TCP 连接可以承载多次 HTTP 交互。每个交互都有独立的请求、响应和 AbortController,连接协调器决定何时开始下一次交互。
text
TCP 字节 → SegmentedInput → 扫描请求头 → 定界与输入策略
│
┌──────────────────────┴───────────────────┐
↓ ↓
IncomingBody Application.dispatch
持续解码 / 读取背压 onRequest → 中间件 → 路由 → 处理器
│ │
└──────── 处理器按需读取 ───────────────────┤
↓
NovaResponse → sink
↓
输出成功 / 取消
↓
检查输入消费与连接复用条件请求头就绪
扫描器完成有界头部解析,协议层生成 body 定界计划和连接意图。协调器先检查 body 策略、Expect 与不支持的连接模式,再构造请求元数据。应用可以在 body 尚未完整到达时开始执行。
并行推进输入与应用
输入泵将 fixed/chunked 数据解码为 IncomingBody 视图,消费方读取触发恢复。应用超时从分发开始计时,body 输入空闲计时独立维护。业务提前返回而不消费 body 时,不允许直接复用连接。
完成响应
NovaResponse 排队提交响应头、body 和结束操作;sink 负责 HTTP/1 定界及等待 socket drain。处理器返回与输出成功是两个时刻,Application 等待完成信号后才发出 onResponse。
下一次交互
只有当前应用处理结束、响应可复用、输入消息完整且请求体消费完成,才允许处理后续请求。流水线字节可能已进入输入缓冲,但后续处理器不能越过当前响应。
失败路径
提交前的业务错误可进入错误链;输出失败或提交后异常由协调层取消交互、失败请求体并关闭传输。首次失败原因应保持,旧交互的迟到通知不能取消新交互。实现说明见响应与取消。