Author: markt
Date: Fri Feb 24 17:29:26 2012
New Revision: 1293350

URL: http://svn.apache.org/viewvc?rev=1293350&view=rev
Log:
Implement read(byte[],int,int) to improve performance. Store mask as a
byte[] since that is how ost traffic will be processed.

Modified:
    tomcat/trunk/java/org/apache/catalina/websocket/WsFrame.java
    tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java

Modified: tomcat/trunk/java/org/apache/catalina/websocket/WsFrame.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/WsFrame.java?rev=1293350&r1=1293349&r2=1293350&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/websocket/WsFrame.java (original)
+++ tomcat/trunk/java/org/apache/catalina/websocket/WsFrame.java Fri Feb 24 
17:29:26 2012
@@ -38,7 +38,7 @@ public class WsFrame {
     private final boolean fin;
     private final int rsv;
     private final byte opCode;
-    private int[] mask = new int[4];
+    private byte[] mask = new byte[4];
     private long payloadLength;
     private ByteBuffer payload;
 
@@ -86,9 +86,7 @@ public class WsFrame {
             }
         }
 
-        for (int j = 0; j < mask.length; j++) {
-            mask[j] = processorRead(processor) & 0xFF;
-        }
+        processorRead(processor, mask);
 
         if (isControl()) {
             // Note: Payload limited to <= 125 bytes by test above
@@ -127,7 +125,7 @@ public class WsFrame {
         return (opCode & 0x08) > 0;
     }
 
-    public int[] getMask() {
+    public byte[] getMask() {
         return mask;
     }
 

Modified: tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java?rev=1293350&r1=1293349&r2=1293350&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/websocket/WsInputStream.java Fri Feb 
24 17:29:26 2012
@@ -104,6 +104,58 @@ public class WsInputStream extends java.
         if(masked == -1) {
             return -1;
         }
-        return masked ^ frame.getMask()[(int) ((readThisFragment - 1) % 4)];
+        return masked ^
+                (frame.getMask()[(int) ((readThisFragment - 1) % 4)] & 0xFF);
     }
+
+
+    @Override
+    public int read(byte b[], int off, int len) throws IOException {
+        if (error != null) {
+            throw new IOException(error);
+        }
+        while (remaining == 0 && !getFrame().getFin()) {
+            // Need more data - process next frame
+            processFrame();
+            while (frame.isControl()) {
+                if (getFrame().getOpCode() == Constants.OPCODE_PING) {
+                    outbound.pong(frame.getPayLoad());
+                } else if (getFrame().getOpCode() == Constants.OPCODE_PONG) {
+                    // NO-OP. Swallow it.
+                } else if (getFrame().getOpCode() == Constants.OPCODE_CLOSE) {
+                    outbound.close(frame);
+                } else{
+                    throw new IOException(sm.getString("is.unknownOpCode",
+                            Byte.valueOf(getFrame().getOpCode())));
+                }
+                processFrame();
+            }
+            if (getFrame().getOpCode() != Constants.OPCODE_CONTINUATION) {
+                error = sm.getString("is.notContinutation",
+                        Byte.valueOf(getFrame().getOpCode()));
+                throw new IOException(error);
+            }
+        }
+
+        if (remaining == 0) {
+            return -1;
+        }
+
+        if (len > remaining) {
+            len = (int) remaining;
+        }
+        int result = processor.read(b, off, len);
+        if(result == -1) {
+            return -1;
+        }
+
+        for (int i = off; i < off + result; i++) {
+            b[i] = (byte) (b[i] ^
+                    frame.getMask()[(int) ((readThisFragment + i - off) % 4)]);
+        }
+        remaining -= result;
+        readThisFragment += result;
+        return result;
+    }
+
 }



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

Reply via email to