public void render()

in src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java [103:195]


    public void render(SlingHttpServletRequest request,
            SlingHttpServletResponse response) throws IOException {
    	
        // whether this servlet is called as of a request include
        final boolean included = request.getAttribute(SlingConstants.ATTR_REQUEST_SERVLET) != null;

        // ensure no extension or "res"
        String ext = request.getRequestPathInfo().getExtension();
        if (ext != null && !ext.equals(DefaultGetServlet.EXT_RES)) {
            request.getRequestProgressTracker().log(
                "StreamRendererServlet does not support for extension " + ext);
            if (included || response.isCommitted()) {
                log.error(
                    "StreamRendererServlet does not support extension {}",
                    ext);
            } else {
                response.sendError(HttpServletResponse.SC_NOT_FOUND);
            }
            return;
        }

        Resource resource = request.getResource();

        if (ResourceUtil.isNonExistingResource(resource)) {
            throw new ResourceNotFoundException("No data to render.");
        }
        // trailing slash on url means directory listing

        if ("/".equals(request.getRequestPathInfo().getSuffix())) {
            renderDirectory(request, response, included);
            return;
        }

        // check the last modification time and If-Modified-Since header
        if (!included) {
            ResourceMetadata meta = resource.getResourceMetadata();
            long modifTime = meta.getModificationTime();
            if (unmodified(request, modifTime)) {
                response.setStatus(SC_NOT_MODIFIED);
                return;
            }
        }

        // fall back to plain text rendering if the resource has no stream
        if (resource.getResourceType().equals(JcrConstants.NT_LINKEDFILE)) {
            final ValueMap vm = resource.adaptTo(ValueMap.class);
            final String actualResourcePath = vm.get(JcrConstants.JCR_CONTENT, String.class);
            resource = request.getResourceResolver().getResource(actualResourcePath);
            if (resource == null) {
                log.warn("Path {} does not exist",actualResourcePath);
                return;
            }
        }

        try (InputStream stream = resource.adaptTo(InputStream.class)) {
            if (stream != null) {
                if ( stream instanceof ExternalizableInputStream) {
                    response.sendRedirect(((ExternalizableInputStream)stream).getURI().toString());
                    return;
                }
                if (isHeadRequest(request)) {
                    setContentLength(response, resource.getResourceMetadata().getContentLength());
                    setHeaders(resource, response);
                    return;
                }
                streamResource(resource, stream, included, request, response);

            } else {

                // the resource is the root, do not redirect, immediately index
                if (isRootResourceRequest(resource)) {

                    renderDirectory(request, response, included);

                } else if (included || response.isCommitted() ) {

                    // request is included or committed, not redirecting
                    request.getRequestProgressTracker().log(
                        "StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");
                    log.warn("StreamRendererServlet: Not redirecting with trailing slash, response is committed or request included");

                } else {

                    // redirect to this with trailing slash to render the index
                    String url = request.getResourceResolver().map(request,
                        resource.getPath())
                        + "/";
                    response.sendRedirect(url);

                }
            }
        }
    }