diff --git a/packages/sirv/index.js b/packages/sirv/index.js index fe01068..c4a3538 100644 --- a/packages/sirv/index.js +++ b/packages/sirv/index.js @@ -73,7 +73,11 @@ function send(req, res, file, stats, headers) { let end = opts.end = parseInt(y, 10) || stats.size - 1; let start = opts.start = parseInt(x, 10) || 0; - if (start >= stats.size || end >= stats.size) { + if (end >= stats.size) { + end = stats.size - 1; + } + + if (start >= stats.size) { res.setHeader('Content-Range', `bytes */${stats.size}`); res.statusCode = 416; return res.end(); diff --git a/tests/sirv.js b/tests/sirv.js index 9aa4597..d378111 100644 --- a/tests/sirv.js +++ b/tests/sirv.js @@ -1017,11 +1017,11 @@ ranges('should assume the end-value is final byte when not included :: full', as } }); -ranges('should throw `416` when range cannot be met (overflow)', async () => { +ranges('should throw `416` when range start cannot be met (overflow)', async () => { let server = utils.http(); try { - let headers = { Range: 'bytes=0-123456' }; + let headers = { Range: 'bytes=123456-234567' }; let file = await utils.lookup('bundle.67329.js', 'utf8'); await server.send('GET', '/bundle.67329.js', { headers }).catch(err => { assert.is(err.headers['content-range'], `bytes */${file.size}`); @@ -1032,6 +1032,20 @@ ranges('should throw `416` when range cannot be met (overflow)', async () => { } }); +ranges('should shrink range end if it cannot be met (overflow)', async () => { + let server = utils.http(); + + try { + let headers = { Range: 'bytes=10-123456' }; + let file = await utils.lookup('bundle.67329.js', 'utf8'); + let res = await server.send('GET', '/bundle.67329.js', { headers }); + assert.is(res.headers['content-range'], `bytes 10-${file.size - 1}/${file.size}`); + assert.is(res.statusCode, 206); + } finally { + server.close(); + } +}); + ranges('should not mutate response headers on subsequent non-Range requests :: dev', async () => { let server = utils.http({ dev: true });