Correct the logic that selects the encoding to use to decode the query string in the SSIServletExternalResolver so that the useBodyEncodingForURI attribute of the Connector is correctly taken into account.

git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc8.0.x/trunk@1793823 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
index 89a1692..81ad760 100644
--- a/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
+++ b/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
@@ -33,6 +33,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.catalina.connector.Connector;
 import org.apache.catalina.connector.Request;
 import org.apache.coyote.Constants;
 import org.apache.tomcat.util.buf.B2CConverter;
@@ -243,10 +244,6 @@
                 } else if (nameParts[2].equals("UNESCAPED")) {
                     requiredParts = 3;
                     if (queryString != null) {
-                        // Use default as a last resort
-                        String queryStringEncoding =
-                            Constants.DEFAULT_CHARACTER_ENCODING;
-
                         String uriEncoding = null;
                         boolean useBodyEncodingForURI = false;
 
@@ -254,24 +251,25 @@
                         // possible
                         String requestEncoding = req.getCharacterEncoding();
                         if (req instanceof Request) {
-                            uriEncoding =
-                                ((Request)req).getConnector().getURIEncoding();
-                            useBodyEncodingForURI = ((Request)req)
-                                    .getConnector().getUseBodyEncodingForURI();
+                            Connector connector =  ((Request)req).getConnector();
+                            uriEncoding = connector.getURIEncoding();
+                            useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
                         }
 
+                        String queryStringEncoding;
+
                         // If valid, apply settings from request / connector
-                        if (uriEncoding != null) {
+                        if (useBodyEncodingForURI && requestEncoding != null) {
+                            queryStringEncoding = requestEncoding;
+                        } else if (uriEncoding != null) {
                             queryStringEncoding = uriEncoding;
-                        } else if(useBodyEncodingForURI) {
-                            if (requestEncoding != null) {
-                                queryStringEncoding = requestEncoding;
-                            }
+                        } else {
+                            // Use default as a last resort
+                            queryStringEncoding = Constants.DEFAULT_CHARACTER_ENCODING;
                         }
 
                         try {
-                            retVal = URLDecoder.decode(queryString,
-                                    queryStringEncoding);
+                            retVal = URLDecoder.decode(queryString, queryStringEncoding);
                         } catch (UnsupportedEncodingException e) {
                             retVal = queryString;
                         }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 15fb8ba..180d262 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -98,6 +98,12 @@
         <bug>61047</bug>: Add MIME mapping for woff2 fonts in the default
         web.xml. Patch provided by Justin Williamson. (violetagg)
       </add>
+      <fix>
+        Correct the logic that selects the encoding to use to decode the query
+        string in the <code>SSIServletExternalResolver</code> so that the
+        <code>useBodyEncodingForURI</code> attribute of the
+        <code>Connector</code> is correctly taken into account. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">