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: [email protected]
For additional commands, e-mail: [email protected]