in src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java [225:278]
private void streamResource(
final Resource resource,
final InputStream stream,
final boolean included,
final SlingJakartaHttpServletRequest request,
final SlingJakartaHttpServletResponse response)
throws IOException {
// finally stream the resource
final ArrayList<Range> ranges;
if (included) {
// no range support on included requests
ranges = FULL;
} else {
// parse optional ranges
ranges = parseRange(request, response, resource.getResourceMetadata());
if (ranges == null) {
// there was something wrong, the parseRange has sent a
// response and we are done
return;
}
// set various response headers, unless the request is included
setHeaders(resource, response);
}
ServletOutputStream out = response.getOutputStream();
if (ranges == FULL) {
// return full resource
setContentLength(response, resource.getResourceMetadata().getContentLength());
byte[] buf = new byte[IO_BUFFER_SIZE];
int rd;
while ((rd = stream.read(buf)) >= 0) {
out.write(buf, 0, rd);
}
} else {
// return ranges of the resource
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
if (ranges.size() == 1) {
Range range = ranges.get(0);
response.addHeader("Content-Range", "bytes " + range.start + "-" + range.end + "/" + range.length);
setContentLength(response, range.end - range.start + 1);
copy(stream, out, range);
} else {
response.setContentType("multipart/byteranges; boundary=" + mimeSeparation);
copy(resource, out, ranges.iterator());
}
}
}