diff options
Diffstat (limited to 'jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/DeMaskProcessor.java')
-rw-r--r-- | jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/DeMaskProcessor.java | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/DeMaskProcessor.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/DeMaskProcessor.java index ead2bc94ca..be702a33b5 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/DeMaskProcessor.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/io/payload/DeMaskProcessor.java @@ -24,39 +24,49 @@ import org.eclipse.jetty.websocket.api.extensions.Frame; public class DeMaskProcessor implements PayloadProcessor { - private boolean isMasked; - private byte mask[]; - private int offset; + private byte maskBytes[]; + private int maskOffset; @Override public void process(ByteBuffer payload) { - if (!isMasked) + if (maskBytes == null) { return; } + int maskInt = ByteBuffer.wrap(maskBytes).getInt(); int start = payload.position(); int end = payload.limit(); - for (int i = start; i < end; i++, offset++) + int offset = this.maskOffset; + int remaining; + while ((remaining = end - start) > 0) { - payload.put(i,(byte)(payload.get(i) ^ mask[offset % 4])); + if (remaining >= 4 && (offset % 4) == 0) + { + payload.putInt(start,payload.getInt(start) ^ maskInt); + start += 4; + offset += 4; + } + else + { + payload.put(start,(byte)(payload.get(start) ^ maskBytes[offset & 3])); + ++start; + ++offset; + } } + maskOffset = offset; + } + + public void reset(byte mask[]) + { + this.maskBytes = mask; + this.maskOffset = 0; } @Override public void reset(Frame frame) { - this.isMasked = frame.isMasked(); - if (isMasked) - { - this.mask = frame.getMask(); - } - else - { - this.mask = null; - } - - offset = 0; + reset(frame.getMask()); } } |