You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2011/08/08 23:14:56 UTC

svn commit: r1155102 - in /myfaces/core/branches/2.0.x/impl/src: main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java test/java/org/apache/myfaces/context/servlet/ServletExternalContextImplTest.java

Author: lu4242
Date: Mon Aug  8 21:14:56 2011
New Revision: 1155102

URL: http://svn.apache.org/viewvc?rev=1155102&view=rev
Log:
MYFACES-3229 ServletExternalContextImpl.encodeRedirectURL() doesn't handle existing query parameters correctly

Modified:
    myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java
    myfaces/core/branches/2.0.x/impl/src/test/java/org/apache/myfaces/context/servlet/ServletExternalContextImplTest.java

Modified: myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java?rev=1155102&r1=1155101&r2=1155102&view=diff
==============================================================================
--- myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java (original)
+++ myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/context/servlet/ServletExternalContextImpl.java Mon Aug  8 21:14:56 2011
@@ -18,8 +18,20 @@
  */
 package org.apache.myfaces.context.servlet;
 
-import org.apache.myfaces.shared.context.flash.FlashImpl;
-import org.apache.myfaces.util.EnumerationIterator;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.logging.Logger;
 
 import javax.faces.FacesException;
 import javax.faces.context.FacesContext;
@@ -35,19 +47,9 @@ import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.net.URLEncoder;
-import java.security.Principal;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.logging.Logger;
+
+import org.apache.myfaces.shared.context.flash.FlashImpl;
+import org.apache.myfaces.util.EnumerationIterator;
 
 /**
  * Implements the external context for servlet request. JSF 1.2, 6.1.3
@@ -743,7 +745,15 @@ public final class ServletExternalContex
                 String[] currentPair = nameValuePairs[i].split(URL_NAME_VALUE_PAIR_SEPERATOR);
 
                 ArrayList<String> value = new ArrayList<String>(1);
-                value.add(currentPair.length > 1 ? currentPair[1] : "");
+                try
+                {
+                    value.add(currentPair.length > 1 ? URLDecoder.decode(currentPair[1], getResponseCharacterEncoding()) : "");
+                }
+                catch (UnsupportedEncodingException e)
+                {
+                    //shouldn't ever get here
+                    throw new UnsupportedOperationException("Encoding type=" + getResponseCharacterEncoding() + " not supported", e);
+                }
                 paramMap.put(currentPair[0], value);
             }
         }

Modified: myfaces/core/branches/2.0.x/impl/src/test/java/org/apache/myfaces/context/servlet/ServletExternalContextImplTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.0.x/impl/src/test/java/org/apache/myfaces/context/servlet/ServletExternalContextImplTest.java?rev=1155102&r1=1155101&r2=1155102&view=diff
==============================================================================
--- myfaces/core/branches/2.0.x/impl/src/test/java/org/apache/myfaces/context/servlet/ServletExternalContextImplTest.java (original)
+++ myfaces/core/branches/2.0.x/impl/src/test/java/org/apache/myfaces/context/servlet/ServletExternalContextImplTest.java Mon Aug  8 21:14:56 2011
@@ -111,5 +111,32 @@ public class ServletExternalContextImplT
 
     }
 
+    @Test
+    public void testEncodedSpaceInExistingQueryParameter()
+    {
+        // the base URL with an existing encoded query parameter 
+        String baseUrl = "/test?p1=a+b";
+        
+        // encode that URL without adding further parameters
+        final String redirectUrl = _testExternalContext.encodeRedirectURL(baseUrl, null);
+        
+        // the URL should not change
+        Assert.assertEquals(baseUrl, redirectUrl);
+
+    }
+    
+    @Test
+    public void testEncodedAmpersandInExistingQueryParameter()
+    {
+        // the base URL with an existing encoded query parameter 
+        String baseUrl = "/test?p1=a%26b";
+        
+        // encode that URL without adding further parameters
+        final String redirectUrl = _testExternalContext.encodeRedirectURL(baseUrl, null);
+        
+        // the URL should not change
+        Assert.assertEquals(baseUrl, redirectUrl);
+        
+    }
     
 }