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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org