private Servlet resolveServletInternal()

in src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java [456:521]


    private Servlet resolveServletInternal(
            final SlingJakartaHttpServletRequest request,
            final Resource resource,
            final String scriptNameOrResourceType,
            final ResourceResolver resolver) {
        Servlet servlet = null;

        if (isInvalidPath(scriptNameOrResourceType)) {
            if (request != null) {
                request.getRequestProgressTracker()
                        .log(
                                "Will not look for a servlet at {0} as it contains more than two consecutive dots",
                                scriptNameOrResourceType);
            }
            return null;
        }

        // first check whether the type of a resource is the absolute
        // path of a servlet (or script)
        if (scriptNameOrResourceType.charAt(0) == '/') {
            final String scriptPath = ResourceUtil.normalize(scriptNameOrResourceType);
            if (scriptPath != null && isPathAllowed(scriptPath, this.executionPaths.get())) {
                final Resource res =
                        AbstractResourceCollector.getResourceOrNull(resolver, scriptPath, useResourceCaching);
                servlet = this.getServlet(res);
                if (servlet != null && !pathBasedServletAcceptor.accept(request, servlet)) {
                    if (LOGGER.isDebugEnabled()) {
                        LOGGER.debug(
                                "Servlet {} rejected by {} returning FORBIDDEN status",
                                RequestUtil.getServletName(servlet),
                                pathBasedServletAcceptor.getClass().getSimpleName());
                    }
                    servlet = forbiddenPathServlet;
                } else if (servlet != null && LOGGER.isDebugEnabled()) {
                    LOGGER.debug(
                            "Servlet {} found using absolute resource type {}",
                            RequestUtil.getServletName(servlet),
                            scriptNameOrResourceType);
                }
            } else {
                if (request != null) {
                    request.getRequestProgressTracker()
                            .log(
                                    "Will not look for a servlet at {0} as it is not in the list of allowed paths",
                                    scriptNameOrResourceType);
                }
            }
        }
        if (servlet == null) {
            // the resource type is not absolute, so lets go for the deep search
            final AbstractResourceCollector locationUtil;
            if (request != null) {
                locationUtil = ResourceCollector.create(
                        request, this.executionPaths.get(), this.defaultExtensions.get(), this.useResourceCaching);
            } else {
                locationUtil = NamedScriptResourceCollector.create(
                        scriptNameOrResourceType, resource, this.executionPaths.get(), this.useResourceCaching);
            }
            servlet = getServletInternal(locationUtil, request, resolver);

            if (servlet != null && LOGGER.isDebugEnabled()) {
                LOGGER.debug("getServletInternal returns servlet {}", RequestUtil.getServletName(servlet));
            }
        }
        return servlet;
    }