2016-01-13 18:02 GMT+03:00  <ma...@apache.org>:
> Author: markt
> Date: Wed Jan 13 15:02:00 2016
> New Revision: 1724437
>
> URL: http://svn.apache.org/viewvc?rev=1724437&view=rev
> Log:
> Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58836
> Correctly merge query string parameters when processing a forwarded request 
> where the target includes a query string that contains a parameter with no 
> value.
>
> Modified:
>     tomcat/tc6.0.x/trunk/   (props changed)
>     
> tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
>     tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml


> Modified: 
> tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
> URL: 
> http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java?rev=1724437&r1=1724436&r2=1724437&view=diff
> ==============================================================================
> --- 
> tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
>  (original)
> +++ 
> tomcat/tc6.0.x/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
>  Wed Jan 13 15:02:00 2016
> @@ -37,7 +37,8 @@ import org.apache.catalina.Globals;
>  import org.apache.catalina.Session;
>  import org.apache.catalina.Manager;
>  import org.apache.catalina.util.Enumerator;
> -import org.apache.catalina.util.RequestUtil;
> +import org.apache.tomcat.util.buf.MessageBytes;
> +import org.apache.tomcat.util.http.Parameters;
>  import org.apache.catalina.util.StringManager;

Imports order...

>
> @@ -864,29 +865,33 @@ class ApplicationHttpRequest extends Htt
>          if ((queryParamString == null) || (queryParamString.length() < 1))
>              return;
>
> -        HashMap queryParameters = new HashMap();
> -        String encoding = getCharacterEncoding();
> -        if (encoding == null)
> -            encoding = "ISO-8859-1";
> -        try {
> -            RequestUtil.parseParameters
> -                (queryParameters, queryParamString, encoding);
> -        } catch (Exception e) {
> -            ;
> -        }
> -        Iterator keys = parameters.keySet().iterator();
> -        while (keys.hasNext()) {
> -            String key = (String) keys.next();
> -            Object value = queryParameters.get(key);
> -            if (value == null) {
> -                queryParameters.put(key, parameters.get(key));
> +        HashMap<String,String[]> queryParameters = new 
> HashMap<String,String[]>();
> +
> +        // Parse the query string from the dispatch target
> +        Parameters paramParser = new Parameters();
> +        MessageBytes queryMB = MessageBytes.newInstance();
> +        queryMB.setString(queryParamString);
> +        paramParser.setQuery(queryMB);
> +        paramParser.setQueryStringEncoding(getCharacterEncoding());
> +        paramParser.handleQueryParameters();

Looking into Parameters.handleQueryParameters() on how it deals with
MessageBytes that wraps a String. It calls  "data.toBytes()" which
uses System Default encoding (see MessageBytes.toBytes() in Tomcat 6
and Tomcat 7, Tomcat 8 onward is different).  The
RequestUtil.parseParameters() method called by the old code uses the
specified encoding.

As RequestUtil.parseParameters() method is no longer used, mark it as
@Deprecated.

> +        // Copy the original parameters
> +        queryParameters.putAll(parameters);
> +
> +        // Insert the additional parameters from the dispatch target
> +        Enumeration<String> dispParamNames = paramParser.getParameterNames();
> +        while (dispParamNames.hasMoreElements()) {
> +            String dispParamName = dispParamNames.nextElement();
> +            String[] dispParamValues = 
> paramParser.getParameterValues(dispParamName);
> +            String[] originalValues = queryParameters.get(dispParamName);
> +            if (originalValues == null) {
> +                queryParameters.put(dispParamName, dispParamValues);
>                  continue;
>              }
> -            queryParameters.put
> -                (key, mergeValues(value, parameters.get(key)));
> +            queryParameters.put(dispParamName, mergeValues(dispParamValues, 
> originalValues));
>          }
> -        parameters = queryParameters;
>
> +        parameters = queryParameters;
>      }
>
>
>
> Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
> URL: 
> http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1724437&r1=1724436&r2=1724437&view=diff
> ==============================================================================
> --- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
> +++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Wed Jan 13 15:02:00 2016
> @@ -107,6 +107,11 @@
>          Remove redundant copy of catalina.properties from o.a.c.startup.
>          Generate this copy during the ant "compile" task. (kkolinko)
>        </fix>
> +      <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. (mark)

Name typo...

> +      </fix>
>      </changelog>
>    </subsection>
>    <subsection name="Coyote">

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

Reply via email to