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

Reply via email to