Skip to content

Commit 333b718

Browse files
committed
fix: Should correctly handle range download n+1 issue
1 parent c56cc6f commit 333b718

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

packages/file-transfer/agent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export class DownloadAgent {
104104
const { contentLength, isAcceptRanges } = parseRangeInfo(response.headers)
105105
ranges = contentLength && isAcceptRanges
106106
? this.rangePolicy.computeRanges(contentLength)
107-
: [{ start: 0, end: contentLength }]
107+
: [{ start: 0, end: contentLength - 1 }]
108108
targetUrl = new URL(location)
109109
total = contentLength
110110
await handle.truncate(total)

packages/file-transfer/range.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ export async function * range(
5656

5757
let nextUrl = url
5858
while (true) {
59+
if (segment.start >= segment.end) {
60+
// the segment is finished, just ignore it
61+
return
62+
}
5963
try {
6064
const { opaque } = await stream(nextUrl, {
6165
method: 'GET',
@@ -84,7 +88,10 @@ export async function * range(
8488
}
8589
if (typeof responseHeaders['content-length'] === 'string') {
8690
contentLength = Number.parseInt(responseHeaders['content-length'] ?? '0')
87-
segment.end = contentLength
91+
const end = segment.start + contentLength - 1
92+
if (end !== segment.end) {
93+
segment.end = segment.start + contentLength
94+
}
8895
}
8996
return (opaque as any).fileStream as Writable
9097
})

0 commit comments

Comments
 (0)