Author: kkolinko
Date: Fri Jan 15 12:49:03 2016
New Revision: 1724788

URL: http://svn.apache.org/viewvc?rev=1724788&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58836
Followup. One needs to call queryMB.setCharset() to set encoding for the query 
string during parameter merging.

Modified:
    tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
    tomcat/trunk/test/org/apache/catalina/core/TestApplicationHttpRequest.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java?rev=1724788&r1=1724787&r2=1724788&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java Fri 
Jan 15 12:49:03 2016
@@ -20,6 +20,7 @@ package org.apache.catalina.core;
 
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -39,6 +40,7 @@ import org.apache.catalina.Context;
 import org.apache.catalina.Globals;
 import org.apache.catalina.Manager;
 import org.apache.catalina.Session;
+import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.MessageBytes;
 import org.apache.tomcat.util.http.Parameters;
 
@@ -883,8 +885,20 @@ class ApplicationHttpRequest extends Htt
         Parameters paramParser = new Parameters();
         MessageBytes queryMB = MessageBytes.newInstance();
         queryMB.setString(queryParamString);
+
+        String encoding = getCharacterEncoding();
+        // No need to process null value, as ISO-8859-1 is the default encoding
+        // in MessageBytes.toBytes().
+        if (encoding != null) {
+            try {
+                queryMB.setCharset(B2CConverter.getCharset(encoding));
+            } catch (UnsupportedEncodingException ignored) {
+                // Fall-back to ISO-8859-1
+            }
+        }
+
         paramParser.setQuery(queryMB);
-        paramParser.setQueryStringEncoding(getCharacterEncoding());
+        paramParser.setQueryStringEncoding(encoding);
         paramParser.handleQueryParameters();
 
         // Copy the original parameters

Modified: 
tomcat/trunk/test/org/apache/catalina/core/TestApplicationHttpRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestApplicationHttpRequest.java?rev=1724788&r1=1724787&r2=1724788&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestApplicationHttpRequest.java 
(original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestApplicationHttpRequest.java 
Fri Jan 15 12:49:03 2016
@@ -162,6 +162,19 @@ public class TestApplicationHttpRequest
         doQueryStringTest("a=b&c&a=e", "a", expected);
     }
 
+    @Test
+    public void testMergeQueryString05() throws Exception {
+        // https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%81%D1%82
+        // "Test" = "Test"
+        String test = "\u0422\u0435\u0441\u0442";
+        String query = test + "=%D0%A2%D0%B5%D1%81%D1%82";
+
+        Map<String, String[]> expected = new HashMap<>();
+        expected.put("a", new String[] { "b" });
+        expected.put(test, new String[] { test });
+        doQueryStringTest("a=b", query, expected);
+    }
+
 
     private void doQueryStringTest(String originalQueryString, String 
forwardQueryString,
             Map<String,String[]> expected) throws Exception {
@@ -210,6 +223,7 @@ public class TestApplicationHttpRequest
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                 throws ServletException, IOException {
+            req.setCharacterEncoding("UTF-8");
             req.getRequestDispatcher(target).forward(req, resp);
         }
     }
@@ -228,6 +242,7 @@ public class TestApplicationHttpRequest
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                 throws ServletException, IOException {
+            req.setCharacterEncoding("UTF-8");
             resp.setContentType("text/plain");
             resp.setCharacterEncoding("UTF-8");
             PrintWriter w = resp.getWriter();

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1724788&r1=1724787&r2=1724788&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Fri Jan 15 12:49:03 2016
@@ -182,7 +182,7 @@
       <fix>
         <bug>58836</bug>: Correctly merge query string parameters when
         processing a forwarded request where the target includes a query string
-        that contains a parameter with no value. (markt)
+        that contains a parameter with no value. (markt/kkolinko)
       </fix>
     </changelog>
   </subsection>



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

Reply via email to