This is an automated email from the ASF dual-hosted git repository.

radu pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly.git


The following commit(s) were added to refs/heads/master by this push:
     new ddfc954  SLING-7685 - data-sly-resource throws 
RecursionTooDeepException when used with dynamic variables that are null / empty
ddfc954 is described below

commit ddfc9544bf97ab1ae74e294ce080a9d301980135
Author: Radu Cotescu <[email protected]>
AuthorDate: Mon Jun 18 17:52:54 2018 +0200

    SLING-7685 - data-sly-resource throws RecursionTooDeepException when used 
with dynamic variables that are null / empty
    
    * skip resource include if the include points to the same resource / 
selectors / resource type combination
    as the request's current resource
---
 .../engine/extension/ResourceRuntimeExtension.java | 34 ++++++++++++++++------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java
 
b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java
index 2450637..45b1f4a 100644
--- 
a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java
+++ 
b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java
@@ -43,6 +43,8 @@ import 
org.apache.sling.scripting.sightly.impl.utils.BindingsUtils;
 import org.apache.sling.scripting.sightly.render.RenderContext;
 import org.apache.sling.scripting.sightly.render.RuntimeObjectModel;
 import org.osgi.service.component.annotations.Component;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Runtime support for including resources in a HTL script through {@code 
data-sly-resource}.
@@ -55,6 +57,8 @@ import org.osgi.service.component.annotations.Component;
 )
 public class ResourceRuntimeExtension implements RuntimeExtension {
 
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(ResourceRuntimeExtension.class);
+
     private static final String OPTION_RESOURCE_TYPE = "resourceType";
     private static final String OPTION_PATH = "path";
     private static final String OPTION_PREPEND_PATH = "prependPath";
@@ -81,7 +85,7 @@ public class ResourceRuntimeExtension implements 
RuntimeExtension {
         if (pathObj instanceof Resource) {
             Resource includedResource = (Resource) pathObj;
             RequestDispatcherOptions requestDispatcherOptions = 
handleDispatcherOptions(request, new LinkedHashSet<String>(), opts, 
runtimeObjectModel);
-            includeResource(bindings, printWriter, includedResource, 
requestDispatcherOptions);
+            includeResource(request, bindings, printWriter, includedResource, 
requestDispatcherOptions);
         } else {
             String includePath = runtimeObjectModel.toString(pathObj);
             // build path completely
@@ -93,17 +97,17 @@ public class ResourceRuntimeExtension implements 
RuntimeExtension {
                 if (includedResource != null) {
                     RequestDispatcherOptions requestDispatcherOptions =
                             handleDispatcherOptions(request, new 
LinkedHashSet<String>(), opts, runtimeObjectModel);
-                    includeResource(bindings, printWriter, includedResource, 
requestDispatcherOptions);
+                    includeResource(request, bindings, printWriter, 
includedResource, requestDispatcherOptions);
                 } else {
                     // analyse path and decompose potential selectors from the 
path
                     pathInfo = new PathInfo(includePath);
                     RequestDispatcherOptions requestDispatcherOptions = 
handleDispatcherOptions(request, pathInfo.selectors, opts, runtimeObjectModel);
-                    includeResource(bindings, printWriter, pathInfo.path, 
requestDispatcherOptions);
+                    includeResource(request, bindings, printWriter, 
pathInfo.path, requestDispatcherOptions);
                 }
             } else {
                 // use the current resource
                 RequestDispatcherOptions requestDispatcherOptions = 
handleDispatcherOptions(request, new LinkedHashSet<String>(), opts, 
runtimeObjectModel);
-                includeResource(bindings, printWriter, request.getResource(), 
requestDispatcherOptions);
+                includeResource(request, bindings, printWriter, 
request.getResource(), requestDispatcherOptions);
             }
         }
         ExtensionUtils.setRequestAttributes(request, originalAttributes);
@@ -236,11 +240,11 @@ public class ResourceRuntimeExtension implements 
RuntimeExtension {
         return StringUtils.isNotEmpty(selectorString) ? selectorString : null;
     }
 
-    private void includeResource(final Bindings bindings, PrintWriter out, 
String path, RequestDispatcherOptions requestDispatcherOptions) {
+    private void includeResource(SlingHttpServletRequest request, final 
Bindings bindings, PrintWriter out, String path,
+                                 RequestDispatcherOptions 
requestDispatcherOptions) {
         if (StringUtils.isEmpty(path)) {
             throw new SightlyException("Resource path cannot be empty");
         } else {
-            SlingHttpServletRequest request = 
BindingsUtils.getRequest(bindings);
             Resource includeRes = request.getResourceResolver().resolve(path);
             if (ResourceUtil.isNonExistingResource(includeRes)) {
                 String resourceType = request.getResource().getResourceType();
@@ -249,16 +253,28 @@ public class ResourceRuntimeExtension implements 
RuntimeExtension {
                 }
                 includeRes = new 
SyntheticResource(request.getResourceResolver(), path, resourceType);
             }
-            includeResource(bindings, out, includeRes, 
requestDispatcherOptions);
+            includeResource(request, bindings, out, includeRes, 
requestDispatcherOptions);
         }
     }
 
-    private void includeResource(final Bindings bindings, PrintWriter out, 
Resource includeRes, RequestDispatcherOptions requestDispatcherOptions) {
+    private void includeResource(SlingHttpServletRequest request, final 
Bindings bindings, PrintWriter out, Resource includeRes,
+                                 RequestDispatcherOptions 
requestDispatcherOptions) {
         if (includeRes == null) {
             throw new SightlyException("Resource cannot be null");
         } else {
+            if (request.getResource().getPath().equals(includeRes.getPath())) {
+                String requestSelectorString = 
request.getRequestPathInfo().getSelectorString();
+                String requestDispatcherAddSelectors = 
requestDispatcherOptions.getAddSelectors();
+                if (
+                        (requestSelectorString == null ? 
requestDispatcherAddSelectors == null : 
requestSelectorString.equals(requestDispatcherAddSelectors)) &&
+                        
StringUtils.EMPTY.equals(requestDispatcherOptions.getReplaceSelectors()) &&
+                        (requestDispatcherOptions.getForceResourceType() == 
null || 
requestDispatcherOptions.getForceResourceType().equals(request.getResource().getResourceType()))
+                ) {
+                    LOGGER.warn("Will not include resource {} since this will 
lead to a {} exception.", includeRes.getPath(), 
"org.apache.sling.api.request.RecursionTooDeepException");
+                    return;
+                }
+            }
             SlingHttpServletResponse customResponse = new 
PrintWriterResponseWrapper(out, BindingsUtils.getResponse(bindings));
-            SlingHttpServletRequest request = 
BindingsUtils.getRequest(bindings);
             RequestDispatcher dispatcher = 
request.getRequestDispatcher(includeRes, requestDispatcherOptions);
             try {
                 if (dispatcher != null) {

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to