private void streamResource()

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());
            }

        }
    }