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