Updated Branches:
  refs/heads/wicket-4774 665a3e800 -> 3eb54bc55

Fix for WICKET-4664

Added tests for RequestUtils.decodeParameters() : in order to be able to test 
it easily without the mocking or starting a complex requestCycle, extracted the 
static call to getCurrentCharset() as a method parameter. The extracted method 
is package visible only and visible for tests only.

When RequestUtils.decodeParameters() is called with a queryString beginning 
with a "?" it is automatically stripped and thus is not reflected into 
pageParameters.


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/96832b46
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/96832b46
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/96832b46

Branch: refs/heads/wicket-4774
Commit: 96832b461416db3c95af8d2ae0b597b4d33e5066
Parents: 1c84648
Author: Cedric Gatay <[email protected]>
Authored: Mon Apr 29 19:43:34 2013 +0200
Committer: Cedric Gatay <[email protected]>
Committed: Mon Apr 29 19:43:34 2013 +0200

----------------------------------------------------------------------
 .../apache/wicket/protocol/http/RequestUtils.java  |   29 +++++-
 .../wicket/protocol/http/RequestUtilsTest.java     |   76 ++++++++++++++-
 2 files changed, 101 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/96832b46/wicket-core/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
index cf832bc..023c7d3 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/protocol/http/RequestUtils.java
@@ -46,18 +46,41 @@ public final class RequestUtils
         */
        public static void decodeParameters(String queryString, PageParameters 
params)
        {
+               decodeParameters(queryString, params, getCurrentCharset());
+       }
+
+       /**
+        * Decode the provided queryString as a series of key/ value pairs and 
set them in the provided
+        * value map.
+        *
+        * @param queryString
+        *            string to decode, uses '&' to separate parameters and '=' 
to separate key from
+        *            value
+        * @param params
+        *            parameters map to write the found key/ value pairs to
+        * @param currentCharset
+        *            charset resolved via current requestCycle
+        */
+       static void decodeParameters(String queryString, PageParameters params, 
Charset currentCharset)
+       {
+        
+        if (Strings.indexOf(queryString, '?') == 0)
+        {
+            queryString = queryString.substring(1);
+        }
+        
                for (String paramTuple : Strings.split(queryString, '&'))
                {
                        final String[] bits = Strings.split(paramTuple, '=');
 
                        if (bits.length == 2)
                        {
-                               
params.add(UrlDecoder.QUERY_INSTANCE.decode(bits[0], getCurrentCharset()),
-                                       
UrlDecoder.QUERY_INSTANCE.decode(bits[1], getCurrentCharset()));
+                               
params.add(UrlDecoder.QUERY_INSTANCE.decode(bits[0], currentCharset),
+                                       
UrlDecoder.QUERY_INSTANCE.decode(bits[1], currentCharset));
                        }
                        else
                        {
-                               
params.add(UrlDecoder.QUERY_INSTANCE.decode(bits[0], getCurrentCharset()), "");
+                               
params.add(UrlDecoder.QUERY_INSTANCE.decode(bits[0], currentCharset), "");
                        }
                }
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/96832b46/wicket-core/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java
index a7398c0..c800e87 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/protocol/http/RequestUtilsTest.java
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.protocol.http;
 
+import java.nio.charset.Charset;
+
+import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -25,7 +28,10 @@ import org.junit.Test;
  */
 public class RequestUtilsTest extends Assert
 {
-       /**
+
+    public static final Charset UTF_8_CHARSET = Charset.forName("UTF-8");
+
+    /**
         * 
         */
        @Test
@@ -97,4 +103,72 @@ public class RequestUtilsTest extends Assert
                assertEquals(RequestUtils.toAbsolutePath("http://aif.ru/";, 
"./"), "http://aif.ru/";);
 
        }
+
+    /**
+     * WICKET-4664 - remove leading ? if present
+     */
+    @Test
+       public void removeLeadingQuestionMark_simpleParam()
+       {
+        final PageParameters params = new PageParameters();
+               RequestUtils.decodeParameters("?key=value", params, 
UTF_8_CHARSET);
+        assertEquals("value", params.get("key").toString());
+       }
+
+    /**
+     * WICKET-4664 - remove leading ? if present
+     */
+    @Test
+       public void 
removeLeadingQuestionMark_simpleParamWithoutValueAndAnotherParam()
+       {
+               final PageParameters params = new PageParameters();
+               RequestUtils.decodeParameters("?123&key=value", params, 
UTF_8_CHARSET);
+        assertEquals("", params.get("123").toString());
+        assertEquals("value", params.get("key").toString());
+       }
+
+    /**
+     * WICKET-4664 - remove leading ? if present
+     */
+    @Test
+    public void removeLeadingQuestionMark_simpleParamWithoutValue()
+    {
+        final PageParameters params = new PageParameters();
+        RequestUtils.decodeParameters("?123", params, UTF_8_CHARSET);
+        assertEquals("", params.get("123").toString());
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void decodeParam_simpleParam_noQuestionMark()
+    {
+        final PageParameters params = new PageParameters();
+        RequestUtils.decodeParameters("key=value", params, UTF_8_CHARSET);
+        assertEquals("value", params.get("key").toString());
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void 
decodeParam_simpleParamWithoutValueAndAnotherParam_NoQuestionMark()
+    {
+        final PageParameters params = new PageParameters();
+        RequestUtils.decodeParameters("123&key=value", params, UTF_8_CHARSET);
+        assertEquals("", params.get("123").toString());
+        assertEquals("value", params.get("key").toString());
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void decodeParam_simpleParamWithoutValue_NoQuestionMark()
+    {
+        final PageParameters params = new PageParameters();
+        RequestUtils.decodeParameters("123", params, UTF_8_CHARSET);
+        assertEquals("", params.get("123").toString());
+    }
 }

Reply via email to