in src/main/java/org/apache/sling/servlets/get/impl/RedirectServlet.java [84:153]
protected void doGet(SlingJakartaHttpServletRequest request, SlingJakartaHttpServletResponse response)
throws ServletException, IOException {
// handle json export of the redirect node
if (DefaultGetServlet.EXT_JSON.equals(request.getRequestPathInfo().getExtension())) {
defaultRenderServlet.service(request, response);
return;
}
// check for redirectability
if (response.isCommitted()) {
// committed response cannot be redirected
log.warn("RedirectServlet: Response is already committed, not redirecting");
request.getRequestProgressTracker().log("RedirectServlet: Response is already committed, not redirecting");
return;
} else if (request.getAttribute(SlingConstants.ATTR_REQUEST_JAKARTA_SERVLET) != null) {
// included request will not redirect
log.warn("RedirectServlet: Servlet is included, not redirecting");
request.getRequestProgressTracker().log("RedirectServlet: Servlet is included, not redirecting");
return;
}
String targetPath = null;
// convert resource to a value map
final Resource rsrc = request.getResource();
final ValueMap valueMap = rsrc.adaptTo(ValueMap.class);
if (valueMap != null) {
targetPath = valueMap.get(TARGET_PROP, String.class);
}
if (targetPath == null) {
// old behaviour
final Resource targetResource = request.getResourceResolver().getResource(rsrc, TARGET_PROP);
if (targetResource == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Missing target for redirection");
return;
}
// if the target resource is a path (string), redirect there
targetPath = targetResource.adaptTo(String.class);
}
// if we got a target path, make it external and redirect to it
if (targetPath != null) {
if (!isUrl(targetPath)) {
// make path relative and append selectors, extension etc.
// this is an absolute URI suitable for the Location header
targetPath = toRedirectPath(targetPath, request);
} else {
// just append any selectors, extension, suffix and query string
targetPath = appendSelectorsExtensionSuffixQuery(request, new StringBuilder(targetPath))
.toString();
}
final int status = getStatus(valueMap);
// redirect the client, use our own setup since we might have a
// custom response status and we already have converted the target
// into an absolute URI.
response.reset();
response.setStatus(status);
response.setHeader("Location", isUrl(targetPath) ? targetPath : response.encodeRedirectURL(targetPath));
response.flushBuffer();
return;
}
// no way of finding the target, just fail
response.sendError(HttpServletResponse.SC_NOT_FOUND, "Cannot redirect to target resource " + targetPath);
}