#21055·ai

当 fetch 包装器保留响应副本时, fetchWithValidatedRedirects 会停止

作者: brennanbutler01创建于 2026年9月18日更新于 2026年9月18日
标签task-identify-issue-type-donetask-bug-reproduction-successfactory-activefactory-automatictask-identify-harness-labels-done

说明

跟进# 18048 中的共享- 帮助笔记 : 如果一个自定义的抓取包保留了重定向响应的克隆, 则在跟踪重定向之前, “ 切换重定向” 摊位 。

帮助者在请求下一个URL之前等待“取消答复(答复)”。 `Response.clone ()'将身体分为两条溪流,取消一分行可以等待另一分行. 因此,SDK呼叫要等包装器读取或取消其保留的副本后再进行. 这可能会让一个处理下载完成后保存的回复的包装器陷入僵局.

#18048固定了xAI特有HTTP 202处理器,并注意了这个重定向路径作为未经验证的后继. 以下复制确认共享帮助者也受到影响.

  • 复制

不需要网络呼叫或 API 密钥 。 安装 {ai-sdk/ profer-utils@ 5.0.40'和[email protected]',但以repro.mts'为限,并用节点24运行`node repro.mts':

从“ ai- sdk/ professor- utils” 中导入 { 获取已验证的指令 ;

c. 请求:字符串[] = []; 让保存的答复:未定义的反应; 让状态 = “待发”; const into = promise. with Resolvers () ; 堆起假图:取出类型 = aync 输入 {{ url = 字符串(输入); a. 请求.push(url); 如果 (url.endsWith ('/ sart')) { Const 响应 = 新响应 ('moved', { 状态: 302,标题:{位置:'https://example.test/final'},

  • ; / 模拟取回包装, 保留回复副本 。 已保存Response = reswer.clone (); 已输入. resolve (); 返回回复; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回新响应('合成文件');
  • ; 康斯特下载 = 取回Valided Redictions ({) url:"https://example.test/start",取自:假法奇, }),然后(答复 {{状态='已解决';返回答复;}); 尝试{ 等待输入。 保证; 等待新的承诺( 解决 QQ 设置 Timeout( 解决, 100) ); control.log({状态,请求}); // 预期:解决了,同时要求/开始和/最后。 终于 / 读取被保留的克隆会发布共享的取消承诺. 等待已保存的答复?.arrayBuffer(); const响应=等待下载; control.log ('在读取了克隆后 :', 状态, 等待响应. text () ); {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

实际产出:

页:1
{状态:'待发',请求: ['https://example.test/start']}
读取克隆后: 解析合成文件

预期:SDK请求`/最后'并解决,而不等待包装员阅读所保存的副本。

删除`reswer.clone ()' 即可立即完成重定向。 在对22.20.0和24.13.0号节点的局部测试中,所有5个转动状态(301,302,303,307,308)被一个未读克隆人拖住. 9个控制通过:这些状态没有克隆,读取或取消克隆,一个没有躯体的重定向,以及一个保留克隆的非重定向反应. 每一个测试排水管都保留了尸体进行清理.

复制通过严格的TypeScript检查. 在 " main " at 12845693d7a6a517dc633d6b6a2e4f5bfd24d2ec " (资料来源比较;使用的运行时间测试)上,这两个帮助者没有变化。 . . . . . . .