diff --git a/.changeset/strict-byte-ranges.md b/.changeset/strict-byte-ranges.md new file mode 100644 index 0000000000..4a883a01ac --- /dev/null +++ b/.changeset/strict-byte-ranges.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Serve malformed byte-range requests as full downloads instead of partial responses. diff --git a/packages/kap-server/src/lib/httpRange.ts b/packages/kap-server/src/lib/httpRange.ts index dbc7b872eb..c8f577833c 100644 --- a/packages/kap-server/src/lib/httpRange.ts +++ b/packages/kap-server/src/lib/httpRange.ts @@ -22,13 +22,10 @@ export function parseRangeHeader( size: number, ): { start: number; end: number; length: number } | null { if (raw === undefined) return null; - if (!raw.startsWith('bytes=')) return null; - const spec = raw.slice('bytes='.length); - if (spec.includes(',')) return null; - const dash = spec.indexOf('-'); - if (dash < 0) return null; - const leftRaw = spec.slice(0, dash); - const rightRaw = spec.slice(dash + 1); + const match = /^bytes=(\d*)-(\d*)$/i.exec(raw.trim()); + if (match === null) return null; + const leftRaw = match[1] ?? ''; + const rightRaw = match[2] ?? ''; if (leftRaw === '' && rightRaw === '') return null; let start: number; let end: number; diff --git a/packages/kap-server/src/routes/files.ts b/packages/kap-server/src/routes/files.ts index ff74e99ffc..bb835a3473 100644 --- a/packages/kap-server/src/routes/files.ts +++ b/packages/kap-server/src/routes/files.ts @@ -22,6 +22,7 @@ import { } from '@moonshot-ai/agent-core-v2'; import { z } from 'zod'; +import { parseRangeHeader, pickHeader } from '../lib/httpRange'; import { requestLog } from '../lib/requestLog'; import { defineRoute } from '../middleware/defineRoute'; import { ErrorCode } from '../protocol/error-codes'; @@ -180,13 +181,10 @@ export function registerFilesRoutes(app: FilesRouteHost, core: Scope): void { // Browsers load