This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/8.5.x by this push: new a4e4e92d17 Align with 11.0.x, 10.1.x and 9.0.x a4e4e92d17 is described below commit a4e4e92d176c03c823cfea33ad6c49596ba0dee8 Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu Jun 1 21:46:18 2023 +0100 Align with 11.0.x, 10.1.x and 9.0.x --- .../apache/catalina/connector/CoyoteAdapter.java | 5 +++- .../catalina/connector/CoyoteInputStream.java | 2 ++ .../catalina/connector/CoyoteOutputStream.java | 2 ++ java/org/apache/catalina/connector/Request.java | 29 ++---------------- java/org/apache/catalina/connector/Response.java | 18 ++++------- .../apache/catalina/connector/ResponseFacade.java | 5 ++-- java/org/apache/catalina/util/RequestUtil.java | 35 ++++++++++++++++++++++ 7 files changed, 53 insertions(+), 43 deletions(-) diff --git a/java/org/apache/catalina/connector/CoyoteAdapter.java b/java/org/apache/catalina/connector/CoyoteAdapter.java index 066fa82d83..8eacf7a742 100644 --- a/java/org/apache/catalina/connector/CoyoteAdapter.java +++ b/java/org/apache/catalina/connector/CoyoteAdapter.java @@ -887,7 +887,10 @@ public class CoyoteAdapter implements Adapter { req.decodedURI().toBytes(); ByteChunk uriBC = req.decodedURI().getByteChunk(); - int semicolon = uriBC.indexOf(';', 0); + // The first character must always be '/' so start search at position 1. + // If the first character is ';' the URI will be rejected at the + // normalization stage + int semicolon = uriBC.indexOf(';', 1); // Performance optimisation. Return as soon as it is known there are no // path parameters; if (semicolon == -1) { diff --git a/java/org/apache/catalina/connector/CoyoteInputStream.java b/java/org/apache/catalina/connector/CoyoteInputStream.java index 9babdc0cca..3b429951c8 100644 --- a/java/org/apache/catalina/connector/CoyoteInputStream.java +++ b/java/org/apache/catalina/connector/CoyoteInputStream.java @@ -21,6 +21,7 @@ import java.nio.ByteBuffer; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import java.util.Objects; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; @@ -169,6 +170,7 @@ public class CoyoteInputStream extends ServletInputStream { * @throws IOException if an input or output exception has occurred */ public int read(final ByteBuffer b) throws IOException { + Objects.requireNonNull(b); checkNonBlockingRead(); if (SecurityUtil.isPackageProtectionEnabled()) { diff --git a/java/org/apache/catalina/connector/CoyoteOutputStream.java b/java/org/apache/catalina/connector/CoyoteOutputStream.java index 71fbe7d18f..a6cb729b9e 100644 --- a/java/org/apache/catalina/connector/CoyoteOutputStream.java +++ b/java/org/apache/catalina/connector/CoyoteOutputStream.java @@ -18,6 +18,7 @@ package org.apache.catalina.connector; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.Objects; import javax.servlet.ServletOutputStream; import javax.servlet.WriteListener; @@ -101,6 +102,7 @@ public class CoyoteOutputStream extends ServletOutputStream { public void write(ByteBuffer from) throws IOException { + Objects.requireNonNull(from); boolean nonBlocking = checkNonBlockingWrite(); ob.write(from); if (nonBlocking) { diff --git a/java/org/apache/catalina/connector/Request.java b/java/org/apache/catalina/connector/Request.java index 1bfe791e8f..c1d4c8dd76 100644 --- a/java/org/apache/catalina/connector/Request.java +++ b/java/org/apache/catalina/connector/Request.java @@ -85,6 +85,7 @@ import org.apache.catalina.core.AsyncContextImpl; import org.apache.catalina.mapper.MappingData; import org.apache.catalina.session.ManagerBase; import org.apache.catalina.util.ParameterMap; +import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.TLSUtil; import org.apache.catalina.util.URLEncoder; import org.apache.coyote.ActionCode; @@ -132,7 +133,6 @@ public class Request implements HttpServletRequest { private static final Log log = LogFactory.getLog(Request.class); - // ----------------------------------------------------------- Constructors public Request() { formats = new SimpleDateFormat[formatsTemplate.length]; @@ -1235,6 +1235,7 @@ public class Request implements HttpServletRequest { } usingReader = true; + inputBuffer.checkConverter(); if (reader == null) { reader = new CoyoteReader(inputBuffer); @@ -1988,13 +1989,6 @@ public class Request implements HttpServletRequest { } - // --------------------------------------------- HttpServletRequest Methods - - /** - * {@inheritDoc} - * - * @since Servlet 3.1 - */ @SuppressWarnings("unchecked") @Override public <T extends HttpUpgradeHandler> T upgrade(Class<T> httpUpgradeHandlerClass) @@ -2382,24 +2376,7 @@ public class Request implements HttpServletRequest { @Override public StringBuffer getRequestURL() { - - StringBuffer url = new StringBuffer(); - String scheme = getScheme(); - int port = getServerPort(); - if (port < 0) { - port = 80; // Work around java.net.URL bug - } - - url.append(scheme); - url.append("://"); - url.append(getServerName()); - if ((scheme.equals("http") && (port != 80)) || (scheme.equals("https") && (port != 443))) { - url.append(':'); - url.append(port); - } - url.append(getRequestURI()); - - return url; + return RequestUtil.getRequestURL(this); } diff --git a/java/org/apache/catalina/connector/Response.java b/java/org/apache/catalina/connector/Response.java index 8a4be807fd..914199321c 100644 --- a/java/org/apache/catalina/connector/Response.java +++ b/java/org/apache/catalina/connector/Response.java @@ -772,10 +772,10 @@ public class Response implements HttpServletResponse { * Overrides the name of the character encoding used in the body of the request. This method must be called prior to * reading request parameters or reading input using getReader(). * - * @param charset String containing the name of the character encoding. + * @param encoding String containing the name of the character encoding. */ @Override - public void setCharacterEncoding(String charset) { + public void setCharacterEncoding(String encoding) { if (isCommitted()) { return; @@ -793,12 +793,12 @@ public class Response implements HttpServletResponse { } try { - getCoyoteResponse().setCharacterEncoding(charset); + getCoyoteResponse().setCharacterEncoding(encoding); } catch (IllegalArgumentException e) { - log.warn(sm.getString("coyoteResponse.encoding.invalid", charset), e); + log.warn(sm.getString("coyoteResponse.encoding.invalid", encoding), e); return; } - if (charset == null) { + if (encoding == null) { isCharacterEncodingSet = false; } else { isCharacterEncodingSet = true; @@ -1279,14 +1279,6 @@ public class Response implements HttpServletResponse { } - /** - * Send a temporary redirect to the specified redirect location URL. - * - * @param location Location URL to redirect to - * - * @exception IllegalStateException if this response has already been committed - * @exception IOException if an input/output error occurs - */ @Override public void sendRedirect(String location) throws IOException { sendRedirect(location, SC_FOUND); diff --git a/java/org/apache/catalina/connector/ResponseFacade.java b/java/org/apache/catalina/connector/ResponseFacade.java index 6e2a6c2658..c2a8e968b4 100644 --- a/java/org/apache/catalina/connector/ResponseFacade.java +++ b/java/org/apache/catalina/connector/ResponseFacade.java @@ -112,7 +112,6 @@ public class ResponseFacade implements HttpServletResponse { // ----------------------------------------------- Class/Instance Variables - /** * The string manager for this package. */ @@ -471,9 +470,9 @@ public class ResponseFacade implements HttpServletResponse { @Override - public void setCharacterEncoding(String arg0) { + public void setCharacterEncoding(String encoding) { checkFacade(); - response.setCharacterEncoding(arg0); + response.setCharacterEncoding(encoding); } @Override diff --git a/java/org/apache/catalina/util/RequestUtil.java b/java/org/apache/catalina/util/RequestUtil.java index 79a312fdec..58fb8e4622 100644 --- a/java/org/apache/catalina/util/RequestUtil.java +++ b/java/org/apache/catalina/util/RequestUtil.java @@ -16,6 +16,8 @@ */ package org.apache.catalina.util; +import javax.servlet.http.HttpServletRequest; + /** * General purpose request parsing and encoding utility methods. * @@ -24,6 +26,39 @@ package org.apache.catalina.util; */ public final class RequestUtil { + /** + * Build an appropriate return value for + * {@link HttpServletRequest#getRequestURL()} based on the provided + * request object. Note that this will also work for instances of + * {@link javax.servlet.http.HttpServletRequestWrapper}. + * + * @param request The request object for which the URL should be built + * + * @return The request URL for the given request object + */ + public static StringBuffer getRequestURL(HttpServletRequest request) { + StringBuffer url = new StringBuffer(); + String scheme = request.getScheme(); + int port = request.getServerPort(); + if (port < 0) { + // Work around java.net.URL bug + port = 80; + } + + url.append(scheme); + url.append("://"); + url.append(request.getServerName()); + if ((scheme.equals("http") && (port != 80)) + || (scheme.equals("https") && (port != 443))) { + url.append(':'); + url.append(port); + } + url.append(request.getRequestURI()); + + return url; + } + + /** * Filter the specified message string for characters that are sensitive * in HTML. This avoids potential attacks caused by including JavaScript --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org