From 2e8badf100f06b446b03ac1c97497347d6ea974e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 11 Apr 2026 00:57:49 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dcontent-range=E8=A7=A3?= =?UTF-8?q?=E6=9E=90NaN=E9=97=AE=E9=A2=98=E5=92=8CHEAD=E9=A2=84=E6=A3=80?= =?UTF-8?q?=E9=9D=99=E9=BB=98=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 提取parseTotalSize()工具函数,正确处理畸形content-range头 - HEAD预检失败时输出警告日志而非完全静默 Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/f10f1b02-ed4e-4ee8-ac27-0580c1cf8a7e Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- server/age-os/mcp-server/cos.js | 23 +++++++++++++++---- .../mcp-server/tools/corpus-extractor-ops.js | 8 +++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/server/age-os/mcp-server/cos.js b/server/age-os/mcp-server/cos.js index a3dcf5a4..2fd336ce 100644 --- a/server/age-os/mcp-server/cos.js +++ b/server/age-os/mcp-server/cos.js @@ -251,6 +251,23 @@ async function head(bucket, key) { }; } +/** + * 从响应头解析文件总大小(content-range 或 content-length) + */ +function parseTotalSize(headers) { + // content-range 格式: bytes 0-1023/665000000 + const range = headers['content-range']; + if (range) { + const parts = range.split('/'); + if (parts.length === 2) { + const size = parseInt(parts[1], 10); + if (!isNaN(size)) return size; + } + } + const cl = parseInt(headers['content-length'] || '0', 10); + return isNaN(cl) ? 0 : cl; +} + /** * 分块读取大文件 — 仅读取前 N 字节用于预览/采样 * 适用于超大语料文件的类型检测和内容预览 @@ -286,8 +303,7 @@ async function readPartial(bucket, key, maxBytes) { res.on('end', () => { try { const buffer = Buffer.concat(chunks); - const totalSize = parseInt(res.headers['content-range']?.split('/')[1] || '0', 10) - || parseInt(res.headers['content-length'] || '0', 10); + const totalSize = parseTotalSize(res.headers); resolve({ content: buffer.toString('utf8'), size_bytes: buffer.length, @@ -303,8 +319,7 @@ async function readPartial(bucket, key, maxBytes) { if (chunks.length > 0) { try { const buffer = Buffer.concat(chunks); - const totalSize = parseInt(res.headers['content-range']?.split('/')[1] || '0', 10) - || parseInt(res.headers['content-length'] || '0', 10); + const totalSize = parseTotalSize(res.headers); resolve({ content: buffer.toString('utf8'), size_bytes: buffer.length, diff --git a/server/age-os/mcp-server/tools/corpus-extractor-ops.js b/server/age-os/mcp-server/tools/corpus-extractor-ops.js index a00386a8..a001eeb4 100644 --- a/server/age-os/mcp-server/tools/corpus-extractor-ops.js +++ b/server/age-os/mcp-server/tools/corpus-extractor-ops.js @@ -172,8 +172,12 @@ async function cosExtractCorpus(input) { try { const meta = await cos.head(bucket, key); fileSize = meta.size_bytes; - } catch { - // HEAD 不支持时跳过,由后续读取处理 + } catch (headErr) { + // HEAD失败不阻断流程(部分COS配置不支持HEAD),用0继续 + // 但如果是认证/桶不存在等严重错误,后续read也会失败 + if (headErr.message && !headErr.message.includes('405') && !headErr.message.includes('403')) { + console.log(` ⚠️ HEAD预检失败: ${headErr.message},继续尝试读取`); + } } // ZIP文件始终返回提示(无论大小),因为需要二进制解析