in src/main/java/org/apache/sling/servlets/get/impl/helpers/StreamRenderer.java [103:192]
public void render(SlingJakartaHttpServletRequest request, SlingJakartaHttpServletResponse response)
throws IOException {
// whether this servlet is called as of a request include
final boolean included = request.getAttribute(SlingConstants.ATTR_REQUEST_JAKARTA_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);
}
}
}
}