| /*! |
| * 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; |
| } |