You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

76 lines
2.3 KiB

"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;
}