You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2023/05/29 13:52:47 UTC

[struts] 01/01: WW-5310 Supports fragment in URL

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

lukaszlenart pushed a commit to branch WW-5310-fragment
in repository https://gitbox.apache.org/repos/asf/struts.git

commit 97137bd0f934522e7ec2fe30511dba19cdbacb8a
Author: Lukasz Lenart <lu...@apache.org>
AuthorDate: Mon May 29 15:52:38 2023 +0200

    WW-5310 Supports fragment in URL
---
 .../org/apache/struts2/url/StrutsQueryStringParser.java    | 14 +++++++++++++-
 .../apache/struts2/url/StrutsQueryStringParserTest.java    |  8 ++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/struts2/url/StrutsQueryStringParser.java b/core/src/main/java/org/apache/struts2/url/StrutsQueryStringParser.java
index 3b3ec80eb..4c31d4885 100644
--- a/core/src/main/java/org/apache/struts2/url/StrutsQueryStringParser.java
+++ b/core/src/main/java/org/apache/struts2/url/StrutsQueryStringParser.java
@@ -49,7 +49,7 @@ public class StrutsQueryStringParser implements QueryStringParser {
         }
 
         Map<String, Object> queryParams = new LinkedHashMap<>();
-        String[] params = queryString.split("&");
+        String[] params = extractParams(queryString);
         for (String param : params) {
             if (StringUtils.isBlank(param)) {
                 LOG.debug("Param [{}] is blank, skipping", param);
@@ -69,6 +69,18 @@ public class StrutsQueryStringParser implements QueryStringParser {
         return queryParams;
     }
 
+    private String[] extractParams(String queryString) {
+        LOG.trace("Extracting params from query string: {}", queryString);
+        String[] params = queryString.split("&");
+
+        int fragmentIndex = queryString.lastIndexOf("#");
+        if (fragmentIndex > -1) {
+            LOG.trace("Stripping fragment at index: {}", fragmentIndex);
+            params = queryString.substring(0, fragmentIndex).split("&");
+        }
+        return params;
+    }
+
     private void extractParam(String paramName, String paramValue, Map<String, Object> queryParams, boolean forceValueArray) {
         String decodedParamName = decoder.decode(paramName, true);
         String decodedParamValue = decoder.decode(paramValue, true);
diff --git a/core/src/test/java/org/apache/struts2/url/StrutsQueryStringParserTest.java b/core/src/test/java/org/apache/struts2/url/StrutsQueryStringParserTest.java
index ab0622cd5..93fd9bbaa 100644
--- a/core/src/test/java/org/apache/struts2/url/StrutsQueryStringParserTest.java
+++ b/core/src/test/java/org/apache/struts2/url/StrutsQueryStringParserTest.java
@@ -103,6 +103,14 @@ public class StrutsQueryStringParserTest {
         assertEquals("1234", queryParameters.get("param1"));
     }
 
+    @Test
+    public void shouldHandleParamAndFragment() {
+        Map<String, Object> queryParameters = parser.parse("param1=1234#test", false);
+
+        assertTrue(queryParameters.containsKey("param1"));
+        assertEquals("1234", queryParameters.get("param1"));
+    }
+
     @Before
     public void setUp() throws Exception {
         this.parser = new StrutsQueryStringParser(new StrutsUrlDecoder());