From b97339e31e8aab08a773d35f0c3d29ed106953f9 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Wed, 24 May 2023 07:06:15 +0200 Subject: [PATCH] WW-5310 Properly parses param value with equal sign --- .../struts2/url/StrutsQueryStringParser.java | 19 ++++++------- .../url/StrutsQueryStringParserTest.java | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+), 11 deletions(-) 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 f1764511e..3b3ec80eb 100644 --- a/core/src/main/java/org/apache/struts2/url/StrutsQueryStringParser.java +++ b/core/src/main/java/org/apache/struts2/url/StrutsQueryStringParser.java @@ -55,19 +55,16 @@ public class StrutsQueryStringParser implements QueryStringParser { LOG.debug("Param [{}] is blank, skipping", param); continue; } - - String[] tmpParams = param.split("="); - String paramName = null; + String paramName; String paramValue = ""; - if (tmpParams.length > 0) { - paramName = tmpParams[0]; - } - if (tmpParams.length > 1) { - paramValue = tmpParams[1]; - } - if (paramName != null) { - extractParam(paramName, paramValue, queryParams, forceValueArray); + int index = param.indexOf("="); + if (index > -1) { + paramName = param.substring(0, index); + paramValue = param.substring(index + 1); + } else { + paramName = param; } + extractParam(paramName, paramValue, queryParams, forceValueArray); } return queryParams; } 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 001749edf..ab0622cd5 100644 --- a/core/src/test/java/org/apache/struts2/url/StrutsQueryStringParserTest.java +++ b/core/src/test/java/org/apache/struts2/url/StrutsQueryStringParserTest.java @@ -76,6 +76,33 @@ public class StrutsQueryStringParserTest { assertEquals("value with space", queryParameters.get("name")); } + @Test + public void shouldProperlySplitParamsWithDoubleEqualSign() { + Map queryParameters = parser.parse("id1=n123=&id2=n3456", false); + + assertTrue(queryParameters.containsKey("id1")); + assertTrue(queryParameters.containsKey("id2")); + assertEquals("n123=", queryParameters.get("id1")); + assertEquals("n3456", queryParameters.get("id2")); + } + + @Test + public void shouldHandleParamWithNoValue1() { + Map queryParameters = parser.parse("paramNoValue", false); + + assertTrue(queryParameters.containsKey("paramNoValue")); + assertEquals("", queryParameters.get("paramNoValue")); + } + + @Test + public void shouldHandleParamWithNoValue2() { + Map queryParameters = parser.parse("paramNoValue¶m1=1234", false); + + assertTrue(queryParameters.containsKey("paramNoValue")); + assertTrue(queryParameters.containsKey("param1")); + assertEquals("1234", queryParameters.get("param1")); + } + @Before public void setUp() throws Exception { this.parser = new StrutsQueryStringParser(new StrutsUrlDecoder());