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
+        *             [EMAIL PROTECTED] RequestUtils#decodeParameters(String, 
ValueMap)} to
+        *             decode a request URL, or
+        *             [EMAIL PROTECTED] 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&amp;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);
        }
 }


Reply via email to