final Pattern pattern = Pattern.compile("bytes=(\\d+)-(\\d+)?");
final Matcher matcher = pattern.matcher(rangeHeader);
if ( !matcher.matches() ) {
log.error("Bad \"Range\" header: " + rangeHeader);
throw new BadRequestException("Invalid range", 416);
}
try {
long beginPos = Long.parseLong(matcher.group(1));
long endPos = -1;
String endMatch = matcher.group(2);
if ( endMatch != null ) {
endPos = Long.parseLong(endMatch);
}
final long trackLength = new File(track.getPath()).length();
if ( endPos < 0 ) {
endPos = trackLength - 1;
}
if ( beginPos < 0 || beginPos >= trackLength
|| endPos >= trackLength || endPos <= beginPos ) {
log.error("Bad \"Range\" values: " + beginPos + "-" + endPos);
throw new BadRequestException("Invalid range", 416);
}
return new Range(beginPos, endPos);
} catch (NumberFormatException e) {
log.error("Bad \"Range\" header", e);
throw new BadRequestException("Invalid range", 416);
}
}