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 19:00:35 UTC

svn commit: r1793854 - in /tomcat/trunk/java/org/apache: catalina/connector/ catalina/security/ catalina/ssi/ coyote/

Author: markt
Date: Thu May  4 19:00:35 2017
New Revision: 1793854

URL: http://svn.apache.org/viewvc?rev=1793854&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/InputBuffer.java
    tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/catalina/connector/Response.java
    tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
    tomcat/trunk/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
    tomcat/trunk/java/org/apache/coyote/Constants.java
    tomcat/trunk/java/org/apache/coyote/LocalStrings.properties
    tomcat/trunk/java/org/apache/coyote/Request.java
    tomcat/trunk/java/org/apache/coyote/Response.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/InputBuffer.java Thu May  4 19:00:35 2017
@@ -546,16 +546,15 @@ public class InputBuffer extends Reader
             return;
         }
 
-        String enc = null;
+        Charset charset = null;
         if (coyoteRequest != null) {
-            enc = coyoteRequest.getCharacterEncoding();
+            charset = coyoteRequest.getCharset();
         }
 
-        if (enc == null) {
-            enc = org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING;
+        if (charset == null) {
+            charset = org.apache.coyote.Constants.DEFAULT_BODY_CHARSET;
         }
 
-        Charset charset = B2CConverter.getCharset(enc);
         SynchronizedStack<B2CConverter> stack = encoders.get(charset);
         if (stack == null) {
             stack = new SynchronizedStack<>();

Modified: tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties Thu May  4 19:00:35 2017
@@ -58,6 +58,7 @@ coyoteRequest.maxPostSizeExceeded=The mu
 coyoteRequest.noAsync=Unable to start async because the following classes in the processing chain do not support async [{0}]
 coyoteRequest.noMultipartConfig=Unable to process parts as no multi-part configuration has been provided
 
+coyoteResponse.encoding.invalid=The encoding [{0}] is not recognised by the JRE
 coyoteResponse.getOutputStream.ise=getWriter() has already been called for this response
 coyoteResponse.getWriter.ise=getOutputStream() has already been called for this response
 coyoteResponse.reset.ise=Cannot call reset() after response has been committed

Modified: tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/OutputBuffer.java Thu May  4 19:00:35 2017
@@ -34,7 +34,6 @@ import javax.servlet.http.HttpServletRes
 import org.apache.catalina.Globals;
 import org.apache.coyote.ActionCode;
 import org.apache.coyote.Response;
-import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.C2BConverter;
 import org.apache.tomcat.util.res.StringManager;
 
@@ -526,17 +525,16 @@ public class OutputBuffer extends Writer
             return;
         }
 
-        String enc = null;
+        Charset charset = null;
 
         if (coyoteResponse != null) {
-            enc = coyoteResponse.getCharacterEncoding();
+            charset = coyoteResponse.getCharset();
         }
 
-        if (enc == null) {
-            enc = org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING;
+        if (charset == null) {
+            charset = org.apache.coyote.Constants.DEFAULT_BODY_CHARSET;
         }
 
-        final Charset charset = getCharset(enc);
         conv = encoders.get(charset);
 
         if (conv == null) {
@@ -546,24 +544,6 @@ public class OutputBuffer extends Writer
     }
 
 
-    private static Charset getCharset(final String encoding) throws IOException {
-        if (Globals.IS_SECURITY_ENABLED) {
-            try {
-                return AccessController.doPrivileged(new PrivilegedGetCharset(encoding));
-            } catch (PrivilegedActionException ex) {
-                Exception e = ex.getException();
-                if (e instanceof IOException) {
-                    throw (IOException) e;
-                } else {
-                    throw new IOException(ex);
-                }
-            }
-        } else {
-            return B2CConverter.getCharset(encoding);
-        }
-    }
-
-
     private static C2BConverter createConverter(final Charset charset) throws IOException {
         if (Globals.IS_SECURITY_ENABLED) {
             try {
@@ -862,19 +842,4 @@ public class OutputBuffer extends Writer
             return new C2BConverter(charset);
         }
     }
-
-
-    private static class PrivilegedGetCharset implements PrivilegedExceptionAction<Charset> {
-
-        private final String encoding;
-
-        public PrivilegedGetCharset(String encoding) {
-            this.encoding = encoding;
-        }
-
-        @Override
-        public Charset run() throws IOException {
-            return B2CConverter.getCharset(encoding);
-        }
-    }
 }

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=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu May  4 19:00:35 2017
@@ -971,14 +971,17 @@ public class Request implements HttpServ
      */
     @Override
     public String getCharacterEncoding() {
-        String result = coyoteRequest.getCharacterEncoding();
-        if (result == null) {
-            Context context = getContext();
-            if (context != null) {
-                result =  context.getRequestCharacterEncoding();
-            }
+        Charset charset = coyoteRequest.getCharset();
+        if (charset != null) {
+            return charset.name();
         }
-        return result;
+
+        Context context = getContext();
+        if (context != null) {
+            return context.getRequestCharacterEncoding();
+        }
+
+        return null;
     }
 
 
@@ -1591,18 +1594,17 @@ public class Request implements HttpServ
      * @since Servlet 2.3
      */
     @Override
-    public void setCharacterEncoding(String enc)
-        throws UnsupportedEncodingException {
+    public void setCharacterEncoding(String enc) throws UnsupportedEncodingException {
 
         if (usingReader) {
             return;
         }
 
         // Confirm that the encoding name is valid
-        B2CConverter.getCharset(enc);
+        Charset charset = B2CConverter.getCharset(enc);
 
         // Save the validated encoding
-        coyoteRequest.setCharacterEncoding(enc);
+        coyoteRequest.setCharset(charset);
     }
 
 
@@ -3134,10 +3136,10 @@ public class Request implements HttpServ
                     parameters.setQueryStringEncoding(enc);
                 }
             } else {
-                parameters.setEncoding(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
+                parameters.setEncoding(org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name());
                 if (useBodyEncodingForURI) {
                     parameters.setQueryStringEncoding(
-                            org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
+                            org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name());
                 }
             }
             // Note: If !useBodyEncodingForURI, the query string encoding is

Modified: tomcat/trunk/java/org/apache/catalina/connector/Response.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Response.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Response.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Response.java Thu May  4 19:00:35 2017
@@ -18,6 +18,7 @@ package org.apache.catalina.connector;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.nio.charset.Charset;
@@ -53,6 +54,7 @@ import org.apache.catalina.util.SessionC
 import org.apache.coyote.ActionCode;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.CharChunk;
 import org.apache.tomcat.util.buf.UEncoder;
 import org.apache.tomcat.util.buf.UEncoder.SafeCharsSet;
@@ -549,16 +551,21 @@ public class Response implements HttpSer
      */
     @Override
     public String getCharacterEncoding() {
-        String result = getCoyoteResponse().getCharacterEncoding();
-        if (result == null) {
-            Context context = getContext();
-            if (context != null) {
-                result =  context.getResponseCharacterEncoding();
-            }
+        Charset charset = getCoyoteResponse().getCharset();
+        if (charset != null) {
+            return charset.name();
         }
+
+        Context context = getContext();
+        String result = null;
+        if (context != null) {
+            result =  context.getResponseCharacterEncoding();
+        }
+
         if (result == null) {
-            result = org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING;
+            result = org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name();
         }
+
         return result;
     }
 
@@ -794,7 +801,12 @@ public class Response implements HttpSer
         if (m[1] != null) {
             // Ignore charset if getWriter() has already been called
             if (!usingWriter) {
-                getCoyoteResponse().setCharacterEncoding(m[1]);
+                try {
+                    getCoyoteResponse().setCharset(B2CConverter.getCharset(m[1]));
+                } catch (UnsupportedEncodingException e) {
+                    log.warn(sm.getString("coyoteResponse.encoding.invalid", m[1]), e);
+                }
+
                 isCharacterEncodingSet = true;
             }
         }
@@ -826,7 +838,12 @@ public class Response implements HttpSer
             return;
         }
 
-        getCoyoteResponse().setCharacterEncoding(charset);
+        try {
+            getCoyoteResponse().setCharset(B2CConverter.getCharset(charset));
+        } catch (UnsupportedEncodingException e) {
+            log.warn(sm.getString("coyoteResponse.encoding.invalid", charset), e);
+            return;
+        }
         isCharacterEncodingSet = true;
     }
 
@@ -863,7 +880,11 @@ public class Response implements HttpSer
 
         String charset = getContext().getCharset(locale);
         if (charset != null) {
-            getCoyoteResponse().setCharacterEncoding(charset);
+            try {
+                getCoyoteResponse().setCharset(B2CConverter.getCharset(charset));
+            } catch (UnsupportedEncodingException e) {
+                log.warn(sm.getString("coyoteResponse.encoding.invalid", charset), e);
+            }
         }
     }
 

Modified: tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java (original)
+++ tomcat/trunk/java/org/apache/catalina/security/SecurityClassLoad.java Thu May  4 19:00:35 2017
@@ -143,7 +143,6 @@ public final class SecurityClassLoad {
         loader.loadClass(basePackage + "RequestFacade$GetSessionPrivilegedAction");
         loader.loadClass(basePackage + "ResponseFacade$FlushBufferPrivilegedAction");
         loader.loadClass(basePackage + "OutputBuffer$PrivilegedCreateConverter");
-        loader.loadClass(basePackage + "OutputBuffer$PrivilegedGetCharset");
         loader.loadClass(basePackage + "CoyoteInputStream$PrivilegedAvailable");
         loader.loadClass(basePackage + "CoyoteInputStream$PrivilegedClose");
         loader.loadClass(basePackage + "CoyoteInputStream$PrivilegedRead");

Modified: tomcat/trunk/java/org/apache/catalina/ssi/SSIServletExternalResolver.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ssi/SSIServletExternalResolver.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ssi/SSIServletExternalResolver.java (original)
+++ tomcat/trunk/java/org/apache/catalina/ssi/SSIServletExternalResolver.java Thu May  4 19:00:35 2017
@@ -18,10 +18,9 @@ package org.apache.catalina.ssi;
 
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.net.URL;
 import java.net.URLConnection;
-import java.net.URLDecoder;
+import java.nio.charset.Charset;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Enumeration;
@@ -37,6 +36,7 @@ import org.apache.catalina.connector.Con
 import org.apache.catalina.connector.Request;
 import org.apache.coyote.Constants;
 import org.apache.tomcat.util.buf.B2CConverter;
+import org.apache.tomcat.util.buf.UDecoder;
 import org.apache.tomcat.util.http.RequestUtil;
 
 /**
@@ -244,35 +244,32 @@ public class SSIServletExternalResolver
                 } else if (nameParts[2].equals("UNESCAPED")) {
                     requiredParts = 3;
                     if (queryString != null) {
-                        String uriEncoding = null;
+                        Charset uriCharset = null;
+                        Charset requestCharset = null;
                         boolean useBodyEncodingForURI = false;
 
                         // Get encoding settings from request / connector if
                         // possible
-                        String requestEncoding = req.getCharacterEncoding();
                         if (req instanceof Request) {
+                            requestCharset = ((Request)req).getCoyoteRequest().getCharset();
                             Connector connector =  ((Request)req).getConnector();
-                            uriEncoding = connector.getURIEncoding();
+                            uriCharset = connector.getURICharset();
                             useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
                         }
 
-                        String queryStringEncoding;
+                        Charset queryStringCharset;
 
                         // If valid, apply settings from request / connector
-                        if (useBodyEncodingForURI && requestEncoding != null) {
-                            queryStringEncoding = requestEncoding;
-                        } else if (uriEncoding != null) {
-                            queryStringEncoding = uriEncoding;
+                        if (useBodyEncodingForURI && requestCharset != null) {
+                            queryStringCharset = requestCharset;
+                        } else if (uriCharset != null) {
+                            queryStringCharset = uriCharset;
                         } else {
                             // Use default as a last resort
-                            queryStringEncoding = Constants.DEFAULT_CHARACTER_ENCODING;
+                            queryStringCharset = Constants.DEFAULT_URI_CHARSET;
                         }
 
-                        try {
-                            retVal = URLDecoder.decode(queryString, queryStringEncoding);
-                        } catch (UnsupportedEncodingException e) {
-                            retVal = queryString;
-                        }
+                        retVal = UDecoder.URLDecode(queryString, queryStringCharset);
                     }
                 }
             }

Modified: tomcat/trunk/java/org/apache/coyote/Constants.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/Constants.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/Constants.java (original)
+++ tomcat/trunk/java/org/apache/coyote/Constants.java Thu May  4 19:00:35 2017
@@ -16,6 +16,9 @@
  */
 package org.apache.coyote;
 
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
 /**
  * Constants.
  *
@@ -23,8 +26,15 @@ package org.apache.coyote;
  */
 public final class Constants {
 
+    /**
+     * @deprecated This will be removed in Tomcat 9.0.x onwards.
+     */
+    @Deprecated
     public static final String DEFAULT_CHARACTER_ENCODING="ISO-8859-1";
 
+    public static final Charset DEFAULT_URI_CHARSET = StandardCharsets.UTF_8;
+    public static final Charset DEFAULT_BODY_CHARSET = StandardCharsets.ISO_8859_1;
+
     public static final int MAX_NOTES = 32;
 
 

Modified: tomcat/trunk/java/org/apache/coyote/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/LocalStrings.properties?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/coyote/LocalStrings.properties Thu May  4 19:00:35 2017
@@ -46,6 +46,7 @@ request.notAsync=It is only valid to swi
 request.nullReadListener=The listener passed to setReadListener() may not be null
 request.readListenerSet=The non-blocking read listener has already been set
 
+response.encoding.invalid=The encoding [{0}] is not recognised by the JRE
 response.notAsync=It is only valid to switch to non-blocking IO within async processing or HTTP upgrade processing
 response.notNonBlocking=It is invalid to call isReady() when the response has not been put into non-blocking mode
 response.nullWriteListener=The listener passed to setWriteListener() may not be null

Modified: tomcat/trunk/java/org/apache/coyote/Request.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/Request.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/Request.java (original)
+++ tomcat/trunk/java/org/apache/coyote/Request.java Thu May  4 19:00:35 2017
@@ -17,12 +17,15 @@
 package org.apache.coyote;
 
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.servlet.ReadListener;
 
+import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.MessageBytes;
 import org.apache.tomcat.util.buf.UDecoder;
 import org.apache.tomcat.util.http.MimeHeaders;
@@ -127,7 +130,7 @@ public final class Request {
      */
     private long contentLength = -1;
     private MessageBytes contentTypeMB = null;
-    private String charEncoding = null;
+    private Charset charset = null;
     /**
      * Is there an expectation ?
      */
@@ -290,24 +293,54 @@ public final class Request {
      * @return The value set via {@link #setCharacterEncoding(String)} or if no
      *         call has been made to that method try to obtain if from the
      *         content type.
+     *
+     * @deprecated This method will be removed in Tomcat 9.0.x
      */
+    @Deprecated
     public String getCharacterEncoding() {
+        Charset charset = getCharset();
+        if (charset == null) {
+            return null;
+        }
+        return charset.name();
+    }
+
 
-        if (charEncoding != null) {
-            return charEncoding;
+    /**
+     * Get the character encoding used for this request.
+     *
+     * @return The value set via {@link #setCharacterEncoding(String)} or if no
+     *         call has been made to that method try to obtain if from the
+     *         content type.
+     */
+    public Charset getCharset() {
+        if (charset != null) {
+            return charset;
         }
 
-        charEncoding = getCharsetFromContentType(getContentType());
+        charset = getCharsetFromContentType(getContentType());
 
-        return charEncoding;
+        return charset;
     }
 
 
-    public void setCharacterEncoding(String enc) {
-        this.charEncoding = enc;
+    /**
+     * @param enc The new encoding
+     *
+     * @throws UnsupportedEncodingException If the encoding is invalid
+     *
+     * @deprecated This method will be removed in Tomcat 9.0.x
+     */
+    @Deprecated
+    public void setCharacterEncoding(String enc) throws UnsupportedEncodingException {
+        setCharset(B2CConverter.getCharset(enc));
     }
 
 
+    public void setCharset(Charset charset) {
+        this.charset = charset;
+    }
+
     public void setContentLength(long len) {
         this.contentLength = len;
     }
@@ -576,7 +609,7 @@ public final class Request {
 
         contentLength = -1;
         contentTypeMB = null;
-        charEncoding = null;
+        charset = null;
         expectation = false;
         headers.recycle();
         trailerFields.clear();
@@ -638,14 +671,14 @@ public final class Request {
      *
      * @param contentType a content type header
      */
-    private static String getCharsetFromContentType(String contentType) {
+    private static Charset getCharsetFromContentType(String contentType) {
 
         if (contentType == null) {
-            return (null);
+            return null;
         }
         int start = contentType.indexOf("charset=");
         if (start < 0) {
-            return (null);
+            return null;
         }
         String encoding = contentType.substring(start + 8);
         int end = encoding.indexOf(';');
@@ -657,8 +690,16 @@ public final class Request {
             && (encoding.endsWith("\""))) {
             encoding = encoding.substring(1, encoding.length() - 1);
         }
-        return (encoding.trim());
 
+        Charset result = null;
+
+        try {
+            result = B2CConverter.getCharset(encoding.trim());
+        } catch (UnsupportedEncodingException e) {
+            // Ignore
+        }
+
+        return result;
     }
 
 }

Modified: tomcat/trunk/java/org/apache/coyote/Response.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/Response.java?rev=1793854&r1=1793853&r2=1793854&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/Response.java (original)
+++ tomcat/trunk/java/org/apache/coyote/Response.java Thu May  4 19:00:35 2017
@@ -18,6 +18,7 @@ package org.apache.coyote;
 
 import java.io.IOException;
 import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.util.Locale;
@@ -27,6 +28,7 @@ import javax.servlet.WriteListener;
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.buf.B2CConverter;
 import org.apache.tomcat.util.buf.MessageBytes;
 import org.apache.tomcat.util.http.MimeHeaders;
 import org.apache.tomcat.util.http.parser.MediaType;
@@ -105,7 +107,7 @@ public final class Response {
      */
     String contentType = null;
     String contentLanguage = null;
-    String characterEncoding = null;
+    Charset charset = null;
     long contentLength = -1;
     private Locale locale = DEFAULT_LOCALE;
 
@@ -393,28 +395,68 @@ public final class Response {
         return contentLanguage;
     }
 
-    /*
+    /**
      * Overrides the name of the character encoding used in the body
      * of the response. This method must be called prior to writing output
      * using getWriter().
      *
      * @param charset String containing the name of the character encoding.
+     *
+     * @deprecated This method will be removed in Tomcat 9.0.x
      */
+    @Deprecated
     public void setCharacterEncoding(String charset) {
+        if (charset == null) {
+            return;
+        }
+
+        try {
+            setCharset(B2CConverter.getCharset(charset));
+        } catch (UnsupportedEncodingException e) {
+            log.warn(sm.getString("response.encoding.invalid", charset), e);
+        }
+    }
+
 
-        if (isCommitted())
+    /**
+     * Overrides the character encoding used in the body of the response. This
+     * method must be called prior to writing output using getWriter().
+     *
+     * @param charset The character encoding.
+     */
+    public void setCharset(Charset charset) {
+        if (isCommitted()) {
             return;
-        if (charset == null)
+        }
+        if (charset == null) {
             return;
+        }
 
-        characterEncoding = charset;
-        charsetSet=true;
+        this.charset = charset;
+        charsetSet = true;
     }
 
+
+    /**
+     * @return The name of the current encoding
+     *
+     * @deprecated This method will be removed in Tomcat 9.0.x
+     */
+    @Deprecated
     public String getCharacterEncoding() {
-        return characterEncoding;
+        Charset charset = getCharset();
+        if (charset == null) {
+            return null;
+        }
+        return charset.name();
     }
 
+
+    public Charset getCharset() {
+        return charset;
+    }
+
+
     /**
      * Sets the content type.
      *
@@ -451,8 +493,12 @@ public final class Response {
         if (charsetValue != null) {
             charsetValue = charsetValue.trim();
             if (charsetValue.length() > 0) {
-                charsetSet = true;
-                this.characterEncoding = charsetValue;
+                try {
+                    charset = B2CConverter.getCharset(charsetValue);
+                    charsetSet = true;
+                } catch (UnsupportedEncodingException e) {
+                    log.warn(sm.getString("response.encoding.invalid", charsetValue), e);
+                }
             }
         }
     }
@@ -466,9 +512,9 @@ public final class Response {
         String ret = contentType;
 
         if (ret != null
-            && characterEncoding != null
+            && charset != null
             && charsetSet) {
-            ret = ret + ";charset=" + characterEncoding;
+            ret = ret + ";charset=" + charset.name();
         }
 
         return ret;
@@ -512,7 +558,7 @@ public final class Response {
         contentType = null;
         contentLanguage = null;
         locale = DEFAULT_LOCALE;
-        characterEncoding = null;
+        charset = null;
         charsetSet = false;
         contentLength = -1;
         status = 200;



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