You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by jb...@apache.org on 2007/03/06 11:02:33 UTC
svn commit: r515049 - in /incubator/wicket/trunk/wicket/src:
main/java/wicket/ main/java/wicket/markup/html/form/
main/java/wicket/markup/resolver/ main/java/wicket/protocol/http/
main/java/wicket/protocol/http/request/ main/java/wicket/util/value/ tes...
Author: jbq
Date: Tue Mar 6 02:02:31 2007
New Revision: 515049
URL: http://svn.apache.org/viewvc?view=rev&rev=515049
Log:
WICKET-358 Properly decode URLs
Added:
incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/RequestUtils.java (with props)
Modified:
incubator/wicket/trunk/wicket/src/main/java/wicket/PageParameters.java
incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java
incubator/wicket/trunk/wicket/src/main/java/wicket/markup/resolver/AutoLinkResolver.java
incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/MockHttpServletRequest.java
incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategy.java
incubator/wicket/trunk/wicket/src/main/java/wicket/util/value/ValueMap.java
incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPage.html
incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPageExpectedResult.html
incubator/wicket/trunk/wicket/src/test/java/wicket/protocol/http/WebRequestTest.java
Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/PageParameters.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/PageParameters.java?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/PageParameters.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/PageParameters.java Tue Mar 6 02:02:31 2007
@@ -18,6 +18,7 @@
import java.util.Map;
+import wicket.protocol.http.RequestUtils;
import wicket.util.string.IStringIterator;
import wicket.util.string.StringList;
import wicket.util.value.ValueMap;
@@ -84,6 +85,11 @@
* @param delimiter
* Delimiter string used to separate key/value pairs
* @see ValueMap#ValueMap(String)
+ *
+ * @deprecated Please use
+ * {@link RequestUtils#decodeParameters(String, ValueMap)} to
+ * decode a request URL, or
+ * {@link ValueMap#ValueMap(String, String)} for other usecases.
*/
public PageParameters(final String keyValuePairs, final String delimiter)
{
Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/html/form/Form.java Tue Mar 6 02:02:31 2007
@@ -21,7 +21,6 @@
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
-import java.util.StringTokenizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,6 +42,7 @@
import wicket.markup.html.form.validation.IFormValidator;
import wicket.model.IModel;
import wicket.model.Model;
+import wicket.protocol.http.RequestUtils;
import wicket.protocol.http.WebRequest;
import wicket.protocol.http.WebRequestCycle;
import wicket.protocol.http.request.WebClientInfo;
@@ -55,6 +55,7 @@
import wicket.util.string.interpolator.MapVariableInterpolator;
import wicket.util.upload.FileUploadException;
import wicket.util.upload.FileUploadBase.SizeLimitExceededException;
+import wicket.util.value.ValueMap;
/**
* Base class for forms. To implement a form, subclass this class, add
@@ -1347,7 +1348,7 @@
private final String url;
- private final Map<String, Object> params = new HashMap<String, Object>(4);
+ private final ValueMap params = new ValueMap(4);
/**
* Construct.
@@ -1360,23 +1361,8 @@
this.realRequest = realRequest;
this.url = realRequest.decodeURL(url);
- String queryPart = this.url.substring(this.url.indexOf("?") + 1);
- StringTokenizer paramsSt = new StringTokenizer(queryPart, "&");
- while (paramsSt.hasMoreTokens())
- {
- String param = paramsSt.nextToken();
- int equalsSign = param.indexOf("=");
- if (equalsSign >= 0)
- {
- String paramName = param.substring(0, equalsSign);
- String value = param.substring(equalsSign + 1);
- params.put(paramName, value);
- }
- else
- {
- params.put(param, "");
- }
- }
+ String queryString = this.url.substring(this.url.indexOf("?") + 1);
+ RequestUtils.decodeParameters(queryString, params);
}
/**
Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/markup/resolver/AutoLinkResolver.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/markup/resolver/AutoLinkResolver.java?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/markup/resolver/AutoLinkResolver.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/markup/resolver/AutoLinkResolver.java Tue Mar 6 02:02:31 2007
@@ -38,6 +38,7 @@
import wicket.markup.html.link.BookmarkablePageLink;
import wicket.markup.html.link.ExternalLink;
import wicket.markup.parser.filter.WicketLinkTagHandler;
+import wicket.protocol.http.RequestUtils;
import wicket.util.lang.Packages;
import wicket.util.string.Strings;
@@ -254,7 +255,8 @@
if (queryStringPos != -1)
{
final String queryString = reference.substring(queryStringPos + 1);
- pageParameters = new PageParameters(queryString, "&");
+ pageParameters = new PageParameters();
+ RequestUtils.decodeParameters(queryString, pageParameters);
infoPath = reference.substring(0, queryStringPos);
}
else
@@ -371,7 +373,6 @@
*/
public AnchorResolverDelegate()
{
-
// Initialize supported list of file name extension which'll create
// bookmarkable pages
supportedPageExtensions.add("html");
@@ -824,4 +825,4 @@
return autoComponent;
}
-}
\ No newline at end of file
+}
Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/MockHttpServletRequest.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/MockHttpServletRequest.java?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/MockHttpServletRequest.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/MockHttpServletRequest.java Tue Mar 6 02:02:31 2007
@@ -23,7 +23,6 @@
import java.io.IOException;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.Principal;
import java.text.DateFormat;
@@ -36,7 +35,6 @@
import java.util.List;
import java.util.Locale;
import java.util.Map;
-import java.util.StringTokenizer;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
@@ -1131,17 +1129,7 @@
path = url.substring(0, index);
String queryString = url.substring(index + 1);
- StringTokenizer st = new StringTokenizer(queryString, "&");
- while (st.hasMoreTokens())
- {
- String token = st.nextToken();
- int tmp = token.indexOf("=");
- if (tmp != -1)
- {
- setParameter(token.substring(0, tmp), token.substring(tmp + 1));
- }
- }
-
+ RequestUtils.decodeParameters(queryString, parameters);
}
}
@@ -1276,24 +1264,8 @@
{
parameters.clear();
- final String paramPart = redirect.substring(redirect.indexOf('?') + 1);
- final String[] paramTuples = paramPart.split("&");
- for (String element : paramTuples)
- {
- final String[] bits = element.split("=");
- if (bits.length == 2)
- {
- try
- {
- parameters.put(URLDecoder.decode(bits[0], "UTF-8"), URLDecoder.decode(bits[1],
- "UTF-8"));
- }
- catch (UnsupportedEncodingException e)
- {
- // Should never happen
- }
- }
- }
+ final String queryString = redirect.substring(redirect.indexOf('?') + 1);
+ RequestUtils.decodeParameters(queryString, parameters);
}
/**
Added: incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/RequestUtils.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/RequestUtils.java?view=auto&rev=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/RequestUtils.java (added)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/RequestUtils.java Tue Mar 6 02:02:31 2007
@@ -0,0 +1,50 @@
+/*
+ * 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 wicket.protocol.http;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+import wicket.util.value.ValueMap;
+
+public class RequestUtils
+{
+ public static void decodeParameters(String queryString, ValueMap params)
+ {
+ final String[] paramTuples = queryString.split("&");
+ for (int t = 0; t < paramTuples.length; t++)
+ {
+ final String[] bits = paramTuples[t].split("=");
+ try
+ {
+ if (bits.length == 2)
+ {
+ params.add(URLDecoder.decode(bits[0], "UTF-8"), URLDecoder.decode(bits[1],
+ "UTF-8"));
+ }
+ else
+ {
+ params.add(URLDecoder.decode(bits[0], "UTF-8"), "");
+ }
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ // Should never happen
+ }
+ }
+ }
+}
Propchange: incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/RequestUtils.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/RequestUtils.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategy.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategy.java?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategy.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/protocol/http/request/CryptedUrlWebRequestCodingStrategy.java Tue Mar 6 02:02:31 2007
@@ -29,16 +29,17 @@
import wicket.Application;
import wicket.IRequestTarget;
-import wicket.PageParameters;
import wicket.Request;
import wicket.RequestCycle;
import wicket.WicketRuntimeException;
+import wicket.protocol.http.RequestUtils;
import wicket.request.IRequestCodingStrategy;
import wicket.request.RequestParameters;
import wicket.request.target.coding.IRequestTargetUrlCodingStrategy;
import wicket.util.crypt.ICrypt;
import wicket.util.string.AppendingStringBuffer;
import wicket.util.string.Strings;
+import wicket.util.value.ValueMap;
/**
* This is a request coding strategy which encrypts the URL and hence makes it
@@ -407,7 +408,8 @@
}
// Add ALL of the params from the decoded 'x' param
- PageParameters params = new PageParameters(decodedParamReplacement, "&");
+ ValueMap params = new ValueMap();
+ RequestUtils.decodeParameters(decodedParamReplacement, params);
this.parameterMap.putAll(params);
// Rebuild the URL with the 'x' param removed
Modified: incubator/wicket/trunk/wicket/src/main/java/wicket/util/value/ValueMap.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/main/java/wicket/util/value/ValueMap.java?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/main/java/wicket/util/value/ValueMap.java (original)
+++ incubator/wicket/trunk/wicket/src/main/java/wicket/util/value/ValueMap.java Tue Mar 6 02:02:31 2007
@@ -88,7 +88,8 @@
}
/**
- * Constructor.
+ * Constructor. NOTE: Please use RequestUtils.decodeParameters() if you wish
+ * to properly decode a request URL.
*
* @param keyValuePairs
* List of key value pairs separated by commas. For example,
@@ -100,7 +101,8 @@
}
/**
- * Constructor.
+ * Constructor. NOTE: Please use RequestUtils.decodeParameters() if you wish
+ * to properly decode a request URL.
*
* @param keyValuePairs
* List of key value pairs separated by a given delimiter. For
Modified: incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPage.html
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPage.html?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPage.html (original)
+++ incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPage.html Tue Mar 6 02:02:31 2007
@@ -1,7 +1,7 @@
<wicket:extend>
<wicket:link>
- <a href="PageA.html">Page A</a>
+ <a href="PageA.html?a=1">Page A</a>
</wicket:link>
MyPage
</wicket:extend>
Modified: incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPageExpectedResult.html
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPageExpectedResult.html?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPageExpectedResult.html (original)
+++ incubator/wicket/trunk/wicket/src/test/java/wicket/markup/html/autolink/MyPageExpectedResult.html Tue Mar 6 02:02:31 2007
@@ -9,7 +9,7 @@
START<br>
<wicket:child><wicket:extend>
<wicket:link>
- <a href="/WicketTester$DummyWebApplication/WicketTester$DummyWebApplication?wicket:bookmarkablePage=%3Awicket.markup.html.autolink.PageA">Page A</a>
+ <a href="/WicketTester$DummyWebApplication/WicketTester$DummyWebApplication?wicket:bookmarkablePage=%3Awicket.markup.html.autolink.PageA&a=1">Page A</a>
</wicket:link>
MyPage
</wicket:extend></wicket:child>
Modified: incubator/wicket/trunk/wicket/src/test/java/wicket/protocol/http/WebRequestTest.java
URL: http://svn.apache.org/viewvc/incubator/wicket/trunk/wicket/src/test/java/wicket/protocol/http/WebRequestTest.java?view=diff&rev=515049&r1=515048&r2=515049
==============================================================================
--- incubator/wicket/trunk/wicket/src/test/java/wicket/protocol/http/WebRequestTest.java (original)
+++ incubator/wicket/trunk/wicket/src/test/java/wicket/protocol/http/WebRequestTest.java Tue Mar 6 02:02:31 2007
@@ -16,16 +16,15 @@
*/
package wicket.protocol.http;
-import junit.framework.TestCase;
+import wicket.WicketTestCase;
import wicket.protocol.http.servlet.ServletWebRequest;
-import wicket.util.tester.WicketTester;
/**
* Test of WebRequest.
*
* @author Frank Bille (billen)
*/
-public class WebRequestTest extends TestCase
+public class WebRequestTest extends WicketTestCase
{
/**
* Test that ajax is true when the ajax header is present in the request
@@ -34,7 +33,7 @@
{
assertWithHeader("Wicket-Ajax", "true", true);
}
-
+
/**
* Test that it also works when there are other "positive" values than true.
*/
@@ -45,7 +44,7 @@
assertWithHeader("Wicket-Ajax", "on", true);
assertWithHeader("Wicket-Ajax", "y", true);
}
-
+
/**
* Test that it's not ajax.
*/
@@ -64,14 +63,40 @@
private void assertWithHeader(String header, String value, boolean isAjax)
{
- WicketTester tester = new WicketTester();
MockHttpServletRequest mockRequest = tester.getServletRequest();
mockRequest.addHeader(header, value);
WebRequest webRequest = new ServletWebRequest(mockRequest);
assertEquals(isAjax, webRequest.isAjax());
-
- tester.destroy();
+ }
+
+ public void testStringArray()
+ {
+ MockHttpServletRequest mockRequest = tester.getServletRequest();
+ mockRequest.setRequestToRedirectString("?a=1&a=2");
+ Object obj = mockRequest.getParameterMap().get("a");
+ assertTrue("Expected " + new String[0].getClass() + ", got " + obj.getClass(),
+ obj instanceof String[]);
+ }
+
+ public void testStringEncoding()
+ {
+ MockHttpServletRequest mockRequest = tester.getServletRequest();
+ mockRequest.setRequestToRedirectString("?a=%20");
+ String value = mockRequest.getParameter("a");
+ assertEquals(" ", value);
+ }
+
+ public void testEmptyParam()
+ {
+ MockHttpServletRequest mockRequest = tester.getServletRequest();
+ mockRequest.setRequestToRedirectString("?a=");
+ String value = mockRequest.getParameter("a");
+ assertEquals("", value);
+
+ mockRequest.setRequestToRedirectString("?a");
+ value = mockRequest.getParameter("a");
+ assertEquals("", value);
}
}