http.frm.middleware
组合层中间件链骨架 + 请求上下文载体(P6-A)
链形(P5-E 裁定沿用:Sender/Receiver 字段化截断 ⇒ std 门面禁持通道半端; 中间件链/handler 装配一律组合层接线 —— 本模块不持任何 IO 面,零通道):
中间件 = fn(req: Str, h: I64, next: fn(Str, I64) -> Str) -> Str
req = 请求目标(路径,含原样 percent 编码;组合层自 parse.ct target
槽经 frm_slice_str Str 化后传入)
h = 请求句柄(I64;v1 约定 = 路由 id 携带 + 中间件数据槽:中间件
以「值变换」下传 —— next(req, h') 传入改写后的 h',handler 读
到的即链上累改结果;类型 = I64,无 Any)
短路 = 中间件不调 next、径返自身响应(响应胜出);调 next 即透传
链的组装 = 组合层显式嵌套(闭包字面量适配 fn 形,03g/03h + P6-A 探针 已证形;emit 侧 fn 值装箱全宽 ct_i 实参 —— 故【链上只走标量/Str,struct 与 lane 视图过装箱调用即断,P6-A 探针实证】):
let resp = mw1(req, h, |r, k| mw2(r, k, |r2, k2| term(r2, k2)))
执行序 = 装配嵌套序(外先内后);序断言 = 句柄算术组合(外层 ×10+1、内层 ×10+2 之类,序错即值异)。FrmCtx(下)为富载体:arena 句柄 + 路径参数 + 类型化数据槽 —— 用于组合层【直接调用】边界(装配前构造、终端 handler/ IO 粘合处按 getter 读),不过装箱链(fn 值实参 ct_i 装箱,struct 即断)。
FrmCtx 形态((h) 缺口绕行:跨模块成员读不可发射 → 值 struct + 标量 getter;消费方侧字面量构造/整体回传皆绿,数据槽写 = 值重建 with_d): arena = 请求 arena 句柄(组合层令牌;纯层无分配器,句柄语义随 P6 body 绑定波 formalize,本波为透传槽) req_id = 连接内请求序号(组合层填) np/ps/p*l = 路径参数 4 槽(frm_ctx_route 自 FrmRoute 搬运) d0/d1 = 中间件数据槽 A/B(类型化 I64;经 with_d0/with_d1 写,getter 读)
响应助手 = 零 use 自拼(message.ct 不导入 —— 加载器严格树:消费方常需 parse+message 直用,本模块再导即菱形 E5020;状态行/CL 三位十进制自拼, 与 msg_status_line 同式,CRLF 自备)。
use 面(加载器严格树 E5020 形态登记):本模块 = 框架面唯一入口(门面形, tls.ct ⑥ 同款)—— router 侧符号经本模块 use 单命名空间合并贯穿, 消费方【只】use http.frm.middleware,不得再直 use router/enc (同叶双径即菱形)。router 侧符号(frm_match/fr_ /frm_param 等) 消费方按名直引即解析。
pub struct
struct FrmRoute
| Field | Type |
|---|---|
rc |
I64 |
id |
I64 |
np |
I64 |
p0s |
I64 |
p0l |
I64 |
p1s |
I64 |
p1l |
I64 |
p2s |
I64 |
p2l |
I64 |
p3s |
I64 |
p3l |
I64 |
struct FrmI64
| Field | Type |
|---|---|
rc |
I64 |
v |
I64 |
pub fn
| Signature | Returns | Description |
|---|---|---|
frm_ctx_new(arena: I64, req_id: I64) |
FrmCtx |
— |
frm_ctx_route(c: FrmCtx, m: FrmRoute) |
FrmCtx |
参数槽搬运:自命中结果(FrmRoute)拷入上下文(组合层:match → ctx 一行接线) |
frm_ctx_with_d0(c: FrmCtx, v: I64) |
FrmCtx |
数据槽写(值重建 —— 闭包捕获槽写回禁(⑤),槽变更以新值下传) |
frm_ctx_with_d1(c: FrmCtx, v: I64) |
FrmCtx |
— |
frm_ctx_arena(c: FrmCtx) |
I64 |
— |
frm_ctx_req_id(c: FrmCtx) |
I64 |
— |
frm_ctx_np(c: FrmCtx) |
I64 |
— |
frm_ctx_ps(c: FrmCtx, k: I64) |
I64 |
— |
frm_ctx_pl(c: FrmCtx, k: I64) |
I64 |
— |
frm_ctx_d0(c: FrmCtx) |
I64 |
— |
frm_ctx_d1(c: FrmCtx) |
I64 |
— |
frm_ctx_param(buf: &[I64], c: FrmCtx, k: I64) |
Str |
参数槽 → 原始切片 Str(终端 handler 侧便捷面;组合层持 buf 时常用) |
frm_resp(status: I64, reason: Str, body: Str) |
Str |
最小响应:状态行 + Content-Length + 体(HTTP/1.1;连接管理归框架 IO 波) |
frm_resp_text(body: Str) |
Str |
— |
frm_resp_404() |
Str |
— |
frm_resp_405() |
Str |
v1 口径登记(评审修正;RFC 9110 §15.5.5 要求 405 带 Allow 头):本助手 不发 Allow —— 方法集需 id→路由方法集映射,frm_match 只返首个 405 候选 id(router.ct id405 槽在案),v1 单值映射不足。Allow 发射列志向:api 波(Task 5 todo_api)或 P7 落;届时 frm_match 需扩方法集出口。 |
frm_m_get() |
I64 |
— |
frm_m_post() |
I64 |
— |
frm_m_put() |
I64 |
— |
frm_m_delete() |
I64 |
— |
frm_m_patch() |
I64 |
— |
frm_m_head() |
I64 |
— |
frm_m_options() |
I64 |
— |
frm_m_trace() |
I64 |
— |
frm_rc_match() |
I64 |
— |
frm_rc_method() |
I64 |
— |
frm_rc_miss() |
I64 |
— |
frm_mcode_buf(buf: &[I64], s: I64, l: I64) |
I64 |
— |
fr_rc(m: FrmRoute) |
I64 |
— |
fr_id(m: FrmRoute) |
I64 |
— |
fr_np(m: FrmRoute) |
I64 |
— |
fr_ps(m: FrmRoute, k: I64) |
I64 |
— |
fr_pl(m: FrmRoute, k: I64) |
I64 |
— |
frm_match(spec: Str, meth: I64, buf: &[I64], ts: I64, tl: I64) |
FrmRoute |
— |
frm_slice_str(src: &[I64], a: I64, b: I64) |
Str |
— |
frm_param(buf: &[I64], m: FrmRoute, k: I64) |
Str |
— |
frm_param_dec(buf: &[I64], m: FrmRoute, k: I64, bad: Str) |
Str |
— |
frm_param_dec_ok(buf: &[I64], m: FrmRoute, k: I64) |
I64 |
— |
fi_rc(x: FrmI64) |
I64 |
— |
fi_v(x: FrmI64) |
I64 |
— |
frm_param_i64(buf: &[I64], m: FrmRoute, k: I64) |
FrmI64 |
— |