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()); + } }
