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