Author: mgrigorov
Date: Mon Jul 18 09:00:12 2011
New Revision: 1147790

URL: http://svn.apache.org/viewvc?rev=1147790&view=rev
Log:
WICKET-3908 Encoding problem with POSTing a form with Ajax

Forms submitted with Ajax are always encoded with UTF-8. (HttpXmlRequest 
doesn't support other encoding for x-form-www-urlencoded).


Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java?rev=1147790&r1=1147789&r2=1147790&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 Mon Jul 18 09:00:12 2011
@@ -62,6 +62,7 @@ import org.apache.wicket.session.HttpSes
 import org.apache.wicket.session.ISessionStore;
 import org.apache.wicket.util.IContextProvider;
 import org.apache.wicket.util.IProvider;
+import org.apache.wicket.util.crypt.CharEncoding;
 import org.apache.wicket.util.file.FileCleaner;
 import org.apache.wicket.util.file.IFileCleaner;
 import org.apache.wicket.util.file.IResourceFinder;
@@ -388,26 +389,32 @@ public abstract class WebApplication ext
        }
 
        /**
-        * Create a new WebRequest. Subclasses of WebRequest could e.g. decode 
and obfuscated URL which
+        * Create a new WebRequest. Subclasses of WebRequest could e.g. decode 
and obfuscate URL which
         * has been encoded by an appropriate WebResponse.
         * 
         * @param servletRequest
+        *            the current HTTP Servlet request
         * @param filterPath
         *            the filter mapping read from web.xml
         * @return a WebRequest object
         */
        protected WebRequest newWebRequest(HttpServletRequest servletRequest, 
final String filterPath)
        {
-               String requestEncoding = 
getRequestCycleSettings().getResponseRequestEncoding();
-               try
-               {
-                       servletRequest.setCharacterEncoding(requestEncoding);
-               }
-               catch (UnsupportedEncodingException e)
-               {
-                       throw new RuntimeException(e);
-               }
+               return new ServletWebRequest(servletRequest, filterPath);
+       }
 
+       /**
+        * Pre- and post- configures the {@link WebRequest} created by user 
override-able
+        * {@link #newWebRequest(HttpServletRequest, String)}
+        * 
+        * @param servletRequest
+        *            the current HTTP Sservlet request
+        * @param filterPath
+        *            the filter mapping read from web.xml
+        * @return a WebRequest object
+        */
+       WebRequest createWebRequest(HttpServletRequest servletRequest, final 
String filterPath)
+       {
                if (hasFilterFactoryManager())
                {
                        for (AbstractRequestWrapperFactory factory : 
getFilterFactoryManager())
@@ -416,7 +423,27 @@ public abstract class WebApplication ext
                        }
                }
 
-               return new ServletWebRequest(servletRequest, filterPath);
+               WebRequest webRequest = newWebRequest(servletRequest, 
filterPath);
+
+               try
+               {
+                       if (webRequest.isAjax())
+                       {
+                               // WICKET-3908: Forms submitted with Ajax are 
always UTF-8 encoded
+                               
servletRequest.setCharacterEncoding(CharEncoding.UTF_8);
+                       }
+                       else
+                       {
+                               String requestEncoding = 
getRequestCycleSettings().getResponseRequestEncoding();
+                               
servletRequest.setCharacterEncoding(requestEncoding);
+                       }
+               }
+               catch (UnsupportedEncodingException e)
+               {
+                       throw new RuntimeException(e);
+               }
+
+               return webRequest;
        }
 
        /**
@@ -425,14 +452,31 @@ public abstract class WebApplication ext
         * to decode the encoded URL.
         * 
         * @param webRequest
+        *            the {@link WebRequest} that will handle the current HTTP 
Servlet request
         * @param httpServletResponse
+        *            the current HTTP Servlet response
         * @return a WebResponse object
         */
        protected WebResponse newWebResponse(final WebRequest webRequest,
                final HttpServletResponse httpServletResponse)
        {
-               ServletWebResponse webResponse = new 
ServletWebResponse((ServletWebRequest)webRequest,
-                       httpServletResponse);
+               return new ServletWebResponse((ServletWebRequest)webRequest, 
httpServletResponse);
+       }
+
+       /**
+        * Pre- and post- configures the {@link WebResponse} returned from
+        * {@link #newWebResponse(WebRequest, HttpServletResponse)}
+        * 
+        * @param webRequest
+        *            the {@link WebRequest} that will handle the current HTTP 
Servlet request
+        * @param httpServletResponse
+        *            the current HTTP Servlet response
+        * @return the configured WebResponse object
+        */
+       WebResponse createWebResponse(final WebRequest webRequest,
+               final HttpServletResponse httpServletResponse)
+       {
+               WebResponse webResponse = newWebResponse(webRequest, 
httpServletResponse);
 
                boolean shouldBufferResponse = 
getRequestCycleSettings().getBufferResponse();
                return shouldBufferResponse ? new 
HeaderBufferingWebResponse(webResponse) : webResponse;

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java?rev=1147790&r1=1147789&r2=1147790&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/WicketFilter.java
 Mon Jul 18 09:00:12 2011
@@ -152,8 +152,8 @@ public class WicketFilter implements Fil
                                // No redirect; process the request
                                ThreadContext.setApplication(application);
 
-                               WebRequest webRequest = 
application.newWebRequest(httpServletRequest, filterPath);
-                               WebResponse webResponse = 
application.newWebResponse(webRequest,
+                               WebRequest webRequest = 
application.createWebRequest(httpServletRequest, filterPath);
+                               WebResponse webResponse = 
application.createWebResponse(webRequest,
                                        httpServletResponse);
 
                                RequestCycle requestCycle = 
application.createRequestCycle(webRequest, webResponse);


Reply via email to