HTTP 检查顺序与冷启动
定位 Host、Origin、bearer、日志和 JSON 解析各自覆盖的请求。
This page has not been translated into English yet. The original Chinese version is shown below.
排查 daemon 的 401、403、429 或缺少 span 时,应先判断请求在哪一层结束。正式 runtime 与冷启动 bootstrap app 的中间件不同,不能只看最终路由 handler。
正式运行时顺序
| 阶段 | 主要责任 |
|---|---|
| loopback same-origin 处理 | 移除匹配本机监听来源的 Origin |
| access log 与 trace-id capture | 安装完成日志回调,提前提取入站 traceparent |
| Host 与 remote same-origin | loopback Host 防护;有 token 的远端同源请求先认证再移除 Origin |
| allowOriginCors | 使用可变允许列表拒绝未匹配 Origin |
| 特定 pre-auth 路由 | 条件 health、无秘密的 Web Shell 静态内容和独立认证 webhook |
| bearerAuth | 校验已配置 bearer;无 token 的受信本机模式透传 |
| rate limit | 可选按 prompt、mutation、read 分层,早于解析请求体 |
| JSON parser | 上限 10mb,解析失败返回 400 |
| telemetry | 为到达此层的分类 API 建立请求 span |
| route mutation gate | 指定修改接口进一步要求 operator authority |
mutation gate 按路由启用,不是覆盖全部请求的全局 app.use。已配置但缺失或错误的 bearer 通常在更早层返回普通 401;到达 strict gate 却缺少受信权限的请求可返回 token_required。
Host 与同源
loopback Host allowlist 核对允许的本机名称及实际端口,80/443 接受对应无端口形式。非 loopback 主监听依赖 bearer,Host allowlist 在该路径不做相同限制;Local Control LAN listener 仍有自己的 advertised-authority 检查。
远端同源判定使用直接 socket scheme 与规范化 Host,不读取 Forwarded 或 X-Forwarded-*。TLS 终止代理、改写 Host 的中间层或 WebSocket 因而可能仍需要 --allow-origin。
loopback 的跨端口隧道会先被 Host 检查拒绝,allow-origin 不能覆盖它。具体部署组合见Web Shell和TLS。
哪些路由可以在 bearer 前处理
普通 loopback 的 GET /health 可放在 bearer 前;--require-auth 或非 loopback 会把它放到认证后。Local Control listener 的 health 有独立认证要求。
Web Shell 页面、静态资源和精确文档导航在 bearer 前提供,因为普通导航不能附加 Authorization;静态 shell 本身不含会话秘密,API 仍走正常权限流程。缺失 UI assets 时可降为 API-only,--no-web 显式关闭 UI。
渠道 webhook 使用 x-qwen-webhook-secret,位于 daemon bearer 之前;轮换 daemon token 不会轮换 webhook secret。
Access log 与 span 的不同覆盖
正式 runtime 的日志 hook 位于多数 gate 之前,所以早退错误通常有访问日志;但精确 GET /health 与 POST */heartbeat 路径即使被 gate 拒绝也排除。HEAD /health、GET /health/ 并不享受同样排除,成功 SSE GET */events 也不写普通完成访问行。
普通访问日志使用容量 60、每秒补充 2 的预算;部分 pre-auth Host/CORS/remote-same-origin 拒绝使用独立容量 30、每秒补充 1 的预算。bearerAuth 的无 Origin 401 仍消耗普通预算,不应声称所有未认证流量都隔离到另一预算。
OTel 请求 span 位于认证、限流和 body parser 之后,这些早退没有该请求 span,但提前提取的 traceId 仍可出现在访问日志。见Trace 关联。
冷启动 bootstrap
冷启动 app 只直接回答 health、capabilities 和 daemon/status,使用较短的认证/Origin 链且不装 access log。其他路径经过 delegating wrapper 的 bearer gate 后启动正式 runtime,再交给它处理。
这类交接请求的 runtime durationMs 从交接处开始,不包含客户端感知到的全部冷启动时间。--open 直接启动正式 app,因此没有同样冷窗口。
请求体解析上限也不是进程内存上限;多个并发请求可能同时占用解析内存。容量与监听连接配置应一起评估,不能靠单请求 10mb 得出全进程安全预算。