This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 3944507b61e4db7aab588793cefef167ddce452a Author: Mark Thomas <ma...@apache.org> AuthorDate: Wed Jan 18 20:05:16 2023 +0000 Refactor so CoyoteResponse only uses CharsetHolder --- .../apache/catalina/connector/OutputBuffer.java | 13 ++-- java/org/apache/catalina/connector/Response.java | 76 ++++++++++++++-------- .../apache/catalina/connector/ResponseFacade.java | 11 +++- java/org/apache/coyote/Response.java | 26 ++++++++ 4 files changed, 89 insertions(+), 37 deletions(-) diff --git a/java/org/apache/catalina/connector/OutputBuffer.java b/java/org/apache/catalina/connector/OutputBuffer.java index e3fd2b705c..cba68cee37 100644 --- a/java/org/apache/catalina/connector/OutputBuffer.java +++ b/java/org/apache/catalina/connector/OutputBuffer.java @@ -31,8 +31,8 @@ import jakarta.servlet.http.HttpServletResponse; import org.apache.coyote.ActionCode; import org.apache.coyote.CloseNowException; import org.apache.coyote.Response; -import org.apache.tomcat.util.buf.B2CConverter; import org.apache.tomcat.util.buf.C2BConverter; +import org.apache.tomcat.util.buf.CharsetHolder; import org.apache.tomcat.util.res.StringManager; /** @@ -551,15 +551,14 @@ public class OutputBuffer extends Writer { Charset charset = null; if (coyoteResponse != null) { - charset = coyoteResponse.getCharset(); + CharsetHolder charsetHolder = coyoteResponse.getCharsetHolder(); + // setCharacterEncoding() was called with an invalid character set + // Trigger an UnsupportedEncodingException + charsetHolder.validate(); + charset = charsetHolder.getCharset(); } if (charset == null) { - if (coyoteResponse.getCharacterEncoding() != null) { - // setCharacterEncoding() was called with an invalid character set - // Trigger an UnsupportedEncodingException - charset = B2CConverter.getCharset(coyoteResponse.getCharacterEncoding()); - } charset = org.apache.coyote.Constants.DEFAULT_BODY_CHARSET; } diff --git a/java/org/apache/catalina/connector/Response.java b/java/org/apache/catalina/connector/Response.java index 38ddd83640..6c47a21f40 100644 --- a/java/org/apache/catalina/connector/Response.java +++ b/java/org/apache/catalina/connector/Response.java @@ -50,6 +50,7 @@ import org.apache.coyote.ContinueResponseTiming; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.buf.CharChunk; +import org.apache.tomcat.util.buf.CharsetHolder; import org.apache.tomcat.util.buf.UEncoder; import org.apache.tomcat.util.buf.UEncoder.SafeCharsSet; import org.apache.tomcat.util.buf.UriUtil; @@ -486,22 +487,19 @@ public class Response implements HttpServletResponse { */ @Override public String getCharacterEncoding() { - String charset = getCoyoteResponse().getCharacterEncoding(); - if (charset != null) { - return charset; - } - - Context context = getContext(); - String result = null; - if (context != null) { - result = context.getResponseCharacterEncoding(); + String charset = getCoyoteResponse().getCharsetHolder().getName(); + if (charset == null) { + Context context = getContext(); + if (context != null) { + charset = context.getResponseCharacterEncoding(); + } } - if (result == null) { - result = org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name(); + if (charset == null) { + charset = org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name(); } - return result; + return charset; } @@ -720,11 +718,7 @@ public class Response implements HttpServletResponse { if (type == null) { getCoyoteResponse().setContentType(null); - try { - getCoyoteResponse().setCharacterEncoding(null); - } catch (UnsupportedEncodingException e) { - // Can never happen when calling with null - } + getCoyoteResponse().setCharsetHolder(CharsetHolder.EMPTY); isCharacterEncodingSet = false; return; } @@ -750,8 +744,9 @@ public class Response implements HttpServletResponse { // Ignore charset if getWriter() has already been called if (!usingWriter) { + getCoyoteResponse().setCharsetHolder(CharsetHolder.getInstance(m[1])); try { - getCoyoteResponse().setCharacterEncoding(m[1]); + getCoyoteResponse().getCharsetHolder().validate(); } catch (UnsupportedEncodingException e) { log.warn(sm.getString("coyoteResponse.encoding.invalid", m[1]), e); } @@ -767,10 +762,10 @@ public class Response implements HttpServletResponse { * 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; @@ -787,12 +782,40 @@ public class Response implements HttpServletResponse { return; } + getCoyoteResponse().setCharsetHolder(CharsetHolder.getInstance(encoding)); try { - getCoyoteResponse().setCharacterEncoding(charset); + getCoyoteResponse().getCharsetHolder().validate(); } catch (UnsupportedEncodingException e) { - log.warn(sm.getString("coyoteResponse.encoding.invalid", charset), e); + log.warn(sm.getString("coyoteResponse.encoding.invalid", encoding), e); + return; + } + if (encoding == null) { + isCharacterEncodingSet = false; + } else { + isCharacterEncodingSet = true; + } + } + + + @Override + public void setCharacterEncoding(Charset charset) { + + if (isCommitted()) { + return; + } + + // Ignore any call from an included servlet + if (included) { return; } + + // Ignore any call made after the getWriter has been invoked + // The default should be used + if (usingWriter) { + return; + } + + getCoyoteResponse().setCharsetHolder(CharsetHolder.getInstance(charset)); if (charset == null) { isCharacterEncodingSet = false; } else { @@ -832,11 +855,7 @@ public class Response implements HttpServletResponse { } if (locale == null) { - try { - getCoyoteResponse().setCharacterEncoding(null); - } catch (UnsupportedEncodingException e) { - // Impossible when calling with null - } + getCoyoteResponse().setCharsetHolder(CharsetHolder.EMPTY); } else { // In some error handling scenarios, the context is unknown // (e.g. a 404 when a ROOT context is not present) @@ -844,8 +863,9 @@ public class Response implements HttpServletResponse { if (context != null) { String charset = context.getCharset(locale); if (charset != null) { + getCoyoteResponse().setCharsetHolder(CharsetHolder.getInstance(charset)); try { - getCoyoteResponse().setCharacterEncoding(charset); + getCoyoteResponse().getCharsetHolder().validate(); } catch (UnsupportedEncodingException e) { log.warn(sm.getString("coyoteResponse.encoding.invalid", charset), e); } diff --git a/java/org/apache/catalina/connector/ResponseFacade.java b/java/org/apache/catalina/connector/ResponseFacade.java index a6adbb5851..3d2f71cc41 100644 --- a/java/org/apache/catalina/connector/ResponseFacade.java +++ b/java/org/apache/catalina/connector/ResponseFacade.java @@ -18,6 +18,7 @@ package org.apache.catalina.connector; import java.io.IOException; import java.io.PrintWriter; +import java.nio.charset.Charset; import java.util.Collection; import java.util.Locale; import java.util.Map; @@ -357,9 +358,15 @@ public class ResponseFacade implements HttpServletResponse { @Override - public void setCharacterEncoding(String arg0) { + public void setCharacterEncoding(String encoding) { checkFacade(); - response.setCharacterEncoding(arg0); + response.setCharacterEncoding(encoding); + } + + @Override + public void setCharacterEncoding(Charset charset) { + checkFacade(); + response.setCharacterEncoding(charset); } @Override diff --git a/java/org/apache/coyote/Response.java b/java/org/apache/coyote/Response.java index 1c9008765b..8401edb64b 100644 --- a/java/org/apache/coyote/Response.java +++ b/java/org/apache/coyote/Response.java @@ -496,7 +496,10 @@ public final class Response { * * @throws UnsupportedEncodingException If the specified name is not * recognised + * + * @deprecated Unused. Will be removed in Tomcat 11. */ + @Deprecated public void setCharacterEncoding(String characterEncoding) throws UnsupportedEncodingException { if (isCommitted()) { return; @@ -507,19 +510,42 @@ public final class Response { } + /** + * Returns the current character set. + * + * @return The current character set + * + * @deprecated Unused. Will be removed in Tomcat 11. + */ + @Deprecated public Charset getCharset() { return charsetHolder.getCharset(); } /** + * Returns the name of the current encoding. + * * @return The name of the current encoding + * + * @deprecated Unused. Will be removed in Tomcat 11. */ + @Deprecated public String getCharacterEncoding() { return charsetHolder.getName(); } + public CharsetHolder getCharsetHolder() { + return charsetHolder; + } + + + public void setCharsetHolder(CharsetHolder charsetHolder) { + this.charsetHolder = charsetHolder; + } + + /** * Sets the content type. * --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org