Author: mgrigorov
Date: Wed Sep 28 07:43:10 2011
New Revision: 1176766
URL: http://svn.apache.org/viewvc?rev=1176766&view=rev
Log:
WICKET-4079 Provide new HybridPageParametersEncoder class for backwards
compatibility with pre 1.5.x Hybrid URL encoding
Add unit tests
Added:
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java?rev=1176766&r1=1176765&r2=1176766&view=diff
==============================================================================
---
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java
(original)
+++
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoder.java
Wed Sep 28 07:43:10 2011
@@ -21,6 +21,7 @@ import java.util.Iterator;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Url;
import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.Strings;
/**
@@ -67,9 +68,19 @@ public class UrlPathPageParametersEncode
for (Iterator<String> segment =
request.getUrl().getSegments().iterator(); segment.hasNext();)
{
String key = segment.next();
- String value = segment.next();
+ if (Strings.isEmpty(key))
+ {
+ // keys cannot be empty
+ continue;
+ }
+ // A trailing slash can be seen as an extra segment
with a "" value so check
+ // if there is a matching value for this parameter name
and ignore it if not
+ if (segment.hasNext())
+ {
+ String value = segment.next();
- params.add(key, value);
+ params.add(key, value);
+ }
}
return params.isEmpty() ? null : params;
Added:
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java?rev=1176766&view=auto
==============================================================================
---
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
(added)
+++
wicket/trunk/wicket-request/src/test/java/org/apache/wicket/request/mapper/parameter/UrlPathPageParametersEncoderTest.java
Wed Sep 28 07:43:10 2011
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.request.mapper.parameter;
+
+import java.nio.charset.Charset;
+import java.util.Locale;
+
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.Url;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for {@link UrlPathPageParametersEncoder}
+ */
+public class UrlPathPageParametersEncoderTest extends Assert
+{
+
+ /**
+ * Encode named parameters in the segments (so they look like indexed
parameters)
+ */
+ @Test
+ public void encodeNamedParameters()
+ {
+ PageParameters params = new PageParameters();
+ params.add("name1", "value1");
+ params.add("name2", "value2");
+
+ UrlPathPageParametersEncoder encoder = new
UrlPathPageParametersEncoder();
+ Url url = encoder.encodePageParameters(params);
+
+ assertEquals("name1/value1/name2/value2", url.toString());
+ }
+
+ /**
+ * Encode named parameters in the segments (so they look like indexed
parameters) and the name
+ * and/or value have non-ASCII characters
+ */
+ @Test
+ public void encodeNamedParametersWithSpecialChars()
+ {
+ // the non-ASCII characters are randomly chosen
+ PageParameters params = new PageParameters();
+ params.add("name1", "valueà¦");
+ params.add("nameã", "value2");
+
+ UrlPathPageParametersEncoder encoder = new
UrlPathPageParametersEncoder();
+ Url url = encoder.encodePageParameters(params);
+
+ assertEquals("name1/value%E0%A6%8F/name%E3%84%98/value2",
url.toString());
+ }
+
+ /**
+ * This encoder doesn't support indexed parameters
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void encodeIndexedParameters()
+ {
+ PageParameters params = new PageParameters();
+ params.set(0, "value1");
+ params.set(1, "value2");
+
+ UrlPathPageParametersEncoder encoder = new
UrlPathPageParametersEncoder();
+ encoder.encodePageParameters(params);
+ }
+
+ /**
+ * Decode properly encoded parameters
+ */
+ @Test
+ public void decodeUrl()
+ {
+ Url url = Url.parse("name1/value1/name2/value2");
+ Request request = getRequest(url);
+
+ UrlPathPageParametersEncoder decoder = new
UrlPathPageParametersEncoder();
+ PageParameters parameters =
decoder.decodePageParameters(request);
+
+ assertEquals(2, parameters.getAllNamed().size());
+ assertEquals("value1", parameters.get("name1").toString());
+ assertEquals("value2", parameters.get("name2").toString());
+ }
+
+ /**
+ * Decode encoded parameters with trailing slash. The parameter with
the empty name should be
+ * ignored
+ */
+ @Test
+ public void decodeUrlWithTrailingSlash()
+ {
+ Url url = Url.parse("name1/value1/name2/value2/");
+ Request request = getRequest(url);
+
+ UrlPathPageParametersEncoder decoder = new
UrlPathPageParametersEncoder();
+ PageParameters parameters =
decoder.decodePageParameters(request);
+
+ assertEquals(2, parameters.getAllNamed().size());
+ assertEquals("value1", parameters.get("name1").toString());
+ assertEquals("value2", parameters.get("name2").toString());
+ }
+
+ /**
+ * Decode encoded parameters with trailing slash. The parameter with
the empty value should be
+ * ignored
+ */
+ @Test
+ public void decodeUrlWithTrailingSlashAfterName()
+ {
+ Url url = Url.parse("name1/value1/name2/value2/name3");
+ Request request = getRequest(url);
+
+ UrlPathPageParametersEncoder decoder = new
UrlPathPageParametersEncoder();
+ PageParameters parameters =
decoder.decodePageParameters(request);
+
+ assertEquals(2, parameters.getAllNamed().size());
+ assertEquals("value1", parameters.get("name1").toString());
+ assertEquals("value2", parameters.get("name2").toString());
+ }
+
+ /**
+ * Decode encoded parameters with a leading slash. The empty name
segment should be ignored.
+ */
+ @Test
+ public void decodeUrlWithLeadingSlash()
+ {
+ Url url = Url.parse("/name1/value1/name2/value2");
+ Request request = getRequest(url);
+
+ UrlPathPageParametersEncoder decoder = new
UrlPathPageParametersEncoder();
+ PageParameters parameters =
decoder.decodePageParameters(request);
+
+ assertEquals(2, parameters.getAllNamed().size());
+ assertEquals("value1", parameters.get("name1").toString());
+ assertEquals("value2", parameters.get("name2").toString());
+ }
+
+ /**
+ * Decode encoded parameters with a slashes in the middle. The empty
name segments should be
+ * ignored.
+ */
+ @Test
+ public void decodeUrlWithSlashesInTheMiddle()
+ {
+ Url url = Url.parse("name1/value1////name2/value2");
+ Request request = getRequest(url);
+
+ UrlPathPageParametersEncoder decoder = new
UrlPathPageParametersEncoder();
+ PageParameters parameters =
decoder.decodePageParameters(request);
+
+ assertEquals(2, parameters.getAllNamed().size());
+ assertEquals("value1", parameters.get("name1").toString());
+ assertEquals("value2", parameters.get("name2").toString());
+ }
+
+ /**
+ * Decode encoded parameters with a slashes in the middle. The empty
name segments should be
+ * ignored.
+ */
+ @Test
+ public void decodeUrlWithSlashesInTheMiddleAndEmptyValue()
+ {
+ Url url = Url.parse("name1/value1////name2//");
+ Request request = getRequest(url);
+
+ UrlPathPageParametersEncoder decoder = new
UrlPathPageParametersEncoder();
+ PageParameters parameters =
decoder.decodePageParameters(request);
+
+ assertEquals(2, parameters.getAllNamed().size());
+ assertEquals("value1", parameters.get("name1").toString());
+ assertEquals("", parameters.get("name2").toString());
+ }
+
+ private Request getRequest(final Url url)
+ {
+ return new Request()
+ {
+ @Override
+ public Url getUrl()
+ {
+ return url;
+ }
+
+ @Override
+ public Locale getLocale()
+ {
+ return null;
+ }
+
+ @Override
+ public Object getContainerRequest()
+ {
+ return null;
+ }
+
+ @Override
+ public Url getClientUrl()
+ {
+ return url;
+ }
+
+ @Override
+ public Charset getCharset()
+ {
+ return null;
+ }
+ };
+ }
+}