fix: content-length is lost

Massimo Melina committed Jan 14, 2022 at 21:33 UTC 05dd943b9932ebaceab35d404edb22c2269a46bb
2 files changed +10 -3
src/serveFile.ts
+7 -3
@@ -40,8 +40,11 @@ export function serveFile(source:string, mime?:string) : Koa.Middleware {
40 ctx.status = 200
41 if (ctx.fresh)
42 return ctx.status = 304
43 - if (!range)
44 - return ctx.body = createReadStream(source)
43 + if (!range) {
44 + ctx.body = createReadStream(source)
45 + ctx.response.length = stats.size
46 + return
47 + }
48 const ranges = range.split('=')[1]
49 if (ranges.includes(','))
50 return ctx.throw(400, 'multi-range not supported')
@@ -49,7 +52,7 @@ export function serveFile(source:string, mime?:string) : Koa.Middleware {
52 if (!bytes?.length)
53 return ctx.throw(400, 'bad range')
54 const max = stats.size - 1
52 - let start = Number(bytes[0])
55 + let start = Number(bytes[0]) || 0
56 let end = Number(bytes[1]) || max
57 if (end > max || start > max) {
58 ctx.status = 416
@@ -60,5 +63,6 @@ export function serveFile(source:string, mime?:string) : Koa.Middleware {
63 ctx.status = 206
64 ctx.set('Content-Range', `bytes ${start}-${end}/${stats.size}`)
65 ctx.body = createReadStream(source, { start, end })
66 + ctx.response.length = end - start + 1
67 }
68 }
src/throttler.ts
+3
@@ -29,6 +29,9 @@ export function throttler(): Koa.Middleware {
29 if (!--ipGroup.count) // any left?
30 delete ip2group[ctx.ip]
31 })
32 + const bak = ctx.response.length // preserve
33 ctx.body = ctx.body.pipe(ts)
34 + if (bak)
35 + ctx.response.length = bak
36 }
37 }