in src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java [228:283]
private void streamResource(final Resource resource,
final InputStream stream, final boolean included,
final SlingHttpServletRequest request,
final SlingHttpServletResponse 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());
}
}
}