Repository navigation
Replies: 1 comment
|
@TT-Wang 这份报告的根因定位是对的,我在 一、复现确认(httpx 0.28.1 / CPython 3.13.9)
即 httpx 把每个 no_proxy 条目当 URL 解析, 范围收窄一点:不是「Python 全都坏」。实测三种客户端:
所以受害面精确地是「把 NO_PROXY 条目按 URL authority 语法解析」的客户端,httpx 是典型。你那条 huggingface_hub 报错正是 httpx 形状( 二、导出的两条路径(其中一条与你的表不同)方括号来自 export const LOOPBACK_NO_PROXY = ['localhost', '127.0.0.1', '::1', '[::1]']
所以你表里的第一行需要更正: 这不只是表格问题,它扩大了影响面:在 harness 进程内跑的 Python(而不只是派生的子进程)也会读到带方括号的值。唯一不受影响的是宿主自己的 三、决定修法的一件事:方括号不能直接删这是本报告最关键、也最容易修错的地方。 它唯一的载荷点是「子进程里 Node 原生 fetch 读环境变量」这条通道。 用
原因 = Node 26.5.0 内置 undici 为 8.7.0,其 const parsed = entry.match(/^(.+):(\d+)$/) // [::1] 不匹配;::1 被拆成 host ":" port 1即 于是现状两头都真:
我验过有没有两边都接受的写法( 四、我认为根因在「通道选择」而非那一行常量
一个解析器版本相关的补丁,放在所有语言共用的
顺带: 五、插件可挂载面判定(本轮扫描结论)我按惯例查了能否以插件形态兜:
判定:缺口在 core 面( 以上每条都标了测法与版本,方便复核;需要的话我可以把三份复现脚本(httpx / Node 原生 fetch / undici 版本矩阵)贴上来。 |
Uh oh!
There was an error while loading. Please reload this page.
在 0.1.5-rc.1(上游 master
2377c272a8)上确认:harness 导出给子进程的NO_PROXY里带一个方括号条目[::1],Python 的httpx会因此拒绝整个变量,于是任何用trust_env=True构造客户端的 Python 工具链在 harness 里直接抛错。差异出现在哪一层很关键,我两边都量了:
NO_PROXYlocalhost,127.0.0.1,::1localhost,127.0.0.1,::1(原样继承,干净)localhost,127.0.0.1,::1,[::1]宿主自己的环境没问题,方括号是加在派生给子进程的那一份上的。这也是它难查的原因。
缺陷位置
packages/util/http-proxy/src/policy.ts:33紧邻的注释解释了理由,而且对 undici 是对的:undici 的匹配器会把裸
::1读成 host:port1,所以必须同时列出带方括号的写法。问题不在这个常量本身,在于这份列表被原样导出成了通用环境变量。导出点在
install.ts:262-278的proxyEnvironmentForChild(),关键是:271-272:对
httpProxy/httpsProxy,用户写了什么子进程就拿什么;但对noProxy,named恒为false,子进程永远拿派生值。这正好解释了宿主与子进程为什么不一致。policy.ts:250的注释也表明导出是有意的:「The bypass list carriesLOOPBACK_NO_PROXYfor the consumers that read an environment rather than a policy」。但NO_PROXY是所有语言的 HTTP 栈都会读的变量,方括号属于 URL authority 语法,不属于no_proxy条目。复现
宿主侧,在设了
HTTP_PROXY的 shell 里起dsh web,会话里用 bash 工具跑:得到
"localhost,127.0.0.1,::1,[::1]"。客户端侧(httpx 0.28.1 / CPython 3.12):
版本核对
npm
latest的 0.1.3-alpha.2、alpha的 0.1.5-alpha.2、next的 0.1.5-rc.1,policy.ts:33三者一致。git diff dsh-v0.1.5-alpha.1 2377c272a8 -- packages/util/http-proxy/只动了 README 和package.json,policy.ts与install.ts都没进 diff。该文件最近一次改动是93bba8ef67(2026-09-02,关于NODE_USE_ENV_PROXY),与本问题无关。实际代价
一个在 harness 里于 Python 仓库工作的 agent 加载不了 sentence-transformers 模型:
huggingface_hub用trust_env=True,Hub 路径死在方括号条目上,本地缓存又未命中,报错是表象是「目标仓库的模型加载坏了」,报错里没有任何东西指向 harness。
建议修法
进程内给 undici 消费的策略保留
[::1],但在proxyEnvironmentForChild()导出的副本上把方括号规范化掉(或不导出该条目)。同一个文件里已经有正确写法:isLoopbackHost()(policy.ts:257-258)自己匹配时就会剥方括号——所以仓库已经知道方括号该剥,只是导出到环境的那一份漏了。另外
install.ts:246自己写着「Node 的NO_PROXY规则……与本包不同」,而导出的环境变量正是这个差异不再是内部实现细节的地方。想问维护者一句:导出副本做规范化(剥方括号)和干脆不把
[::1]放进导出列表,哪个更符合你们对proxyEnvironmentForChild的定位?前者对只认裸::1的客户端更友好,后者改动面更小。All reactions