http.frm.timeout
每路由超时中间件(P6-B;deadline 前后判 + 504,注入时钟确定性)
语义登记(v1 口径): 形 = 截止时刻算术:dl = start + budget(tout_deadline);链前判 tout_pre(now < dl → 可进)/ tout_check(决策面:rc 1 = 进,0 = 504 短路, left = 剩余预算下界 0 —— 组合层可将 left 交给 IO 面(如 net 垫片时钟) 作 socket 预算);handler 返回后判 tout_over(now >= dl → 越限,组合层 以 504 应答/标记)。时钟 = 注入参数(tick 任意单调域;真钟装配归组合层 —— ctron_net_now_ns 垫片 or 逻辑序号,确定性测试即注入计数)。
【mid-handler 中止诚实登记】纯层无执行控制 —— 运行中 handler 不可被 本模块打断;v1 = 前/后判的诚实检出(前判拒已越限请求,后判观测越限 并交组合层处置),真·运行中止(net deadline 触发可取消执行)列 net 集成面(P8 志向;题面 "每路由超时经 net deadline" 的 IO 半边)。 后判语义的代价 = 越限响应仍以 handler 产物生成,组合层须弃其体改发 504(fixture 演示该分支)。
per-route = budget 由组合层按 route id 选择(派发表查 budget;本模块 单次调用面无路由感知 —— 链形装配每路由一适配器,或派发处选 budget)。
注入面:504 响应体/头恒字面量,无请求字节。
use 面:零 use 纯模块(同 cors/sechdr/limit —— 多中间件同入口组合各为 无共享叶子,严格树 E5020 规避)。
pub struct
struct ToutDec
| Field | Type |
|---|---|
rc |
I64 |
left |
I64 |
pub fn
| Signature | Returns | Description |
|---|---|---|
tout_deadline(start: I64, budget: I64) |
I64 |
截止 = start + budget(tick 域任意单调;I64 加法,tick 域组合层纪律: 恒以 epoch 起点附近值入参,溢出面登记志向) |
tout_pre(now: I64, dl: I64) |
I64 |
链前判:1 = 未越限可进 / 0 = 已越限(now >= dl 即拒,恰等即拒 —— 从严) |
tout_over(now: I64, dl: I64) |
I64 |
后判(handler 返回后):1 = 越限 / 0 = 界内 |
tout_left(now: I64, dl: I64) |
I64 |
剩余预算(下界 0;组合层可交 IO 面作 socket 预算) |
td_rc(d: ToutDec) |
I64 |
— |
td_left(d: ToutDec) |
I64 |
— |
tout_check(now: I64, dl: I64) |
ToutDec |
链前决策:rc = tout_pre 同域(1 进 / 0 504 短路),left 随出 |
tout_resp_504() |
Str |
504 Gateway Timeout(body 7 字节;组合层越限分支改发此响应,弃 handler 体) |