1
0
Files
DiAL/openspec/changes/http-checker-quality-hardening/specs/expect-body-checkers/spec.md
lanyuanxiaoyao 76b47006fe feat: 新增两个 OpenSpec 变更提案 — 前端架构重构与 HTTP Checker 质量加固
- frontend-architecture-refactor: 拆分 hooks/组件、类型筛选器动态化
- http-checker-quality-hardening: ReDoS 防护、failure 格式修正、测试补全
2026-05-13 18:40:08 +08:00

6.0 KiB
Raw Blame History

MODIFIED Requirements

注:仅展示变更的 scenarios其余 scenarios 保持不变

Requirement: 结构化 expect 失败信息

系统 SHALL 在任一 expect 规则失败时生成结构化 failure用于标识失败阶段、规则路径、期望值、实际值和可读错误信息。actual 值 SHALL 在构造时截断至不超过 200 字符超出部分以省略标记和总字符数替代。expected 值不截断。

Scenario: body 规则失败信息

  • WHEN HTTP target 的 expect.body[1].json 规则失败
  • THEN failure SHALL 包含 kind=mismatch、phase=body、path 指向 expect.body[1],并包含 message

Scenario: actual 值截断

  • WHEN 失败规则的实际值为字符串且长度超过 200 字符
  • THEN failure.actual SHALL 为前 200 字符加 …(共 N 字符) 后缀,其中 N 为原始总字符数

Scenario: actual 值未超限

  • WHEN 失败规则的实际值为字符串且长度不超过 200 字符
  • THEN failure.actual SHALL 保留完整原始值,不做截断

Scenario: actual 值为对象或数组

  • WHEN 失败规则的实际值为对象或数组,且 JSON 序列化后长度超过 200 字符
  • THEN failure.actual SHALL 为序列化后前 200 字符加 …(共 N 字符) 后缀

Scenario: actual 值为标量

  • WHEN 失败规则的实际值为 number、boolean、null 或 undefined
  • THEN failure.actual SHALL 保留原始值,不做截断

Requirement: HTTP expect 规则启动期校验

系统 SHALL 在启动期校验 HTTP expect 中已支持字段的类型、格式、未知字段和可编译表达式。HTTP expect、body rule、json/css/xpath rule 和 operator 对象中的未知字段 SHALL 导致启动期配置失败。每个 body rule 对象 MUST 恰好包含 contains、regex、json、css、xpath 中的一种规则类型。纯 operator 对象 MUST 至少包含一个已知 operatorbody 提取规则可以不配置 operator并以路径、元素或节点存在作为通过语义。equals operator SHALL 支持任意 JSON value包括数组和对象。系统 SHALL 在启动期对 regex body 规则和 match operator 的正则表达式进行 ReDoS 安全检测,含有嵌套量词等危险模式的正则 SHALL 导致启动期配置失败。

Scenario: body rule 使用 regex 字段

  • WHEN HTTP target 配置 expect.body: [{regex: "ok|healthy"}] 且 regex 可编译且无 ReDoS 风险
  • THEN 系统 SHALL 接受该配置,并在运行期按 regex body 规则匹配响应体

Scenario: body rule 不支持 match 字段

  • WHEN HTTP target 配置 expect.body: [{match: "ok"}] 且该规则没有 contains、regex、json、css、xpath 任一支持字段
  • THEN 系统 SHALL 在启动期配置校验失败

Scenario: body rule 未知字段启动失败

  • WHEN HTTP target 配置 expect.body: [{contains: "ok", note: "ignored"}]
  • THEN 系统 SHALL 在启动期配置校验失败,提示 note 是未知字段

Scenario: body rule 多支持字段非法

  • WHEN HTTP target 的同一条 body rule 同时配置 contains 和 regex
  • THEN 系统 SHALL 在启动期配置校验失败

Scenario: operator match 正则非法

  • WHEN HTTP target 的 expect.headers、json、css 或 xpath operator 配置了不可编译的 match 正则
  • THEN 系统 SHALL 在启动期配置校验失败

Scenario: operator 数值比较类型非法

  • WHEN HTTP target 的 expect operator 配置 gt、gte、lt 或 lte且对应值不是有限数字
  • THEN 系统 SHALL 在启动期配置校验失败

Scenario: operator 布尔类型非法

  • WHEN HTTP target 的 expect operator 配置 empty 或 exists且对应值不是布尔值
  • THEN 系统 SHALL 在启动期配置校验失败

Scenario: JSONPath 子集非法

  • WHEN HTTP target 的 json body rule path 不符合系统支持的 JSONPath 子集
  • THEN 系统 SHALL 在启动期配置校验失败

Scenario: operator 未知字段非法

  • WHEN HTTP target 的 expect operator 配置了 foo: "bar" 等未知 operator 字段
  • THEN 系统 SHALL 在启动期配置校验失败

Scenario: equals 支持对象

  • WHEN HTTP target 配置 expect.body: [{json: {path: "$.payload", equals: {status: "ok"}}}]
  • THEN 系统 SHALL 接受该配置,并在运行期使用深度相等比较提取值和对象期望

Scenario: equals 支持数组

  • WHEN HTTP target 配置 expect.body: [{json: {path: "$.items", equals: ["a", "b"]}}]
  • THEN 系统 SHALL 接受该配置,并在运行期使用深度相等比较提取值和数组期望

Scenario: 纯 operator 对象不能为空

  • WHEN HTTP target 的 expect.headers 中某个 header 期望配置为空对象 {}
  • THEN 系统 SHALL 在启动期配置校验失败,要求显式配置至少一个 operator

Scenario: json rule 允许存在性语义

  • WHEN HTTP target 配置 expect.body: [{json: {path: "$.status"}}]
  • THEN 系统 SHALL 接受该配置,并在运行期以 JSONPath 值存在作为通过语义

Scenario: css rule 未知字段非法

  • WHEN HTTP target 配置 expect.body: [{css: {selector: "h1", unknown: true}}]
  • THEN 系统 SHALL 在启动期配置校验失败,提示未知字段

Scenario: xpath rule 未知字段非法

  • WHEN HTTP target 配置 expect.body: [{xpath: {path: "/html/body", unknown: true}}]
  • THEN 系统 SHALL 在启动期配置校验失败,提示未知字段

Scenario: regex body 规则含嵌套量词启动失败

  • WHEN HTTP target 配置 expect.body: [{regex: "(a+)+$"}]
  • THEN 系统 SHALL 在启动期配置校验失败,提示正则存在 ReDoS 风险

Scenario: match operator 含嵌套量词启动失败

  • WHEN HTTP target 的 expect operator 配置 {match: "(\\d+)*x"}
  • THEN 系统 SHALL 在启动期配置校验失败,提示正则存在 ReDoS 风险

Scenario: 安全正则通过校验

  • WHEN HTTP target 配置 expect.body: [{regex: "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"}]
  • THEN 系统 SHALL 接受该配置(无嵌套量词,无 ReDoS 风险)