You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2017/05/04 13:29:21 UTC

svn commit: r1793798 - in /tomcat/trunk: java/org/apache/catalina/connector/ java/org/apache/catalina/core/ java/org/apache/catalina/manager/ java/org/apache/catalina/servlets/ java/org/apache/catalina/ssi/ java/org/apache/catalina/util/ java/org/apach...

Author: markt
Date: Thu May  4 13:29:20 2017
New Revision: 1793798

URL: http://svn.apache.org/viewvc?rev=1793798&view=rev
Log:
More work towards using Charset rather than String internally to reduce the number of calls required to B2CConverter.getCharset() or equivalent during a request.

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
    tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java
    tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
    tomcat/trunk/java/org/apache/catalina/ssi/SSIMediator.java
    tomcat/trunk/java/org/apache/catalina/util/URLEncoder.java
    tomcat/trunk/java/org/apache/catalina/valves/rewrite/Resolver.java
    tomcat/trunk/java/org/apache/catalina/valves/rewrite/ResolverImpl.java
    tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java
    tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java
    tomcat/trunk/test/org/apache/catalina/core/TestApplicationContextGetRequestDispatcher.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu May  4 13:29:20 2017
@@ -18,6 +18,7 @@ package org.apache.catalina.connector;
 
 import java.io.IOException;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.EnumSet;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -771,7 +772,8 @@ public class CoyoteAdapter implements Ad
         // Possible redirect
         MessageBytes redirectPathMB = request.getMappingData().redirectPath;
         if (!redirectPathMB.isNull()) {
-            String redirectPath = URLEncoder.DEFAULT.encode(redirectPathMB.toString(), "UTF-8");
+            String redirectPath = URLEncoder.DEFAULT.encode(
+                    redirectPathMB.toString(), StandardCharsets.UTF_8);
             String query = request.getQueryString();
             if (request.isRequestedSessionIdFromURL()) {
                 // This is not optimal, but as this is not very common, it

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=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu May  4 13:29:20 2017
@@ -24,6 +24,7 @@ import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.InvocationTargetException;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.security.Principal;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -1359,9 +1360,9 @@ public class Request implements HttpServ
         if (context.getDispatchersUseEncodedPaths()) {
             if (pos >= 0) {
                 relative = URLEncoder.DEFAULT.encode(
-                        requestPath.substring(0, pos + 1), "UTF-8") + path;
+                        requestPath.substring(0, pos + 1), StandardCharsets.UTF_8) + path;
             } else {
-                relative = URLEncoder.DEFAULT.encode(requestPath, "UTF-8") + path;
+                relative = URLEncoder.DEFAULT.encode(requestPath, StandardCharsets.UTF_8) + path;
             }
         } else {
             if (pos >= 0) {

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Thu May  4 13:29:20 2017
@@ -22,6 +22,7 @@ import java.lang.reflect.InvocationTarge
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -486,7 +487,7 @@ public class ApplicationContext implemen
 
         mappingData.recycle();
 
-        String encodedUri = URLEncoder.DEFAULT.encode(uriCC.toString(), "UTF-8");
+        String encodedUri = URLEncoder.DEFAULT.encode(uriCC.toString(), StandardCharsets.UTF_8);
 
         // Construct a RequestDispatcher to process this request
         return new ApplicationDispatcher(wrapper, encodedUri, wrapperPath, pathInfo,

Modified: tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/AsyncContextImpl.java Thu May  4 13:29:20 2017
@@ -17,6 +17,7 @@
 package org.apache.catalina.core;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -164,7 +165,7 @@ public class AsyncContextImpl implements
             path += pathInfo;
         }
         if (this.context.getDispatchersUseEncodedPaths()) {
-            path = URLEncoder.DEFAULT.encode(path, "UTF-8");
+            path = URLEncoder.DEFAULT.encode(path, StandardCharsets.UTF_8);
         }
         dispatch(path);
     }

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Thu May  4 13:29:20 2017
@@ -21,6 +21,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
@@ -2066,7 +2067,7 @@ public class StandardContext extends Con
             log.warn(sm.getString(
                     "standardContext.pathInvalid", path, this.path));
         }
-        encodedPath = URLEncoder.DEFAULT.encode(this.path, "UTF-8");
+        encodedPath = URLEncoder.DEFAULT.encode(this.path, StandardCharsets.UTF_8);
         if (getName() == null) {
             setName(this.path);
         }

Modified: tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/manager/HTMLManagerServlet.java Thu May  4 13:29:20 2017
@@ -24,6 +24,7 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.nio.charset.StandardCharsets;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -423,10 +424,11 @@ public final class HTMLManagerServlet ex
 
                 StringBuilder tmp = new StringBuilder();
                 tmp.append("path=");
-                tmp.append(URLEncoder.DEFAULT.encode(displayPath, "UTF-8"));
+                tmp.append(URLEncoder.DEFAULT.encode(displayPath, StandardCharsets.UTF_8));
                 if (ctxt.getWebappVersion().length() > 0) {
                     tmp.append("&version=");
-                    tmp.append(URLEncoder.DEFAULT.encode(ctxt.getWebappVersion(), "UTF-8"));
+                    tmp.append(URLEncoder.DEFAULT.encode(
+                            ctxt.getWebappVersion(), StandardCharsets.UTF_8));
                 }
                 String pathVersion = tmp.toString();
 
@@ -438,7 +440,8 @@ public final class HTMLManagerServlet ex
                 }
 
                 args = new Object[7];
