diff --git a/lib/core/index.js b/lib/core/index.js index 920e55b9..bb95e23a 100644 --- a/lib/core/index.js +++ b/lib/core/index.js @@ -281,7 +281,7 @@ module.exports = function createMiddleware(_dir, _options) { let fstream = null; if (start > end || isNaN(start) || isNaN(end)) { - status['416'](res, next); + status['416'](res, next, { size: total }); return; } diff --git a/lib/core/status-handlers.js b/lib/core/status-handlers.js index 78c1772a..5743741b 100644 --- a/lib/core/status-handlers.js +++ b/lib/core/status-handlers.js @@ -41,8 +41,9 @@ exports['404'] = (res, next) => { } }; -exports['416'] = (res, next) => { +exports['416'] = (res, next, opts) => { res.statusCode = 416; + res.setHeader('content-range', 'bytes */' + opts.size) if (typeof next === 'function') { next(); } else if (res.writable) { diff --git a/test/range.test.js b/test/range.test.js index 45fa42be..07cd6a10 100644 --- a/test/range.test.js +++ b/test/range.test.js @@ -46,8 +46,28 @@ test('range past the end', (t) => { }); }); +test('range starts beyond the end', (t) => { + t.plan(4); + const server = http.createServer(ecstatic(`${__dirname}/public/subdir`)); + t.on('end', () => { server.close(); }); + + server.listen(0, () => { + const port = server.address().port; + const opts = { + uri: `http://localhost:${port}/e.html`, + headers: { range: '500-' }, + }; + request.get(opts, (err, res, body) => { + t.ifError(err); + t.equal(res.statusCode, 416, 'range error status code'); + t.equal(res.headers['content-range'], 'bytes */11'); + t.equal(body, 'Requested range not satisfiable'); + }); + }); +}); + test('NaN range', (t) => { - t.plan(3); + t.plan(4); const server = http.createServer(ecstatic(`${__dirname}/public/subdir`)); t.on('end', () => { server.close(); }); @@ -60,13 +80,14 @@ test('NaN range', (t) => { request.get(opts, (err, res, body) => { t.ifError(err); t.equal(res.statusCode, 416, 'range error status code'); + t.equal(res.headers['content-range'], 'bytes */11'); t.equal(body, 'Requested range not satisfiable'); }); }); }); test('flipped range', (t) => { - t.plan(3); + t.plan(4); const server = http.createServer(ecstatic(`${__dirname}/public/subdir`)); t.on('end', () => { server.close(); }); @@ -79,6 +100,7 @@ test('flipped range', (t) => { request.get(opts, (err, res, body) => { t.ifError(err); t.equal(res.statusCode, 416, 'range error status code'); + t.equal(res.headers['content-range'], 'bytes */11'); t.equal(body, 'Requested range not satisfiable'); }); });