static virtual NanoHTTPD.Response subBot_serveFileRange(File file, S mimeType, S rangeHeader) ctex { S rangeValue = dropPrefix("bytes=", trim(rangeHeader)); long fileLength = file.length(), start, end; if (rangeValue.startsWith("-")) { end = fileLength-1; start = fileLength-1-parseLong(dropPrefix("-", rangeValue)); } else { S[] range = rangeValue.split("-"); start = parseLong(range[0]); end = range.length > 1 ? min(fileLength-1, parseLong(range[1])) : fileLength-1; } if (start <= end) { long contentLength = end-start+1; FileInputStream fileInputStream = new(file); fileInputStream.skip(start); virtual Response response = subBot_servePartialContent(mimeType, fileInputStream, contentLength); call(response, "addHeader", "Content-Range", "bytes " + start + "-" + end + "/" + fileLength); ret response; } else ret subBot_serveRangeNotSatisfiable(rangeHeader); }