Skip to content

Bug:请求过滤器(Guard 阶段)删除的请求头仍出现在错误日志的"请求详情"中 #1017

Description

@xujiesh0510

问题描述

在管理端配置请求过滤器(Guard 阶段)删除特定请求头(如 noauth、traceparent、x-accel-buffering、x-request-id、x-envoy-external-address
等)后,向上游供应商发出的实际请求中这些头确实已被正确删除,但请求失败时错误日志中"请求详情 → 请求头"部分仍然显示这些原本应被删除的头。

复现步骤

  1. 在管理端添加请求过滤器(Guard 阶段),action 为 remove,scope 为 header,target 为 noauth(或其他自定义头)
  2. 使用 Claude Code 客户端发送一个会触发重试/失败的请求
  3. 观察日志中"请求详情 → 请求头"部分,可以看到被配置删除的头依然出现在日志里

根本原因

在 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

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions