"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = handleRangeHeaders; var _rangeParser = _interopRequireDefault(require("range-parser")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function handleRangeHeaders(context, content, req, res) { // assumes express API. For other servers, need to add logic to access // alternative header APIs if (res.set) { res.set("Accept-Ranges", "bytes"); } else { res.setHeader("Accept-Ranges", "bytes"); } let range; // Express API if (req.get) { range = req.get("range"); } // Node.js API else { ({ range } = req.headers); } if (range) { const ranges = (0, _rangeParser.default)(content.length, range); // unsatisfiable if (ranges === -1) { // Express API if (res.set) { res.set("Content-Range", `bytes */${content.length}`); res.status(416); } // Node.js API else { // eslint-disable-next-line no-param-reassign res.statusCode = 416; res.setHeader("Content-Range", `bytes */${content.length}`); } } else if (ranges === -2) { // malformed header treated as regular response context.logger.error("A malformed Range header was provided. A regular response will be sent for this request."); } else if (ranges.length !== 1) { // multiple ranges treated as regular response context.logger.error("A Range header with multiple ranges was provided. Multiple ranges are not supported, so a regular response will be sent for this request."); } else { // valid range header const { length } = content; // Express API if (res.set) { // Content-Range res.status(206); res.set("Content-Range", `bytes ${ranges[0].start}-${ranges[0].end}/${length}`); } // Node.js API else { // Content-Range // eslint-disable-next-line no-param-reassign res.statusCode = 206; res.setHeader("Content-Range", `bytes ${ranges[0].start}-${ranges[0].end}/${length}`); } // eslint-disable-next-line no-param-reassign content = content.slice(ranges[0].start, ranges[0].end + 1); } } return content; }