Merge pull request #689 from apache/WW-5310-equal-sign

[WW-5310] Properly parses param value with equal sign
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 f176451..3b3ec80 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 @@
                 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];
+            int index = param.indexOf("=");
+            if (index > -1) {
+                paramName = param.substring(0, index);
+                paramValue = param.substring(index + 1);
+            } else {
+                paramName = param;
             }
-            if (tmpParams.length > 1) {
-                paramValue = tmpParams[1];
-            }
-            if (paramName != null) {
-                extractParam(paramName, paramValue, queryParams, forceValueArray);
-            }
+            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 001749e..ab0622c 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 @@
         assertEquals("value with space", queryParameters.get("name"));
     }
 
+    @Test
+    public void shouldProperlySplitParamsWithDoubleEqualSign() {
+        Map<String, Object> 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<String, Object> queryParameters = parser.parse("paramNoValue", false);
+
+        assertTrue(queryParameters.containsKey("paramNoValue"));
+        assertEquals("", queryParameters.get("paramNoValue"));
+    }
+
+    @Test
+    public void shouldHandleParamWithNoValue2() {
+        Map<String, Object> queryParameters = parser.parse("paramNoValue&param1=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());