-                args[0] = "<a href=\"" + URLEncoder.DEFAULT.encode(contextPath + "/", "UTF-8") +
+                args[0] = "<a href=\"" +
+                        URLEncoder.DEFAULT.encode(contextPath + "/", StandardCharsets.UTF_8) +
                         "\">" + RequestUtil.filter(displayPath) + "</a>";
                 if ("".equals(ctxt.getWebappVersion())) {
                     args[1] = noVersion;

Modified: tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java Thu May  4 13:29:20 2017
@@ -32,6 +32,7 @@ import java.io.Reader;
 import java.io.Serializable;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
 import java.security.AccessController;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -704,7 +705,7 @@ public class DefaultServlet extends Http
      * @return the rewritten path
      */
     protected String rewriteUrl(String path) {
-        return URLEncoder.DEFAULT.encode(path, "UTF-8");
+        return URLEncoder.DEFAULT.encode(path, StandardCharsets.UTF_8);
     }
 
 

Modified: tomcat/trunk/java/org/apache/catalina/ssi/SSIMediator.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ssi/SSIMediator.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ssi/SSIMediator.java (original)
+++ tomcat/trunk/java/org/apache/catalina/ssi/SSIMediator.java Thu May  4 13:29:20 2017
@@ -17,6 +17,7 @@
 package org.apache.catalina.ssi;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashSet;
@@ -279,7 +280,7 @@ public class SSIMediator {
     protected String encode(String value, String encoding) {
         String retVal = null;
         if (encoding.equalsIgnoreCase("url")) {
-            retVal = URLEncoder.DEFAULT.encode(value, "UTF-8");
+            retVal = URLEncoder.DEFAULT.encode(value, StandardCharsets.UTF_8);
         } else if (encoding.equalsIgnoreCase("none")) {
             retVal = value;
         } else if (encoding.equalsIgnoreCase("entity")) {

Modified: tomcat/trunk/java/org/apache/catalina/util/URLEncoder.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/util/URLEncoder.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/util/URLEncoder.java (original)
+++ tomcat/trunk/java/org/apache/catalina/util/URLEncoder.java Thu May  4 13:29:20 2017
@@ -19,8 +19,12 @@ package org.apache.catalina.util;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 import java.util.BitSet;
 
+import org.apache.tomcat.util.buf.B2CConverter;
+
 /**
  *
  * This class is very similar to the java.net.URLEncoder class.
@@ -133,18 +137,35 @@ public class URLEncoder {
      * @param encoding  The encoding to use to convert the path to bytes
      *
      * @return The encoded path
+     *
+     * @deprecated This will be removed in Tomcat 9.0.x
      */
+    @Deprecated
     public String encode(String path, String encoding) {
+        Charset charset;
+        try {
+            charset = B2CConverter.getCharset(encoding);
+        } catch (UnsupportedEncodingException e) {
+            charset = Charset.defaultCharset();
+        }
+        return encode(path, charset);
+    }
+
+
+    /**
+     * URL encodes the provided path using the given character set.
+     *
+     * @param path      The path to encode
+     * @param charset   The character set to use to convert the path to bytes
+     *
+     * @return The encoded path
+     */
+    public String encode(String path, Charset charset) {
+
         int maxBytesPerChar = 10;
         StringBuilder rewrittenPath = new StringBuilder(path.length());
         ByteArrayOutputStream buf = new ByteArrayOutputStream(maxBytesPerChar);
-        OutputStreamWriter writer = null;
-        try {
-            writer = new OutputStreamWriter(buf, encoding);
-        } catch (Exception e) {
-            e.printStackTrace();
-            writer = new OutputStreamWriter(buf);
-        }
+        OutputStreamWriter writer = new OutputStreamWriter(buf, charset);
 
         for (int i = 0; i < path.length(); i++) {
             int c = path.charAt(i);

Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/Resolver.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/Resolver.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/rewrite/Resolver.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/Resolver.java Thu May  4 13:29:20 2017
@@ -17,6 +17,8 @@
 
 package org.apache.catalina.valves.rewrite;
 
+import java.nio.charset.Charset;
+
 /**
  * Resolver abstract class.
  */
@@ -34,5 +36,13 @@ public abstract class Resolver {
 
     public abstract boolean resolveResource(int type, String name);
 
+    /**
+     * @return The name of the encoding to use to %nn encode URIs
+     *
+     * @deprecated This will be removed in Tomcat 9.0.x
+     */
+    @Deprecated
     public abstract String getUriEncoding();
+
+    public abstract Charset getUriCharset();
 }

Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/ResolverImpl.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/ResolverImpl.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/rewrite/ResolverImpl.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/ResolverImpl.java Thu May  4 13:29:20 2017
@@ -16,6 +16,7 @@
  */
 package org.apache.catalina.valves.rewrite;
 
+import java.nio.charset.Charset;
 import java.util.Calendar;
 
 import org.apache.catalina.WebResource;
@@ -178,7 +179,13 @@ public class ResolverImpl extends Resolv
     }
 
     @Override
+    @Deprecated
     public String getUriEncoding() {
         return request.getConnector().getURIEncoding();
     }
+
+    @Override
+    public Charset getUriCharset() {
+        return request.getConnector().getURICharset();
+    }
 }

Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java Thu May  4 13:29:20 2017
@@ -23,7 +23,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.StringReader;
-import java.net.URLDecoder;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Hashtable;
@@ -50,6 +50,7 @@ import org.apache.catalina.valves.ValveB
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.buf.CharChunk;
 import org.apache.tomcat.util.buf.MessageBytes;
+import org.apache.tomcat.util.buf.UDecoder;
 import org.apache.tomcat.util.buf.UriUtil;
 import org.apache.tomcat.util.http.RequestUtil;
 
@@ -296,7 +297,7 @@ public class RewriteValve extends ValveB
 
             // As long as MB isn't a char sequence or affiliated, this has to be
             // converted to a string
-            String uriEncoding = request.getConnector().getURIEncoding();
+            Charset uriCharset = request.getConnector().getURICharset();
             String originalQueryStringEncoded = request.getQueryString();
             MessageBytes urlMB =
                     context ? request.getRequestPathMB() : request.getDecodedRequestURIMB();
@@ -360,7 +361,7 @@ public class RewriteValve extends ValveB
                     }
 
                     StringBuffer urlStringEncoded =
-                            new StringBuffer(URLEncoder.DEFAULT.encode(urlStringDecoded, uriEncoding));
+                            new StringBuffer(URLEncoder.DEFAULT.encode(urlStringDecoded, uriCharset));
                     if (originalQueryStringEncoded != null &&
                             originalQueryStringEncoded.length() > 0) {
                         if (rewrittenQueryStringDecoded == null) {
@@ -371,7 +372,7 @@ public class RewriteValve extends ValveB
                                 // if qsa is specified append the query
                                 urlStringEncoded.append('?');
                                 urlStringEncoded.append(URLEncoder.QUERY.encode(
-                                        rewrittenQueryStringDecoded, uriEncoding));
+                                        rewrittenQueryStringDecoded, uriCharset));
                                 urlStringEncoded.append('&');
                                 urlStringEncoded.append(originalQueryStringEncoded);
                             } else if (index == urlStringEncoded.length() - 1) {
@@ -381,13 +382,13 @@ public class RewriteValve extends ValveB
                             } else {
                                 urlStringEncoded.append('?');
                                 urlStringEncoded.append(URLEncoder.QUERY.encode(
-                                        rewrittenQueryStringDecoded, uriEncoding));
+                                        rewrittenQueryStringDecoded, uriCharset));
                             }
                         }
                     } else if (rewrittenQueryStringDecoded != null) {
                         urlStringEncoded.append('?');
                         urlStringEncoded.append(
-                                URLEncoder.QUERY.encode(rewrittenQueryStringDecoded, uriEncoding));
+                                URLEncoder.QUERY.encode(rewrittenQueryStringDecoded, uriCharset));
                     }
 
                     // Insert the context if
