diff --git a/packages/file-transfer/agent.ts b/packages/file-transfer/agent.ts index d8f3dc05..94e94352 100644 --- a/packages/file-transfer/agent.ts +++ b/packages/file-transfer/agent.ts @@ -104,7 +104,7 @@ export class DownloadAgent { const { contentLength, isAcceptRanges } = parseRangeInfo(response.headers) ranges = contentLength && isAcceptRanges ? this.rangePolicy.computeRanges(contentLength) - : [{ start: 0, end: contentLength }] + : [{ start: 0, end: contentLength - 1 }] targetUrl = new URL(location) total = contentLength await handle.truncate(total) diff --git a/packages/file-transfer/range.ts b/packages/file-transfer/range.ts index a8aa6f19..1830b60f 100644 --- a/packages/file-transfer/range.ts +++ b/packages/file-transfer/range.ts @@ -56,6 +56,10 @@ export async function * range( let nextUrl = url while (true) { + if (segment.start >= segment.end) { + // the segment is finished, just ignore it + return + } try { const { opaque } = await stream(nextUrl, { method: 'GET', @@ -84,7 +88,10 @@ export async function * range( } if (typeof responseHeaders['content-length'] === 'string') { contentLength = Number.parseInt(responseHeaders['content-length'] ?? '0') - segment.end = contentLength + const end = segment.start + contentLength - 1 + if (end !== segment.end) { + segment.end = segment.start + contentLength + } } return (opaque as any).fileStream as Writable })