diff --git a/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtil.java b/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtil.java index 8855b48fff..4743c05fa9 100644 --- a/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtil.java +++ b/bundles/core/src/main/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtil.java @@ -118,7 +118,7 @@ public static String escape(final String path, final String queryString, final S } } else { escaped = sb.append("#") - .append(replaceEncodedCharacters(URLEncoder.encode(fragment, StandardCharsets.UTF_8.name()))) + .append(replaceEncodedCharactersInFragment(URLEncoder.encode(fragment, StandardCharsets.UTF_8.name()))) .toString(); } } @@ -212,7 +212,7 @@ private static String newPlaceholder(final String str) { return placeholderBuilder.toString(); } - private static String replaceEncodedCharacters(final String str) { + private static String replaceEncodedCharactersInFragment(final String str) { return str.replace("%2B", "+") .replace("%3D", "=") .replace("%7E", "~") @@ -225,6 +225,8 @@ private static String replaceEncodedCharacters(final String str) { .replace("%27", "'") .replace("%28", "(") .replace("%29", ")") - .replace("%2C", ","); + .replace("%2C", ",") + .replace("%2F", "/") + .replace("%3F", "?"); } } diff --git a/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtilTest.java b/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtilTest.java index 5104bbfe1a..68457255f6 100644 --- a/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtilTest.java +++ b/bundles/core/src/test/java/com/adobe/cq/wcm/core/components/internal/link/LinkUtilTest.java @@ -55,4 +55,12 @@ void decode_whenCampaignPatternIsPresentInTheString_thenCampaignPatternIsNotAffe String decodedPath = LinkUtil.decode(encodedPath); assertEquals(encodedPath, decodedPath); } + + @Test + void escape_whenEscapingPathWithFragment_thenFragmentForwardSlashIsNotEncoded() throws UnsupportedEncodingException { + String path = "https://google.com"; + String fragment = "/assets/2/1529/RES176341/report"; + String escapedPAth = LinkUtil.escape(path, null, fragment); + assertEquals(path+ "#" + fragment, escapedPAth); + } }