跳转至

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 —