Author: markt
Date: Thu May  4 20:19:52 2017
New Revision: 1793887

URL: http://svn.apache.org/viewvc?rev=1793887&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/ApplicationHttpRequest.java
    tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java
    tomcat/trunk/test/org/apache/tomcat/util/http/TestParameters.java
    
tomcat/trunk/test/org/apache/tomcat/util/http/TesterParametersPerformance.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=1793887&r1=1793886&r2=1793887&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu May  
4 20:19:52 2017
@@ -318,7 +318,7 @@ public class CoyoteAdapter implements Ad
             res.setNote(ADAPTER_NOTES, response);
 
             // Set query string encoding
-            
req.getParameters().setQueryStringEncoding(connector.getURIEncoding());
+            
req.getParameters().setQueryStringCharset(connector.getURICharset());
         }
 
         if (connector.getXpoweredBy()) {
@@ -447,7 +447,7 @@ public class CoyoteAdapter implements Ad
             res.setNote(ADAPTER_NOTES, response);
 
             // Set query string encoding
-            
req.getParameters().setQueryStringEncoding(connector.getURIEncoding());
+            
req.getParameters().setQueryStringCharset(connector.getURICharset());
         }
 
         try {

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=1793887&r1=1793886&r2=1793887&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu May  4 
20:19:52 2017
@@ -985,6 +985,26 @@ public class Request implements HttpServ
     }
 
 
+    private Charset getCharset() {
+        Charset charset = coyoteRequest.getCharset();
+        if (charset != null) {
+            return charset;
+        }
+
+        Context context = getContext();
+        if (context != null) {
+            String encoding = context.getRequestCharacterEncoding();
+            try {
+                return B2CConverter.getCharset(encoding);
+            } catch (UnsupportedEncodingException e) {
+                // Ignore
+            }
+        }
+
+        return org.apache.coyote.Constants.DEFAULT_BODY_CHARSET;
+    }
+
+
     /**
      * @return the content length for this Request.
      */
@@ -2796,15 +2816,7 @@ public class Request implements HttpServ
                         upload.parseRequest(new ServletRequestContext(this));
                 int maxPostSize = getConnector().getMaxPostSize();
                 int postSize = 0;
