http.frm.cors
CORS 中间件(P6-B;预检矩阵 + 白名单 + 凭据)
语义登记(v1 口径,偏离/志向逐条): 预检判定 = OPTIONS 方法码 + Access-Control-Request-Method 头在 + Origin 在(fetch spec 预检三件;composition 层自 parse.ct 取,纯值入参)。 预检放行 → 204 No Content + ACAO/ACAM/ACAH/ACCredentials/Max-Age/Vary: Origin;拒 → 403(择 403 而非 200-无头:显式失败面便于网关观测,登记)。 非预检(actual)→ cors_check:无 Origin = 同源/非 CORS 请求放行不发 ACAO (同源无 CORS 语义);有 Origin 命中白名单/通配 → 放行,cors_apply 追加 ACAO(+credentials 时 ACC)+ Vary: Origin;不命中 → 403 短路。
白名单 = 精确串等值(origin 逐字节;后缀/子域匹配登记缺席 —— 从严即默认 ,"suffix matching registered as absent")。wild = origins 表为 "*" 单条; wild + cred 同时配置 = 构造期拒绝(WHATWG fetch:credentials 响应禁 * —— RFC 9110 语义面同源);cred 时 ACAO 恒取白名单条目回显面。
注入面(响应构造纪律):ACAO 恒出自配置条目/常量 "*"(永不回显请求字节); ACAM/ACAH 恒出自配置表(ACAH 不反射请求头名,发配置全表 —— 反射面登记 志向);配置经 cors_cfg 校验(条目无 CR/LF/控制字节、origin 形、方法/头 token 形)—— 构造拒绝即注入面封口。
use 面:零 use 纯模块(middleware/router 不引 —— 严格树 E5020:多中间件 同入口组合时各中间件必为无共享叶子;组合层接线经直接调用边界,链形适配 由消费方闭包字面量完成,P6-B 探针:闭包捕获标量读 emit 缺口 → 适配闭包 配置恒字面量实参)。私有助手自拼(响应助数字位面 middleware.ct 同式不 导,防菱形)。
pub struct
struct CorsCfg
| Field | Type |
|---|---|
ok |
I64 |
err |
I64 |
wild |
I64 |
cred |
I64 |
n |
I64 |
o0 |
Str |
o1 |
Str |
o2 |
Str |
o3 |
Str |
o4 |
Str |
o5 |
Str |
o6 |
Str |
o7 |
Str |
mth |
Str |
hdrs |
Str |
mage |
I64 |
struct CorsDec
| Field | Type |
|---|---|
rc |
I64 |
why |
I64 |
acao |
Str |
acam |
Str |
acah |
Str |
cred |
I64 |
mage |
I64 |
pub fn
| Signature | Returns | Description |
|---|---|---|
cors_err_ok() |
I64 |
err 码:0 ok / 1 cred+wild 冲突 / 2 origin 形坏 / 3 方法或头 token 坏 / 4 origin 条目超 8 / 5 origins 空表 |
cors_err_credwild() |
I64 |
— |
cors_err_origin() |
I64 |
— |
cors_err_token() |
I64 |
— |
cors_err_many() |
I64 |
— |
cors_err_empty() |
I64 |
— |
ccfg_ok(c: CorsCfg) |
I64 |
— |
ccfg_err(c: CorsCfg) |
I64 |
— |
ccfg_wild(c: CorsCfg) |
I64 |
— |
ccfg_cred(c: CorsCfg) |
I64 |
— |
ccfg_mage(c: CorsCfg) |
I64 |
— |
cors_cfg(origins: Str, methods: Str, hdrs: Str, mage: I64, cred: I64) |
CorsCfg |
构造:origins = '|' 分隔白名单(或单条 "*" 通配);methods/hdrs = '|' 分隔 token 表;mage 秒(0 = 预检不发 Max-Age);cred 0/1 |
cd_rc(d: CorsDec) |
I64 |
why:0 ok / 1 origin 拒 / 2 method 拒 / 3 header 拒 / 4 非 CORS(无 Origin 放行透传) |
cd_why(d: CorsDec) |
I64 |
— |
cd_acao(d: CorsDec) |
Str |
— |
cd_acam(d: CorsDec) |
Str |
— |
cd_acah(d: CorsDec) |
Str |
— |
cd_cred(d: CorsDec) |
I64 |
— |
cd_mage(d: CorsDec) |
I64 |
— |
cors_preflight(c: CorsCfg, origin: Str, acrm: Str, acrh: Str) |
CorsDec |
预检判定:origin/ACRM 值/ACRH 值(composition 层自 parse.ct 头切片 Str 化 后传入;空 origin 或空 ACRM = 非预检形 → why 拒由调用面 cors_check/411 分管 —— 本面按预检语义判) |
cors_check(c: CorsCfg, has_origin: I64, origin: Str) |
CorsDec |
actual 请求 Origin 门:has_origin = 0(同源/非 CORS)→ 放行透传不发 CORS 头;有 Origin 命中 → 放行(acao 出);不命中 → 403 短路 |
cors_preflight_resp(d: CorsDec) |
Str |
预检 204(放行时;拒绝面 = cors_resp_403) |
cors_resp_403() |
Str |
CORS 拒(预检/actual 共面;body 13 字节) |
cors_apply(resp: Str, d: CorsDec) |
Str |
actual 放行后追加 ACAO(+credentials)于响应头尾(head_end 后插,空 acao 不动 —— why=4 非 CORS 面) |