functionrangeParser(size, str, options) { if (typeof str !== 'string') { thrownewTypeError('argument str must be a string') }
var index = str.indexOf('=')
if (index === -1) { // -2: 表示str是一个不符合range语法的字符串 return-2 }
// split the range string // 将多个range以逗号分割 var arr = str.slice(index + 1).split(',') var ranges = []
// add ranges type // 获取单位<unit>,这个单位一般为bytes ranges.type = str.slice(0, index)
// parse all ranges for (var i = 0; i < arr.length; i++) { var range = arr[i].split('-') var start = parseInt(range[0], 10) var end = parseInt(range[1], 10)
// -nnn // 如果没有起始范围(索引),如:bytes=-10 if (isNaN(start)) { start = size - end end = size - 1 // nnn- // 如果没有结束范围(索引),如:bytes=10- } elseif (isNaN(end)) { end = size - 1 } // limit last-byte-pos to current length // 如果结束索引超出了最大索引,那么设置结束索引为最大索引 if (end > size - 1) { end = size - 1 }
// invalid or unsatisifiable // 如果经过上面处理之后,还有一些无效的情况 // 如:起始索引大于结束索引,或者开始索引是负数等 // 那么跳过这些情况 if (isNaN(start) || isNaN(end) || start > end || start < 0) { continue }
// add range ranges.push({ start: start, end: end }) }