You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by vi...@apache.org on 2013/05/24 19:46:27 UTC

svn commit: r1486134 - in /tomcat/trunk: java/org/apache/catalina/connector/Request.java test/org/apache/catalina/connector/TestRequest.java

Author: violetagg
Date: Fri May 24 17:46:27 2013
New Revision: 1486134

URL: http://svn.apache.org/r1486134
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54984
Ensure that the correct encoding will be used when processing the multipart data.

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1486134&r1=1486133&r2=1486134&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Fri May 24 17:46:27 2013
@@ -2629,7 +2629,11 @@ public class Request
                         try {
                             String encoding = parameters.getEncoding();
                             if (encoding == null) {
-                                encoding = Parameters.DEFAULT_ENCODING;
+                                if (enc == null) {
+                                    encoding = Parameters.DEFAULT_ENCODING;
+                                } else {
+                                    encoding = enc;
+                                }
                             }
                             value = part.getString(encoding);
                         } catch (UnsupportedEncodingException uee) {

Modified: tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java?rev=1486134&r1=1486133&r2=1486134&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java (original)
+++ tomcat/trunk/test/org/apache/catalina/connector/TestRequest.java Fri May 24 17:46:27 2013
@@ -17,12 +17,17 @@
 
 package org.apache.catalina.connector;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.TreeMap;
 
 import javax.servlet.ServletException;
@@ -33,6 +38,7 @@ import javax.servlet.http.HttpServletRes
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import org.junit.Test;
 
@@ -362,7 +368,7 @@ public class TestRequest extends TomcatB
         root.addServletMapping("/", "Bug37794");
         tomcat.start();
 
-        HttpURLConnection conn = getConnection();
+        HttpURLConnection conn = getConnection("http://localhost:" + getPort() + "/");
         InputStream is = conn.getInputStream();
         assertNotNull(is);
     }
@@ -376,7 +382,7 @@ public class TestRequest extends TomcatB
         root.addServletMapping("/", "Bug37794");
         tomcat.start();
 
-        HttpURLConnection conn = getConnection();
+        HttpURLConnection conn = getConnection("http://localhost:" + getPort() + "/");
         conn.setChunkedStreamingMode(8 * 1024);
         InputStream is = conn.getInputStream();
         assertNotNull(is);
@@ -459,6 +465,34 @@ public class TestRequest extends TomcatB
         */
     }
 
+    @Test
+    public void testBug54984() throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+        Context root = tomcat.addContext("",
+                System.getProperty("java.io.tmpdir"));
+        root.setAllowCasualMultipartParsing(true);
+        Tomcat.addServlet(root, "Bug54984", new Bug54984Servlet());
+        root.addServletMapping("/", "Bug54984");
+        tomcat.start();
+
+        HttpURLConnection conn = getConnection("http://localhost:" + getPort()
+                + "/parseParametersBeforeParseParts");
+
+        prepareRequestBug54984(conn);
+
+        checkResponseBug54984(conn);
+
+        conn.disconnect();
+
+        conn = getConnection("http://localhost:" + getPort() + "/");
+
+        prepareRequestBug54984(conn);
+
+        checkResponseBug54984(conn);
+
+        conn.disconnect();
+    }
+
     /**
      *
      */
@@ -577,8 +611,7 @@ public class TestRequest extends TomcatB
         }
     }
 
-    private HttpURLConnection getConnection() throws IOException {
-        final String query = "http://localhost:" + getPort() + "/";
+    private HttpURLConnection getConnection(String query) throws IOException {
         URL postURL;
         postURL = new URL(query);
         HttpURLConnection conn = (HttpURLConnection) postURL.openConnection();
@@ -591,4 +624,74 @@ public class TestRequest extends TomcatB
 
         return conn;
     }
+
+    private static class Bug54984Servlet extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+                throws ServletException, IOException {
+            req.setCharacterEncoding("UTF-8");
+
+            if (req.getRequestURI().endsWith("parseParametersBeforeParseParts")) {
+                req.getParameterNames();
+            }
+
+            req.getPart("part");
+            resp.getWriter().println("Part " + req.getParameter("part"));
+        }
+    }
+
+    private void prepareRequestBug54984(HttpURLConnection conn)
+            throws Exception {
+        String boundary = "-----" + System.currentTimeMillis();
+        conn.setRequestProperty("Content-Type",
+                "multipart/form-data; boundary=" + boundary);
+
+        PrintWriter writer = null;
+        try {
+            writer = new PrintWriter(new OutputStreamWriter(
+                    conn.getOutputStream(), "UTF-8"), true);
+            writer.append("--" + boundary).append("\r\n");
+            writer.append("Content-Disposition: form-data; name=\"part\"\r\n");
+            writer.append("Content-Type: text/plain; charset=UTF-8\r\n");
+            writer.append("\r\n");
+            writer.append("äö").append("\r\n");
+            writer.flush();
+
+            writer.append("\r\n");
+            writer.flush();
+
+            writer.append("--" + boundary + "--").append("\r\n");
+        } finally {
+            if (writer != null) {
+                writer.close();
+            }
+        }
+    }
+
+    private void checkResponseBug54984(HttpURLConnection conn)
+            throws Exception {
+        List<String> response = new ArrayList<>();
+        int status = conn.getResponseCode();
+        if (status == HttpURLConnection.HTTP_OK) {
+            BufferedReader reader = null;
+            try {
+                reader = new BufferedReader(new InputStreamReader(
+                        conn.getInputStream()));
+                String line = null;
+                while ((line = reader.readLine()) != null) {
+                    response.add(line);
+                }
+                assertTrue(response.contains("Part äö"));
+            } catch (Exception e) {
+                if (reader != null) {
+                    reader.close();
+                }
+            }
+        } else {
+            fail("OK status was expected: " + status);
+        }
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org