diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java index 93632fa12..dcc5fe72a 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java @@ -85,7 +85,7 @@ public class Dispatcher { */ public static final String REQUEST_POST_METHOD = "POST"; - public static final String MULTIPART_FORM_DATA_REGEX = "^multipart/form-data(; boundary=[0-9a-zA-Z'()+_,\\-./:=?]{1,70})?"; + public static final String MULTIPART_FORM_DATA_REGEX = "^multipart/form-data(; boundary=[0-9a-zA-Z'()+_,\\-./:=?]{1,70})?(;charset=[a-zA-Z\\-0-9]{3,14})?"; /** * Provide a thread local instance. diff --git a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java index 5c7252eb5..7e25fb11f 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/DispatcherTest.java @@ -291,6 +291,36 @@ public class DispatcherTest extends StrutsInternalTestCase { assertTrue(du.isMultipartSupportEnabled(req)); } + public void testIsMultipartRequest() throws Exception { + MockHttpServletRequest req = new MockHttpServletRequest(); + HttpServletResponse res = new MockHttpServletResponse(); + + req.setMethod("POST"); + Dispatcher du = initDispatcher(Collections.emptyMap()); + du.prepare(req, res); + + req.setContentType("multipart/form-data"); + assertTrue(du.isMultipartRequest(req)); + + req.setContentType("multipart/form-data; boundary=---------------------------207103069210263"); + assertTrue(du.isMultipartRequest(req)); + + req.setContentType("multipart/form-data; boundary=---------------------------207103069210263;charset=UTF-8"); + assertTrue(du.isMultipartRequest(req)); + + req.setContentType("multipart/form-data; boundary=---------------------------207103069210263;charset=ISO-8859-1"); + assertTrue(du.isMultipartRequest(req)); + + req.setContentType("multipart/form-data; boundary=---------------------------207103069210263;charset=Windows-1250"); + assertTrue(du.isMultipartRequest(req)); + + req.setContentType("multipart/form-data; boundary=---------------------------207103069210263;charset=US-ASCII"); + assertTrue(du.isMultipartRequest(req)); + + req.setContentType("multipart/form-data; boundary=---------------------------207103069210263;charset=UTF-16LE"); + assertTrue(du.isMultipartRequest(req)); + } + class InternalConfigurationManager extends ConfigurationManager { public boolean destroyConfiguration = false;