Author: markt
Date: Mon Oct 13 19:27:37 2014
New Revision: 1631520
URL: http://svn.apache.org/r1631520
Log:
Cache the Encoder instances used to convert Strings to byte arrays in the
Connectors (e.g. when writing HTTP headers) to improve throughput.
Modified:
tomcat/trunk/java/org/apache/tomcat/util/buf/LocalStrings.properties
tomcat/trunk/java/org/apache/tomcat/util/buf/MessageBytes.java
tomcat/trunk/webapps/docs/changelog.xml
Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/LocalStrings.properties
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/LocalStrings.properties?rev=1631520&r1=1631519&r2=1631520&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/LocalStrings.properties
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/buf/LocalStrings.properties Mon
Oct 13 19:27:37 2014
@@ -18,6 +18,9 @@ c2bConverter.recycleFailed=Failed to rec
hexUtils.fromHex.oddDigits=The input must consist of an even number of hex
digits
hexUtils.fromHex.nonHex=The input must consist only of hex digits
+
+messageBytes.toBytesFailed=Failed to convert the String [{0}] to bytes using
Charset [{0}]
+
uDecoder.urlDecode.missingDigit=The % character must be followed by two
hexademical digits
uDecoder.convertHexDigit.notHex=[{0}] is not a hexadecimal digit
uDecoder.urlDecode.uee=Unable to URL decode the specified input since the
encoding [{0}] is not supported.
Modified: tomcat/trunk/java/org/apache/tomcat/util/buf/MessageBytes.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/buf/MessageBytes.java?rev=1631520&r1=1631519&r2=1631520&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/MessageBytes.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/buf/MessageBytes.java Mon Oct 13
19:27:37 2014
@@ -18,8 +18,16 @@ package org.apache.tomcat.util.buf;
import java.io.IOException;
import java.io.Serializable;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+import java.util.HashMap;
import java.util.Locale;
+import java.util.Map;
+
+import org.apache.tomcat.util.res.StringManager;
/**
* This class is used to represent a subarray of bytes in an HTTP message.
@@ -36,6 +44,9 @@ import java.util.Locale;
public final class MessageBytes implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
+ private static final StringManager sm = StringManager.getManager(
+ Constants.Package);
+
// primary type ( whatever is set as original value )
private int type = T_NULL;
@@ -64,6 +75,8 @@ public final class MessageBytes implemen
// strValue!=null is the same
private boolean hasStrValue=false;
+ private Map<Charset,CharsetEncoder> encoders = new HashMap<>();
+
/**
* Creates a new, uninitialized MessageBytes object.
* Use static newInstance() in order to allow
@@ -215,17 +228,29 @@ public final class MessageBytes implemen
byteC.setCharset(charset);
}
- /** Do a char->byte conversion.
+ /** Do a char->byte conversion.
*/
public void toBytes() {
- if( ! byteC.isNull() ) {
+ if (!byteC.isNull()) {
type=T_BYTES;
return;
}
toString();
type=T_BYTES;
- byte bb[] = strValue.getBytes(byteC.getCharset());
- byteC.setBytes(bb, 0, bb.length);
+ Charset charset = byteC.getCharset();
+ CharsetEncoder encoder = encoders.get(charset);
+ if (encoder == null) {
+ encoder = charset.newEncoder();
+ encoders.put(charset, encoder);
+ }
+ ByteBuffer result;
+ try {
+ result = encoder.encode(CharBuffer.wrap(strValue));
+ } catch (CharacterCodingException e) {
+ throw new IllegalArgumentException(sm.getString(
+ "messageBytes.toBytesFailed", strValue, charset), e);
+ }
+ byteC.setBytes(result.array(), result.arrayOffset(), result.limit());
}
/** Convert to char[] and fill the CharChunk.
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1631520&r1=1631519&r2=1631520&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Mon Oct 13 19:27:37 2014
@@ -143,6 +143,15 @@
</fix>
</changelog>
</subsection>
+ <subsection name="Coyote">
+ <changelog>
+ <scode>
+ Cache the <code>Encoder</code> instances used to convert Strings to
byte
+ arrays in the Connectors (e.g. when writing HTTP headers) to improve
+ throughput. (markt)
+ </scode>
+ </changelog>
+ </subsection>
<subsection name="WebSocket">
<changelog>
<fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]