@@ -400,7 +401,7 @@ public class RewriteValve extends ValveB
                     }
                     if (rule.isNoescape()) {
                         response.sendRedirect(
-                                URLDecoder.decode(urlStringEncoded.toString(), uriEncoding));
+                                UDecoder.URLDecode(urlStringEncoded.toString(), uriCharset));
                     } else {
                         response.sendRedirect(urlStringEncoded.toString());
                     }
@@ -485,7 +486,7 @@ public class RewriteValve extends ValveB
                         // This is neither decoded nor normalized
                         chunk.append(contextPath);
                     }
-                    chunk.append(URLEncoder.DEFAULT.encode(urlStringDecoded, uriEncoding));
+                    chunk.append(URLEncoder.DEFAULT.encode(urlStringDecoded, uriCharset));
                     request.getCoyoteRequest().requestURI().toChars();
                     // Decoded and normalized URI
                     // Rewriting may have denormalized the URL
@@ -504,7 +505,7 @@ public class RewriteValve extends ValveB
                         request.getCoyoteRequest().queryString().setString(null);
                         chunk = request.getCoyoteRequest().queryString().getCharChunk();
                         chunk.recycle();
-                        chunk.append(URLEncoder.QUERY.encode(queryStringDecoded, uriEncoding));
+                        chunk.append(URLEncoder.QUERY.encode(queryStringDecoded, uriCharset));
                         if (qsa && originalQueryStringEncoded != null &&
                                 originalQueryStringEncoded.length() > 0) {
                             chunk.append('&');

Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java (original)
+++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/Substitution.java Thu May  4 13:29:20 2017
@@ -51,7 +51,7 @@ public class Substitution {
                 //       We might want to consider providing a dedicated decoder
                 //       with an option to add additional safe characters to
                 //       provide users with more flexibility
-                return URLEncoder.DEFAULT.encode(result, resolver.getUriEncoding());
+                return URLEncoder.DEFAULT.encode(result, resolver.getUriCharset());
             } else {
                 return result;
             }

Modified: tomcat/trunk/test/org/apache/catalina/core/TestApplicationContextGetRequestDispatcher.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestApplicationContextGetRequestDispatcher.java?rev=1793798&r1=1793797&r2=1793798&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestApplicationContextGetRequestDispatcher.java (original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestApplicationContextGetRequestDispatcher.java Thu May  4 13:29:20 2017
@@ -488,7 +488,7 @@ public class TestApplicationContextGetRe
                 int lastSlash = target.lastIndexOf('/');
                 target = target.substring(0, lastSlash + 1);
                 if (encodePath) {
-                    target = URLEncoder.DEFAULT.encode(target, "UTF-8");
+                    target = URLEncoder.DEFAULT.encode(target, StandardCharsets.UTF_8);
                 }
                 target += dispatchPath;
             }



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