Skip to content

refactor(proxy): separate runtime proxy identity from URL canonicalization #12

@newcodebook

Description

@newcodebook

背景

PR #11 已经合并,完成了 upstream proxy 配置能力的主体落地,并修复了此前 review 中的几个关键问题,包括:

  • 拆分全局 proxy 模式与 provider override 模式语义
  • 将 proxy apply / normalize / validate 逻辑收敛到 config 层
  • 按 effective proxy policy 复用 http.Client
  • 规范化 host / scheme 大小写与默认端口,避免 policy key 因 URL 文本差异而分裂

不过,当前 runtime identity 仍然基于 CanonicalProxyURL 的结果,而该 canonicalization 目前仍保留了 path / query / fragment

问题

当前像下面这些写法:

  • http://proxy.example
  • http://proxy.example/
  • http://proxy.example?x=1

对“首跳代理是谁”这个运行时语义来说是等价的,但仍会生成不同的 identity/policy key。结果是:

  • 连接池复用仍可能被无害文本改动打断
  • reload 时 runtime state 继承仍可能丢失
  • CanonicalProxyURL 同时承担“展示/存储规范化”和“运行时身份归一化”两种职责,边界不清晰

建议方向

建议把“配置文本 canonicalization”和“runtime proxy identity”明确拆开:

  • 保留当前 CanonicalProxyURL 的保守行为,用于配置展示 / 存储
  • 新增一个专门给 policy key / reload identity 使用的 EffectiveProxyIdentity(或类似命名)
  • 明确定义 runtime identity 为 scheme + authority (+userinfo)
  • path / query / fragment 二选一:
    • 校验阶段直接禁止
    • 或 identity 计算阶段统一忽略

验收标准

补齐至少以下等价性测试:

  • http://proxy.example vs http://proxy.example/
  • http://proxy.example vs http://proxy.example?x=1
  • http://proxy.example:80 vs http://proxy.example
  • http://USER:PASS@PROXY.EXAMPLE:80 vs http://USER:PASS@proxy.example

并确认上述等价写法不会再导致:

  • effectiveProviderProxyPolicy 分裂
  • reload 时 provider runtime identity 变化
  • 本可复用的 http.Client / connection pool 被重建

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions