Skip to content

NO_PROXY 含 IPv6 CIDR 时,auth login 等直接使用 httpx 的命令报 InvalidURL #28

Open

Description

@qiqvmengsheng

现象

环境变量 NO_PROXY/no_proxy 中包含 IPv6 CIDR(例如 Tailscale 默认网段 fd7a:115c:a1e0::/48)时,凡是直接创建 httpx.AsyncClient 的命令都会在建立客户端时失败。例如 bili auth login:

$ NO_PROXY=fd7a:115c:a1e0::/48 no_proxy=fd7a:115c:a1e0::/48 bili auth login
{"ok": false, "error": {"code": "internal_error", "message": "InvalidURL: Invalid port: '115c:a1e0::'", "hint": "这是 bili-cli 的 bug,请把完整输出提交到 issue。"}}

去掉这一项后同一命令正常(扫码登录成功)。

环境

  • bili-agent 1.3.0(uv tool install bili-agent)
  • httpx 0.28.1,Python 3.13,Ubuntu 24.04 x86_64
  • 该 NO_PROXY 由 Tailscale 与本地代理共存配置写入系统环境,Agent 子进程会继承

原因

根因在 httpx:get_environment_proxies() 把 IPv6 CIDR 拼成 all://[fd7a:115c:a1e0::/48],/48 落在方括号内,URL 解析时把后半段当成端口。不依赖 bili-cli 的最小复现:

$ NO_PROXY=fd7a:115c:a1e0::/48 python -c "import httpx; httpx.Client()"
httpx.InvalidURL: Invalid port: '115c:a1e0::'

上游已有报告 encode/httpx#3221,修复 PR encode/httpx#3741 尚未合并、未发布。

影响范围

走 bilibili_api(curl-cffi)的命令不受影响,例如 bili search video 和 bili auth status 正常。直接使用 httpx 的路径会失败,包括:

  • commands/auth.py 的扫码登录
  • runtime.web_client(),以及使用它的私信、互动、截帧、ASR 等功能
  • commands/video.py 中的两处 httpx.AsyncClient
  • asr/engines.py

建议

在 httpx 发布修复前,可考虑在 bili-cli 侧规避,例如:

  1. 集中创建 httpx 客户端;遇到 InvalidURL 时,过滤掉 NO_PROXY 中 httpx 无法解析的 IPv6 CIDR 后重试,或改为自行构造 mounts。
  2. 至少把这一错误识别为环境配置问题,提示检查 NO_PROXY 中的 IPv6 CIDR,而不是提示"bili-cli 的 bug"。

临时规避方法:调用时从 NO_PROXY/no_proxy 中去掉 IPv6 CIDR 项。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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