问题描述
在管理端配置请求过滤器(Guard 阶段)删除特定请求头(如 noauth、traceparent、x-accel-buffering、x-request-id、x-envoy-external-address
等)后,向上游供应商发出的实际请求中这些头确实已被正确删除,但请求失败时错误日志中"请求详情 → 请求头"部分仍然显示这些原本应被删除的头。
复现步骤
- 在管理端添加请求过滤器(Guard 阶段),action 为 remove,scope 为 header,target 为 noauth(或其他自定义头)
- 使用 Claude Code 客户端发送一个会触发重试/失败的请求
- 观察日志中"请求详情 → 请求头"部分,可以看到被配置删除的头依然出现在日志里
根本原因
在 src/app/v1/_lib/proxy/session.ts 的 ProxySession.fromContext() 中,headerLog 在 session 构建时就已经被序列化为只读字符串快照——此时请求尚未进入 GuardPipeline:
// session.ts ~第 182 行,Guard 执行之前就已快照
const headerLog = formatHeadersForLog(headers);
Guard 阶段的 requestFilter 步骤会正确修改 session.headers(可变的 Headers 对象),buildHeaders() 构建上游请求时也正确使用了过滤后的 session.headers,因此实际发出的请求是干净的。
但在 src/app/v1/_lib/proxy/errors.ts 的 buildRequestDetails() 中,日志输出用的是冻结的 session.headerLog:
// errors.ts ~第 1317 行
headers: sanitizeHeaders(session.headerLog), // ← 读取的是构建时的原始快照
由于 headerLog 从未被更新,日志中永远显示客户端发来的原始请求头,过滤器的修改对日志不可见。
修复建议
在 buildRequestDetails() 中,将 session.headerLog 替换为 session.headers(sanitizeHeaders 已支持 Headers | string 两种入参):
// errors.ts ~第 1317 行
- headers: sanitizeHeaders(session.headerLog),
- headers: sanitizeHeaders(session.headers),
session.headers 在 buildRequestDetails() 被调用时已经经过了完整的 Guard 阶段过滤,与实际发往上游的请求头一致,这样日志内容也能如实反映实际情况。
补充说明
- 上游实际收到的请求头是正确的(过滤有效),仅日志输出受影响
- 版本:0.6.6
问题描述
在管理端配置请求过滤器(Guard 阶段)删除特定请求头(如 noauth、traceparent、x-accel-buffering、x-request-id、x-envoy-external-address
等)后,向上游供应商发出的实际请求中这些头确实已被正确删除,但请求失败时错误日志中"请求详情 → 请求头"部分仍然显示这些原本应被删除的头。
复现步骤
根本原因
在 src/app/v1/_lib/proxy/session.ts 的 ProxySession.fromContext() 中,headerLog 在 session 构建时就已经被序列化为只读字符串快照——此时请求尚未进入 GuardPipeline:
// session.ts ~第 182 行,Guard 执行之前就已快照
const headerLog = formatHeadersForLog(headers);
Guard 阶段的 requestFilter 步骤会正确修改 session.headers(可变的 Headers 对象),buildHeaders() 构建上游请求时也正确使用了过滤后的 session.headers,因此实际发出的请求是干净的。
但在 src/app/v1/_lib/proxy/errors.ts 的 buildRequestDetails() 中,日志输出用的是冻结的 session.headerLog:
// errors.ts ~第 1317 行
headers: sanitizeHeaders(session.headerLog), // ← 读取的是构建时的原始快照
由于 headerLog 从未被更新,日志中永远显示客户端发来的原始请求头,过滤器的修改对日志不可见。
修复建议
在 buildRequestDetails() 中,将 session.headerLog 替换为 session.headers(sanitizeHeaders 已支持 Headers | string 两种入参):
// errors.ts ~第 1317 行
session.headers 在 buildRequestDetails() 被调用时已经经过了完整的 Guard 阶段过滤,与实际发往上游的请求头一致,这样日志内容也能如实反映实际情况。
补充说明