Skip to content

fix(checkin): 正确透传 HTTP 状态与响应,修复 401 刷新并发问题 (#7) - #14

Merged
hawklithm merged 8 commits into
mainfrom
fix/checkin-transparent-proxy-after-pr7
Oct 22, 2026
Merged

hawklithm merged 8 commits into
mainfrom
fix/checkin-transparent-proxy-after-pr7

Conversation

@hawklithm

@hawklithm hawklithm commented Oct 22, 2026 •

Copy link
Copy Markdown
Owner

背景

PR #7(#7,已于 2026-10-22 合并)新增签到代理端点。按仓库维护者的要求,先合并原贡献,再从合并后的 main 独立修复 review 中列出的阻断问题,保留原作者贡献和审查历史。

修复

  • GET 及 POST /v1/checkin-status -> 上游均为 POST /v2/billing/meter/checkin-status,发送空 JSON {};已直连验证 GET 返回 404,POST 返回 200;兼容只支持 POST 的客户端调用。
  • POST /v1/checkin -> 上游 POST /v2/billing/meter/daily-checkin,保持空 JSON 请求体。
  • 直接透传上游 HTTP 状态码、原始响应字节、Content-Type;不再包装为 {status:"ok",upstream:...},包括 400/401/429/5xx、HTML、文本、非 dict JSON 和二进制响应。
  • 遇 401 时使用 CodeBuddyClient.refresh() 明确刷新,而不是原先不会强制刷新的 ensure_authenticated(False);刷新成功且 access token 发生变化后最多重试一次,刷新失败/异常则保留原始 401,记录脱敏错误类型。
  • 并发 401 在异步锁内比较原始 Authorization;只有第一个请求刷新 token,后续请求复用新的 token。网络超时映射为 504,连接错误映射为 502,不再出现意外 500 或假 200。
  • 独立 billing_proxy.py,主代理入口只保留两个极简路由。

验证

使用 httpx.MockTransport 的 27 个新增接口级回归测试(无需真实账号及上游访问)覆盖:GET/POST 方法和 body、原始响应结构、400/401/429/500/503、HTTP 401 刷新成功/失败/抛错/token 未变、刷新后依然 401 最多两次请求、超时/连接失败、非 JSON 和二进制、局部认证失败、并发三请求共一次 token 刷新。

Windows 隔离 worktree 中按如下命令执行:

python -m pytest -q --tb=short -k "not test_session_profiles_are_isolated_and_saved_with_metadata"

结果:200 passed, 1 skipped, 1 deselected。唯一排除的 test_backend_profiles.py::test_session_profiles_are_isolated_and_saved_with_metadata 测试在 Windows 上将文件 POSIX 权限严格断言为 0600,在原主线同环境已失败,与签到实现无关;test_login_headers 当前已通过。

本 PR 不自动合并,请审查新契约和测试后再合并。原 PR #7 的旧 CHANGES_REQUESTED 在“先合并、另开修复 PR”的维护策略下撤销,并不代表旧问题原先已解决。

@hawklithm
hawklithm merged commit 28061d4 into main Oct 22, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant