http.frm.body
请求体绑定(P6-C;JSON typed 绑定 + multipart/form-data)
语义登记(v1 口径,偏离/志向逐条):
① JSON 绑定面(jv_/jk_ 便捷面;T53 后 std/json 内部恒经 jget_ Result 数值面——发射臂 union 载荷 64 位+位双关闭环,跨模块 Result 数值载荷保真): body_json(text, cap) = 解析入口(text.len > cap 即拒,先于 parse); parse 的 Result[List,] match 为发射面已证形(json_fidelity d 先例, Err-Str 载荷绿)。字段提取【只】走 jv_/jk_(值 jv_ 带默认 / kind jk_*)。字符串面 = qtag(qtag=="s") + qval(载荷原文)。required 语义 = breq_i64:rc 1 ok / 0 noent / 2 他类(kind 细分经 bj_i64_kind);带默认语义 = bj_i64。
② multipart/form-data(RFC 2046 §5.1):字节道 List[I32](router.ct body 绑定字节道登记同向 —— 二进制文件件 Str 载不下)。解析: delimiter = CRLF "--" boundary 行首锚定(RFC 2046 §5.1.1 「delimiters 于行首」—— 【行中 boundary 字节即惰性数据】,无歧义不另拒;组合层 生成侧仍须选与内容不相交的 boundary,签发纪律登记);首 delimiter 前的 preamble 丢弃;transport padding(LWSP)容忍;close delimiter "--bnd--" 后 epilogue 丢弃;【缺 close delimiter → Err】(why 4, 题面钉);首 delimiter 缺 → why 3;part 头区 CRLFCRLF 缺 → why 5; Content-Disposition 缺 name / 非 form-data 型 → why 6;part 数超 4 槽 → why 7(槽上限同路由参数 4 槽先例);总量 cap 先验 → why 1。 boundary 提取 = Content-Type 参数扫描(CI;quoted/unquoted 双形; RFC 2046 bchars 域 1..70、尾空格拒 —— 构造期校验注入面封口)。 name/filename = quoted-string(反斜杠转义登记缺席,从严拒)/ token 双形;filename 缺 = 表单字段(空串)。part 数据面 = 原始字节(mp_data, 文件件)+ 可印 Str 便捷面(mp_field,表格构建域 —— 出域即 "",与 frm_slice_str 域一致,歧义登记)。大文件流式 = P8(内存版,总量 cap)。
use 面:std.json 单叶(jv_/jk_/qtag/qval/parse;消费方若自用 std.json 再 use 本模块 = 同叶双径 E5020,禁)。byte_at/byte_slice = 内建。【utf8_enc 内建禁用】(P6-C 实证:解释臂恒产 U+FFFD 替换列, 双臂劈叉 —— auth.ct 头注同款登记;单字节 Str 构建 = bd_ch 表格面)。 私铸助手 bd_ 前缀(auth.ct au_ 前缀异名 —— 两模块同 fixture 并用时 use 合并单一命名空间,同名 decl 即 E5030,规避)。
pub struct
struct BJson
| Field | Type |
|---|---|
rc |
I64 |
why |
I64 |
emsg |
Str |
es |
List[List[Str]] |
struct BStr
字符串读取(qtag/qval 面;rc 1 ok / 0 noent / 2 非字符串)
| Field | Type |
|---|---|
rc |
I64 |
v |
Str |
struct BI64
required 读取(rc 1 ok / 0 noent / 2 他类 —— kind 细分经 bj_i64_kind)
| Field | Type |
|---|---|
rc |
I64 |
v |
I64 |
struct MpB
boundary 提取结果(rc 1 + 值 / 0)
| Field | Type |
|---|---|
rc |
I64 |
v |
Str |
struct MpParse
| Field | Type |
|---|---|
rc |
I64 |
why |
I64 |
n |
I64 |
nm0 |
Str |
nm1 |
Str |
nm2 |
Str |
nm3 |
Str |
fn0 |
Str |
fn1 |
Str |
fn2 |
Str |
fn3 |
Str |
d0 |
List[I32] |
d1 |
List[I32] |
d2 |
List[I32] |
d3 |
List[I32] |
dl0 |
I64 |
dl1 |
I64 |
dl2 |
I64 |
dl3 |
I64 |
pub fn
| Signature | Returns | Description |
|---|---|---|
body_err_ok() |
I64 |
why 码 |
body_err_parse() |
I64 |
— |
body_err_cap() |
I64 |
— |
bj_rc(b: BJson) |
I64 |
— |
bj_why(b: BJson) |
I64 |
— |
bj_emsg(b: BJson) |
Str |
— |
body_json(text: Str, cap: I64) |
BJson |
解析入口(cap = text.len 上限,先验后析;Err 载荷原文面 bj_emsg) |
bj_i64(b: BJson, path: Str, dft: I64) |
I64 |
带默认读取(jv_ 便捷面;dft 域) |
bj_f64(b: BJson, path: Str, dft: F64) |
F64 |
— |
bj_bool(b: BJson, path: Str, dft: Bool) |
Bool |
— |
bj_i64_kind(b: BJson, path: Str) |
Str |
kind 查询("ok" 或 noent/null/type/frac/range/syn) |
bj_bool_kind(b: BJson, path: Str) |
Str |
— |
bs_rc(x: BStr) |
I64 |
— |
bs_v(x: BStr) |
Str |
— |
bj_str(b: BJson, path: Str) |
BStr |
— |
bi_rc(x: BI64) |
I64 |
— |
bi_v(x: BI64) |
I64 |
— |
breq_i64(b: BJson, path: Str) |
BI64 |
— |
mp_err_ok() |
I64 |
why 码 |
mp_err_cap() |
I64 |
— |
mp_err_bnd() |
I64 |
— |
mp_err_nofirst() |
I64 |
— |
mp_err_noclose() |
I64 |
— |
mp_err_hdr() |
I64 |
— |
mp_err_disp() |
I64 |
— |
mp_err_many() |
I64 |
— |
mp_err_delim() |
I64 |
— |
mp_err_over() |
I64 |
— |
mb_rc(x: MpB) |
I64 |
— |
mb_v(x: MpB) |
Str |
— |
mp_boundary(ct: Str) |
MpB |
Content-Type → boundary(CI 参数扫描;quoted/unquoted;OWS 容忍) |
mp_rc(p: MpParse) |
I64 |
— |
mp_why(p: MpParse) |
I64 |
— |
mp_n(p: MpParse) |
I64 |
— |
mp_name(p: MpParse, k: I64) |
Str |
— |
mp_fname(p: MpParse, k: I64) |
Str |
— |
mp_data(p: MpParse, k: I64) |
List[I32] |
— |
mp_dlen(p: MpParse, k: I64) |
I64 |
— |
mp_field(p: MpParse, k: I64) |
Str |
part 数据便捷 Str 面(可印表格域;出域/文件件 → "") |
mp_parse(body: List[I32], blen: I64, bnd: Str, cap: I64) |
MpParse |
主入口:body 字节道 + 长度 + boundary + 总量 cap。语义见头注②。 |