You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "Julian Reschke (Jira)" <ji...@apache.org> on 2023/01/20 14:11:00 UTC

[jira] [Comment Edited] (SLING-11757) resource resolver: pathless URL in vanity path causes NPE in ResourceMapperImpl.apply()

    [ https://issues.apache.org/jira/browse/SLING-11757?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17679160#comment-17679160 ] 

Julian Reschke edited comment on SLING-11757 at 1/20/23 2:10 PM:
-----------------------------------------------------------------

Turns out that the actual problem is not the empty path in itself, but that ResourceMapperImpl's code:

{noformat}
                final URI uri = new URI(path, false);

                // 1. mangle the namespaces in the path
                path = mangleNamespaces(uri.getPath());
{noformat}

maps "" to null.

Fixing URI.getPath() appears to fix it:


{noformat}
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java b/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java
index 2df7eb2..554aa3a 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java
@@ -3204,7 +3204,7 @@ public class URI implements Cloneable, Comparable<URI>, Serializable {
      */
     public String getPath() throws URIException {
         char[] path = getRawPath();
-        return (path == null) ? null : decode(path, getProtocolCharset());
+        return (path == null) ? "" : decode(path, getProtocolCharset());
     }

     /**
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
index e0094ca..ddfd024 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
@@ -392,13 +392,13 @@ public class ResourceMapperImplTest {
     /**
      * Validates that vanity paths are returned as mappings, URL shaped variants, empty path (see see SLING-11757)
      */
-    @Test(expected = NullPointerException.class)
+    @Test
     public void mapResourceWithVanityPathsURLTargetNoPath() {
         ExpectedMappings.existingResource("/vain-url-nopath")
             .singleMapping("/vain-url-nopath")
             .singleMappingWithRequest("/app/vain-url-nopath")
-            .allMappings("/vain-url-nopath", "see SLING-11757")
-            .allMappingsWithRequest("/app/vain-url-nopath", "see SLING-11757")
+            .allMappings("/vain-url-nopath", "")
+            .allMappingsWithRequest("/app/vain-url-nopath", "")
             .verify(resolver, req);
     }
{noformat}

Not sure whether the new test result is correct, though.


was (Author: reschke):
Turns out that the actual problem is not the empty path in itself, but that ResourceMapperImpl's code:

{noformat}
                final URI uri = new URI(path, false);

                // 1. mangle the namespaces in the path
                path = mangleNamespaces(uri.getPath());
{noformat}

maps "" to null.

Fixing URI.getPath() appears to fix it:


{noformat}
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java b/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java
index 2df7eb2..554aa3a 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/helper/URI.java
@@ -3204,7 +3204,7 @@ public class URI implements Cloneable, Comparable<URI>, Serializable {
      */
     public String getPath() throws URIException {
         char[] path = getRawPath();
-        return (path == null) ? null : decode(path, getProtocolCharset());
+        return (path == null) ? "" : decode(path, getProtocolCharset());
     }

     /**
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
index e0094ca..ddfd024 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImplTest.java
@@ -392,13 +392,13 @@ public class ResourceMapperImplTest {
     /**
      * Validates that vanity paths are returned as mappings, URL shaped variants, empty path (see see SLING-11757)
      */
-    @Test(expected = NullPointerException.class)
+    @Test
     public void mapResourceWithVanityPathsURLTargetNoPath() {
         ExpectedMappings.existingResource("/vain-url-nopath")
             .singleMapping("/vain-url-nopath")
             .singleMappingWithRequest("/app/vain-url-nopath")
-            .allMappings("/vain-url-nopath", "see SLING-11757")
-            .allMappingsWithRequest("/app/vain-url-nopath", "see SLING-11757")
+            .allMappings("/vain-url-nopath", "")
+            .allMappingsWithRequest("/app/vain-url-nopath", "")
             .verify(resolver, req);
     }
{noformat}

Not sure whether the new test result is correcz, though.

> resource resolver: pathless URL in vanity path causes NPE in ResourceMapperImpl.apply()
> ---------------------------------------------------------------------------------------
>
>                 Key: SLING-11757
>                 URL: https://issues.apache.org/jira/browse/SLING-11757
>             Project: Sling
>          Issue Type: Sub-task
>          Components: ResourceResolver
>            Reporter: Julian Reschke
>            Priority: Major
>
> {noformat}
> java.lang.NullPointerException
>         at java.lang.String.concat(String.java:2027)
>         at org.apache.sling.resourceresolver.impl.mapping.ResourceMapperImpl$ApplyContextPath.apply(ResourceMapperImpl.java:371)
>         at org.apache.sling.resourceresolver.impl.mapping.ResourceMapperImpl$ApplyContextPath.apply(ResourceMapperImpl.java:345)
>         at java.util.ArrayList.replaceAll(ArrayList.java:1452)
>         at org.apache.sling.resourceresolver.impl.mapping.ResourceMapperImpl.getAllMappings(ResourceMapperImpl.java:171)
>         at org.apache.sling.resourceresolver.impl.mapping.ResourceMapperImpl.getMapping(ResourceMapperImpl.java:73)
>         at org.apache.sling.resourceresolver.impl.mapping.ResourceMapperImplTest$ExpectedMappings.verify(ResourceMapperImplTest.java:510)
>         at org.apache.sling.resourceresolver.impl.mapping.ResourceMapperImplTest.mapResourceWithVanityPathsURLTargetNoPath(ResourceMapperImplTest.java:402)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)