diff --git a/src/utils/handleRangeHeaders.js b/src/utils/handleRangeHeaders.js index cc94d66f6..509988ba3 100644 --- a/src/utils/handleRangeHeaders.js +++ b/src/utils/handleRangeHeaders.js @@ -3,16 +3,18 @@ import parseRange from 'range-parser'; export default function handleRangeHeaders(context, content, req, res) { // assumes express API. For other servers, need to add logic to access // alternative header APIs - res.setHeader('Accept-Ranges', 'bytes'); + res.set('Accept-Ranges', 'bytes'); - if (req.headers.range) { - const ranges = parseRange(content.length, req.headers.range); + const range = req.get('range'); + + if (range) { + const ranges = parseRange(content.length, range); // unsatisfiable if (ranges === -1) { - res.setHeader('Content-Range', `bytes */${content.length}`); + res.set('Content-Range', `bytes */${content.length}`); // eslint-disable-next-line no-param-reassign - res.statusCode = 416; + res.status(416); } else if (ranges === -2) { // malformed header treated as regular response context.logger.error( @@ -29,8 +31,8 @@ export default function handleRangeHeaders(context, content, req, res) { // Content-Range // eslint-disable-next-line no-param-reassign - res.statusCode = 206; - res.setHeader( + res.status(206); + res.set( 'Content-Range', `bytes ${ranges[0].start}-${ranges[0].end}/${length}` ); diff --git a/test/utils/handleRangeHeaders.test.js b/test/utils/handleRangeHeaders.test.js index d6bee49f5..d7a7378d1 100644 --- a/test/utils/handleRangeHeaders.test.js +++ b/test/utils/handleRangeHeaders.test.js @@ -17,16 +17,22 @@ describe('handleRangeHeaders', () => { headers: { range: 'bytes=1-4', }, + get(field) { + return this.headers[field]; + }, }; const res = { - setHeader: jest.fn(), + set: jest.fn(), + status(statusCode) { + this.statusCode = statusCode; + }, }; const contentRes = handleRangeHeaders(context, content, req, res); expect(contentRes).toEqual('bcde'); expect(res.statusCode).toEqual(206); - expect(res.setHeader.mock.calls).toMatchSnapshot(); + expect(res.set.mock.calls).toMatchSnapshot(); }); it('should handle malformed range header', () => { @@ -35,17 +41,23 @@ describe('handleRangeHeaders', () => { headers: { range: 'abc', }, + get(field) { + return this.headers[field]; + }, }; const res = { - setHeader: jest.fn(), + set: jest.fn(), + status(statusCode) { + this.statusCode = statusCode; + }, }; const contentRes = handleRangeHeaders(context, content, req, res); expect(contentRes).toEqual('abcdef'); expect(context.logger.error.mock.calls).toMatchSnapshot(); expect(res.statusCode).toBeUndefined(); - expect(res.setHeader.mock.calls).toMatchSnapshot(); + expect(res.set.mock.calls).toMatchSnapshot(); }); it('should handle unsatisfiable range', () => { @@ -54,16 +66,22 @@ describe('handleRangeHeaders', () => { headers: { range: 'bytes=10-20', }, + get(field) { + return this.headers[field]; + }, }; const res = { - setHeader: jest.fn(), + set: jest.fn(), + status(statusCode) { + this.statusCode = statusCode; + }, }; const contentRes = handleRangeHeaders(context, content, req, res); expect(contentRes).toEqual('abcdef'); expect(res.statusCode).toEqual(416); - expect(res.setHeader.mock.calls).toMatchSnapshot(); + expect(res.set.mock.calls).toMatchSnapshot(); }); it('should handle multiple ranges', () => { @@ -72,16 +90,22 @@ describe('handleRangeHeaders', () => { headers: { range: 'bytes=1-2,4-5', }, + get(field) { + return this.headers[field]; + }, }; const res = { - setHeader: jest.fn(), + set: jest.fn(), + status(statusCode) { + this.statusCode = statusCode; + }, }; const contentRes = handleRangeHeaders(context, content, req, res); expect(contentRes).toEqual('abcdef'); expect(context.logger.error.mock.calls).toMatchSnapshot(); expect(res.statusCode).toBeUndefined(); - expect(res.setHeader.mock.calls).toMatchSnapshot(); + expect(res.set.mock.calls).toMatchSnapshot(); }); });