/*!
|
|
* range-parser
|
|
* Copyright(c) 2012-2014 TJ Holowaychuk
|
|
* MIT Licensed
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
/**
|
|
* Module exports.
|
|
* @public
|
|
*/
|
|
|
|
module.exports = rangeParser;
|
|
|
|
/**
|
|
* Parse "Range" header `str` relative to the given file `size`.
|
|
*
|
|
* @param {Number} size
|
|
* @param {String} str
|
|
* @return {Array}
|
|
* @public
|
|
*/
|
|
|
|
function rangeParser(size, str) {
|
|
var valid = true;
|
|
var i = str.indexOf('=');
|
|
|
|
if (-1 == i) return -2;
|
|
|
|
var arr = str.slice(i + 1).split(',').map(function(range){
|
|
var range = range.split('-')
|
|
, start = parseInt(range[0], 10)
|
|
, end = parseInt(range[1], 10);
|
|
|
|
// -nnn
|
|
if (isNaN(start)) {
|
|
start = size - end;
|
|
end = size - 1;
|
|
// nnn-
|
|
} else if (isNaN(end)) {
|
|
end = size - 1;
|
|
}
|
|
|
|
// limit last-byte-pos to current length
|
|
if (end > size - 1) end = size - 1;
|
|
|
|
// invalid
|
|
if (isNaN(start)
|
|
|| isNaN(end)
|
|
|| start > end
|
|
|| start < 0) valid = false;
|
|
|
|
return {
|
|
start: start,
|
|
end: end
|
|
};
|
|
});
|
|
|
|
arr.type = str.slice(0, i);
|
|
|
|
return valid ? arr : -1;
|
|
}
|