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