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