From ac789ffb837c99c6153d35be6e8a668e95720e04 Mon Sep 17 00:00:00 2001 From: annorax Date: Mon, 14 Dec 2015 19:45:16 +0200 Subject: [PATCH] Support range requests of the form bytes:-n Such requests mean "fetch n bytes from the end of the file". Currently such requests cause an exception. --- index.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index b75e0d3..efb8f80 100644 --- a/index.js +++ b/index.js @@ -139,8 +139,18 @@ var vidStreamer = function (req, res) { if (range !== undefined && (range = range.match(/bytes=(.+)-(.+)?/)) !== null) { // Check range contains numbers and they fit in the file. // Make sure info.start & info.end are numbers (not strings) or stream.pipe errors out if start > 0. - info.start = isNumber(range[1]) && range[1] >= 0 && range[1] < info.end ? range[1] - 0 : info.start; - info.end = isNumber(range[2]) && range[2] > info.start && range[2] <= info.end ? range[2] - 0 : info.end; + if (isNumber(range[1]) && range[1] >= 0 && range[1] < info.end) { + info.start = range[1] - 0; + } + if (isNumber(range[2]) && range[2] > info.start && range[2] <= info.end) { + info.end = range[2] - 0; + } + info.rangeRequest = true; + } else if (range !== undefined && (range = range.match(/bytes=-(.+)/)) !== null) { + // Check that the requested number of bytes from the end of the file doesn't exceed the file size. + if (isNumber(range[1]) && range[1] > 0 && range[1] <= info.size) { + info.start = info.size - range[1]; + } info.rangeRequest = true; } else if (reqUrl.query.start || reqUrl.query.end) { // This is a range request, but doesn't get range headers. So there.