-                String enc = getCharacterEncoding();
-                Charset charset = null;
-                if (enc != null) {
-                    try {
-                        charset = B2CConverter.getCharset(enc);
-                    } catch (UnsupportedEncodingException e) {
-                        // Ignore
-                    }
-                }
+                Charset charset = getCharset();
                 for (FileItem item : items) {
                     ApplicationPart part = new ApplicationPart(item, location);
                     parts.add(part);
@@ -2812,31 +2824,15 @@ public class Request implements HttpServ
                         String name = part.getName();
                         String value = null;
                         try {
-                            String encoding = parameters.getEncoding();
-                            if (encoding == null) {
-                                if (enc == null) {
-                                    encoding = Parameters.DEFAULT_ENCODING;
-                                } else {
-                                    encoding = enc;
-                                }
-                            }
-                            value = part.getString(encoding);
+                            Charset paramCharset = parameters.getCharset();
+                            value = part.getString(paramCharset.name());
                         } catch (UnsupportedEncodingException uee) {
-                            try {
-                                value = 
part.getString(Parameters.DEFAULT_ENCODING);
-                            } catch (UnsupportedEncodingException e) {
-                                // Should not be possible
-                            }
+                            // Not possible
                         }
                         if (maxPostSize >= 0) {
                             // Have to calculate equivalent size. Not 
completely
                             // accurate but close enough.
-                            if (charset == null) {
-                                // Name length
-                                postSize += name.getBytes().length;
-                            } else {
-                                postSize += name.getBytes(charset).length;
-                            }
+                            postSize += name.getBytes(charset).length;
                             if (value != null) {
                                 // Equals sign
                                 postSize++;
@@ -3127,20 +3123,12 @@ public class Request implements HttpServ
 
             // getCharacterEncoding() may have been overridden to search for
             // hidden form field containing request encoding
-            String enc = getCharacterEncoding();
+            Charset charset = getCharset();
 
             boolean useBodyEncodingForURI = 
connector.getUseBodyEncodingForURI();
-            if (enc != null) {
-                parameters.setEncoding(enc);
-                if (useBodyEncodingForURI) {
-                    parameters.setQueryStringEncoding(enc);
-                }
-            } else {
-                
parameters.setEncoding(org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name());
-                if (useBodyEncodingForURI) {
-                    parameters.setQueryStringEncoding(
-                            
org.apache.coyote.Constants.DEFAULT_BODY_CHARSET.name());
-                }
+            parameters.setCharset(charset);
+            if (useBodyEncodingForURI) {
+                parameters.setQueryStringCharset(charset);
             }
             // Note: If !useBodyEncodingForURI, the query string encoding is
             //       that set towards the start of CoyoyeAdapter.service()

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java?rev=1793887&r1=1793886&r2=1793887&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationHttpRequest.java Thu 
May  4 20:19:52 2017
@@ -21,6 +21,8 @@ package org.apache.catalina.core;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -878,19 +880,19 @@ class ApplicationHttpRequest extends Htt
         // - To add to the fun, the URI default changed in Servlet 4.0 to UTF-8
 
         String encoding = getCharacterEncoding();
-        // No need to process null value, as ISO-8859-1 is the default encoding
-        // in MessageBytes.toBytes().
+        Charset charset = null;
         if (encoding != null) {
             try {
-                queryMB.setCharset(B2CConverter.getCharset(encoding));
-            } catch (UnsupportedEncodingException ignored) {
+                charset = B2CConverter.getCharset(encoding);
+                queryMB.setCharset(charset);
+            } catch (UnsupportedEncodingException e) {
                 // Fall-back to default (ISO-8859-1)
-                encoding = null;
+                charset = StandardCharsets.ISO_8859_1;
             }
         }
 
         paramParser.setQuery(queryMB);
-        paramParser.setQueryStringEncoding(encoding);
+        paramParser.setQueryStringCharset(charset);
         paramParser.handleQueryParameters();
 
         // Insert the additional parameters from the dispatch target

Modified: tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java?rev=1793887&r1=1793886&r2=1793887&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java Thu May  4 
20:19:52 2017
@@ -60,8 +60,8 @@ public final class Parameters {
     private UDecoder urlDec;
     private final MessageBytes decodedQuery = MessageBytes.newInstance();
 
-    private String encoding=null;
-    private String queryStringEncoding=null;
+    private Charset charset = StandardCharsets.ISO_8859_1;
+    private Charset queryStringCharset = StandardCharsets.UTF_8;
 
     private int limit = -1;
     private int parameterCount = 0;
@@ -84,21 +84,58 @@ public final class Parameters {
         this.limit = limit;
     }
 
+    /**
+     * @return The current encoding
+     *
+     * @deprecated This method will be removed in Tomcat 9.0.x
+     */
+    @Deprecated
     public String getEncoding() {
-        return encoding;
+        return charset.name();
+    }
+
+    public Charset getCharset() {
+        return charset;
+    }
+
+    /**
+     * @param s The new encoding
+     *
+     * @deprecated This method will be removed in Tomcat 9.0.x
+     */
+    @Deprecated
+    public void setEncoding(String s) {
+        setCharset(getCharset(s, DEFAULT_BODY_CHARSET));
     }
 
-    public void setEncoding( String s ) {
-        encoding=s;
+    public void setCharset(Charset charset) {
+        if (charset == null) {
+            charset = DEFAULT_BODY_CHARSET;
+        }
+        this.charset = charset;
         if(log.isDebugEnabled()) {
-            log.debug( "Set encoding to " + s );
+            log.debug("Set encoding to " + charset.name());
         }
     }
 
-    public void setQueryStringEncoding( String s ) {
-        queryStringEncoding=s;
+    /**
+     * @param s The new query string encoding
+     *
+     * @deprecated This method will be removed in Tomcat 9
+     */
+    @Deprecated
+    public void setQueryStringEncoding(String s) {
+        setQueryStringCharset(getCharset(s, DEFAULT_URI_CHARSET));
+    }
+
+    public void setQueryStringCharset(Charset queryStringCharset) {
+        if (queryStringCharset == null) {
+            queryStringCharset = DEFAULT_URI_CHARSET;
+        }
+        this.queryStringCharset = queryStringCharset;
+
         if(log.isDebugEnabled()) {
-            log.debug( "Set query string encoding to " + s );
+            log.debug("Set query string encoding to " + 
queryStringCharset.name());
         }
     }
 
@@ -123,8 +160,8 @@ public final class Parameters {
     public void recycle() {
         parameterCount = 0;
         paramHashValues.clear();
-        didQueryParameters=false;
-        encoding=null;
+        didQueryParameters = false;
+        charset = null;
         decodedQuery.recycle();
         parseFailedReason = null;
     }
@@ -165,28 +202,27 @@ public final class Parameters {
     /** Process the query string into parameters
      */
     public void handleQueryParameters() {
-        if( didQueryParameters ) {
+        if (didQueryParameters) {
             return;
         }
 
-        didQueryParameters=true;
+        didQueryParameters = true;
 
-        if( queryMB==null || queryMB.isNull() ) {
+        if (queryMB == null || queryMB.isNull()) {
             return;
         }
 
         if(log.isDebugEnabled()) {
-            log.debug("Decoding query " + decodedQuery + " " +
-                    queryStringEncoding);
+            log.debug("Decoding query " + decodedQuery + " " + 
queryStringCharset.name());
         }
 
         try {
-            decodedQuery.duplicate( queryMB );
+            decodedQuery.duplicate(queryMB);
         } catch (IOException e) {
             // Can't happen, as decodedQuery can't overflow
             e.printStackTrace();
         }
-        processParameters( decodedQuery, queryStringEncoding );
+        processParameters(decodedQuery, queryStringCharset);
     }
 
 
@@ -226,20 +262,19 @@ public final class Parameters {
     private final ByteChunk origName=new ByteChunk();
     private final ByteChunk origValue=new ByteChunk();
     public static final String DEFAULT_ENCODING = "ISO-8859-1";
-    private static final Charset DEFAULT_CHARSET =
-            StandardCharsets.ISO_8859_1;
+    private static final Charset DEFAULT_BODY_CHARSET = 
StandardCharsets.ISO_8859_1;
+    private static final Charset DEFAULT_URI_CHARSET = StandardCharsets.UTF_8;
 
 
     public void processParameters( byte bytes[], int start, int len ) {
-        processParameters(bytes, start, len, getCharset(encoding));
+        processParameters(bytes, start, len, charset);
     }
 
-    private void processParameters(byte bytes[], int start, int len,
-                                  Charset charset) {
+    private void processParameters(byte bytes[], int start, int len, Charset 
charset) {
 
         if(log.isDebugEnabled()) {
             log.debug(sm.getString("parameters.bytes",
-                    new String(bytes, start, len, DEFAULT_CHARSET)));
+                    new String(bytes, start, len, DEFAULT_BODY_CHARSET)));
         }
 
         int decodeFailCount = 0;
@@ -309,8 +344,7 @@ public final class Parameters {
             if (log.isDebugEnabled() && valueStart == -1) {
                 log.debug(sm.getString("parameters.noequal",
                         Integer.valueOf(nameStart), Integer.valueOf(nameEnd),
-                        new String(bytes, nameStart, nameEnd-nameStart,
-                                DEFAULT_CHARSET)));
+                        new String(bytes, nameStart, nameEnd-nameStart, 
DEFAULT_BODY_CHARSET)));
             }
 
             if (nameEnd <= nameStart ) {
@@ -327,8 +361,8 @@ public final class Parameters {
                 if (logMode != null) {
                     String extract;
                     if (valueEnd > nameStart) {
-                        extract = new String(bytes, nameStart, valueEnd
-                                - nameStart, DEFAULT_CHARSET);
+                        extract = new String(bytes, nameStart, valueEnd - 
nameStart,
+                                DEFAULT_BODY_CHARSET);
                     } else {
                         extract = "";
                     }
@@ -482,7 +516,18 @@ public final class Parameters {
         urlDec.convert(bc, true);
     }
 
-    public void processParameters( MessageBytes data, String encoding ) {
+    /**
+     * @param data      Parameter data
+     * @param encoding  Encoding to use for encoded bytes
+     *
+     * @deprecated This method will be removed in Tomcat 9.0.x
+     */
+    @Deprecated
+    public void processParameters(MessageBytes data, String encoding) {
+        processParameters(data, getCharset(encoding, DEFAULT_BODY_CHARSET));
+    }
+
+    public void processParameters(MessageBytes data, Charset charset) {
         if( data==null || data.isNull() || data.getLength() <= 0 ) {
             return;
         }
@@ -491,18 +536,17 @@ public final class Parameters {
             data.toBytes();
         }
         ByteChunk bc=data.getByteChunk();
-        processParameters( bc.getBytes(), bc.getOffset(),
-                           bc.getLength(), getCharset(encoding));
+        processParameters(bc.getBytes(), bc.getOffset(), bc.getLength(), 
charset);
     }
 
-    private Charset getCharset(String encoding) {
+    private Charset getCharset(String encoding, Charset defaultCharset) {
         if (encoding == null) {
-            return DEFAULT_CHARSET;
+            return defaultCharset;
         }
         try {
             return B2CConverter.getCharset(encoding);
         } catch (UnsupportedEncodingException e) {
-            return DEFAULT_CHARSET;
+            return defaultCharset;
         }
     }
 

Modified: tomcat/trunk/test/org/apache/tomcat/util/http/TestParameters.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TestParameters.java?rev=1793887&r1=1793886&r2=1793887&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/TestParameters.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/TestParameters.java Thu May  
4 20:19:52 2017
@@ -18,6 +18,7 @@ package org.apache.tomcat.util.http;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.Enumeration;
 
 import static org.junit.Assert.assertArrayEquals;
@@ -105,7 +106,7 @@ public class TestParameters {
         byte[] data = input.toString().getBytes();
 
         Parameters p = new Parameters();
-        p.setEncoding("UTF-8");
+        p.setCharset(StandardCharsets.UTF_8);
         p.setLimit(limit);
 
         long start = System.nanoTime();

Modified: 
tomcat/trunk/test/org/apache/tomcat/util/http/TesterParametersPerformance.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/TesterParametersPerformance.java?rev=1793887&r1=1793886&r2=1793887&view=diff
==============================================================================
--- 
tomcat/trunk/test/org/apache/tomcat/util/http/TesterParametersPerformance.java 
(original)
+++ 
tomcat/trunk/test/org/apache/tomcat/util/http/TesterParametersPerformance.java 
Thu May  4 20:19:52 2017
@@ -53,7 +53,7 @@ public class TesterParametersPerformance
 
         byte[] params = createParams(input, size);
         //byte[] input = createParams(8);
-        p.setEncoding("ISO-8859-1");
+        p.setCharset(StandardCharsets.ISO_8859_1);
         long start = System.nanoTime();
         p.processParameters(params, 0, params.length);
         return System.nanoTime() - start;



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

Reply via email to