Author: violetagg Date: Wed Sep 17 06:43:50 2014 New Revision: 1625472 URL: http://svn.apache.org/r1625472 Log: Merged revisions 1618688, 1618704, 1618830 from tomcat/trunk: - Whitespace - Add a little plumbing for outgoing messages (no actual compression yet) - Make a couple of fields volatile that are accessed by multiple threads (in succession, not in parallel) - s/inflator/inflater/
Modified: tomcat/tc7.0.x/trunk/ (props changed) tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/PerMessageDeflate.java Propchange: tomcat/tc7.0.x/trunk/ ------------------------------------------------------------------------------ Merged /tomcat/trunk:r1618688,1618704,1618830 Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/PerMessageDeflate.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/PerMessageDeflate.java?rev=1625472&r1=1625471&r2=1625472&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/PerMessageDeflate.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/websocket/PerMessageDeflate.java Wed Sep 17 06:43:50 2014 @@ -18,6 +18,7 @@ package org.apache.tomcat.websocket; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.List; import java.util.zip.DataFormatException; import java.util.zip.Inflater; @@ -45,15 +46,13 @@ public class PerMessageDeflate implement private final int serverMaxWindowBits; private final boolean clientContextTakeover; private final int clientMaxWindowBits; - private final Inflater inflator = new Inflater(true); + private final Inflater inflater = new Inflater(true); private final ByteBuffer readBuffer = ByteBuffer.allocate(8192); - private Transformation next; - private boolean skipDecompression = false; + private volatile Transformation next; + private volatile boolean skipDecompression = false; static PerMessageDeflate negotiate(List<List<Parameter>> preferences) { - - // Accept the first preference that the server is able to support for (List<Parameter> preference : preferences) { boolean ok = true; @@ -144,6 +143,7 @@ public class PerMessageDeflate implement return null; } + private PerMessageDeflate(boolean serverContextTakeover, int serverMaxWindowBits, boolean clientContextTakeover, int clientMaxWindowBits) { this.serverContextTakeover = serverContextTakeover; @@ -156,7 +156,6 @@ public class PerMessageDeflate implement @Override public TransformationResult getMoreData(byte opCode, boolean fin, int rsv, ByteBuffer dest) throws IOException { - // Control frames are never compressed and may appear in the middle of // a WebSocket method. Pass them straight through. if (Util.isControl(opCode)) { @@ -179,26 +178,26 @@ public class PerMessageDeflate implement while (dest.remaining() > 0) { // Space available in destination. Try and fill it. try { - written = inflator.inflate( + written = inflater.inflate( dest.array(), dest.arrayOffset() + dest.position(), dest.remaining()); } catch (DataFormatException e) { throw new IOException(sm.getString("perMessageDeflate.deflateFailed"), e); } dest.position(dest.position() + written); - if (inflator.needsInput() && !usedEomBytes ) { + if (inflater.needsInput() && !usedEomBytes ) { if (dest.hasRemaining()) { readBuffer.clear(); TransformationResult nextResult = next.getMoreData(opCode, fin, (rsv ^ RSV_BITMASK), readBuffer); - inflator.setInput( + inflater.setInput( readBuffer.array(), readBuffer.arrayOffset(), readBuffer.position()); if (TransformationResult.UNDERFLOW.equals(nextResult)) { return nextResult; } else if (TransformationResult.END_OF_FRAME.equals(nextResult) && readBuffer.position() == 0) { if (fin) { - inflator.setInput(EOM_BYTES); + inflater.setInput(EOM_BYTES); usedEomBytes = true; } else { return TransformationResult.END_OF_FRAME; @@ -239,6 +238,7 @@ public class PerMessageDeflate implement } } + @Override public Extension getExtensionResponse() { Extension result = new WsExtension(NAME); @@ -263,6 +263,7 @@ public class PerMessageDeflate implement return result; } + @Override public void setNext(Transformation t) { if (next == null) { @@ -272,6 +273,7 @@ public class PerMessageDeflate implement } } + @Override public boolean validateRsvBits(int i) { if ((i & RSV_BITMASK) > 0) { @@ -287,11 +289,24 @@ public class PerMessageDeflate implement @Override public List<MessagePart> sendMessagePart(List<MessagePart> messageParts) { - // TODO: Implement compression of sent messages + List<MessagePart> compressedParts = new ArrayList<MessagePart>(messageParts.size()); + + for (MessagePart messagePart : messageParts) { + byte opCode = messagePart.getOpCode(); + if (Util.isControl(opCode)) { + // Control messages can appear in the middle of other messages + // and must not be compressed. Pass it straight through + compressedParts.add(messagePart); + } else { + // TODO: Implement compression of sent messages + compressedParts.add(messagePart); + } + } + if (next == null) { - return messageParts; + return compressedParts; } else { - return next.sendMessagePart(messageParts); + return next.sendMessagePart(compressedParts); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org