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)