Author: lukaszlenart Date: Wed Apr 11 17:41:06 2012 New Revision: 1324888 URL: http://svn.apache.org/viewvc?rev=1324888&view=rev Log: WW-3796 Changes logic to set encoding on HttpServletRequest if differs from configured
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java?rev=1324888&r1=1324887&r2=1324888&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java Wed Apr 11 17:41:06 2012 @@ -690,11 +690,7 @@ public class Dispatcher { } if (encoding != null) { - try { - request.setCharacterEncoding(encoding); - } catch (Exception e) { - LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e); - } + applyEncoding(request, encoding); } if (locale != null) { @@ -706,6 +702,18 @@ public class Dispatcher { } } + private void applyEncoding(HttpServletRequest request, String encoding) { + try { + if (!encoding.equals(request.getCharacterEncoding())) { + // if the encoding is already correctly set and the parameters have been already read + // do not try to set encoding because it is useless and will cause an error + request.setCharacterEncoding(encoding); + } + } catch (Exception e) { + LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e); + } + } + /** * Wrap and return the given request or return the original request object. * </p> Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java?rev=1324888&r1=1324887&r2=1324888&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java Wed Apr 11 17:41:06 2012 @@ -70,7 +70,7 @@ public class DispatcherTest extends Stru HttpServletRequest req = new MockHttpServletRequest(); HttpServletResponse res = new MockHttpServletResponse(); - Dispatcher du = initDispatcher(new HashMap() {{ + Dispatcher du = initDispatcher(new HashMap<String, String>() {{ put(StrutsConstants.STRUTS_I18N_ENCODING, "utf-8"); }}); du.prepare(req, res); @@ -82,9 +82,10 @@ public class DispatcherTest extends Stru // given MockHttpServletRequest req = new MockHttpServletRequest(); req.addHeader("X-Requested-With", "XMLHttpRequest"); + req.setCharacterEncoding("utf-8"); HttpServletResponse res = new MockHttpServletResponse(); - Dispatcher du = initDispatcher(new HashMap() {{ + Dispatcher du = initDispatcher(new HashMap<String, String>() {{ put(StrutsConstants.STRUTS_I18N_ENCODING, "latin-2"); }}); @@ -95,12 +96,36 @@ public class DispatcherTest extends Stru assertEquals(req.getCharacterEncoding(), "utf-8"); } + public void testSetEncodingIfDiffer() throws Exception { + // given + Mock mock = new Mock(HttpServletRequest.class); + mock.expectAndReturn("getCharacterEncoding", "utf-8"); + mock.expectAndReturn("getHeader", "X-Requested-With", ""); + mock.expectAndReturn("getLocale", Locale.getDefault()); + mock.expectAndReturn("getCharacterEncoding", "utf-8"); + HttpServletRequest req = (HttpServletRequest) mock.proxy(); + HttpServletResponse res = new MockHttpServletResponse(); + + Dispatcher du = initDispatcher(new HashMap<String, String>() {{ + put(StrutsConstants.STRUTS_I18N_ENCODING, "utf-8"); + }}); + + + // when + du.prepare(req, res); + + // then + + assertEquals(req.getCharacterEncoding(), "utf-8"); + mock.verify(); + } + public void testPrepareSetEncodingPropertyWithMultipartRequest() throws Exception { MockHttpServletRequest req = new MockHttpServletRequest(); MockHttpServletResponse res = new MockHttpServletResponse(); req.setContentType("multipart/form-data"); - Dispatcher du = initDispatcher(new HashMap() {{ + Dispatcher du = initDispatcher(new HashMap<String, String>() {{ put(StrutsConstants.STRUTS_I18N_ENCODING, "utf-8"); }}); du.prepare(req, res); @@ -136,7 +161,7 @@ public class DispatcherTest extends Stru public void testConfigurationManager() { - Dispatcher du = null; + Dispatcher du; InternalConfigurationManager configurationManager = new InternalConfigurationManager(); try { du = new Dispatcher(new MockServletContext(), new HashMap<String, String>()); @@ -154,7 +179,7 @@ public class DispatcherTest extends Stru } finally { - du.setInstance(null); + Dispatcher.setInstance(null); } }