跳转至

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 面)