1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.websocket.common.io.payload;
20
21 import java.nio.ByteBuffer;
22
23 import org.eclipse.jetty.websocket.api.extensions.Frame;
24
25 public class DeMaskProcessor implements PayloadProcessor
26 {
27 private byte maskBytes[];
28 private int maskOffset;
29
30 @Override
31 public void process(ByteBuffer payload)
32 {
33 if (maskBytes == null)
34 {
35 return;
36 }
37
38 int maskInt = ByteBuffer.wrap(maskBytes).getInt();
39 int start = payload.position();
40 int end = payload.limit();
41 int offset = this.maskOffset;
42 int remaining;
43 while ((remaining = end - start) > 0)
44 {
45 if (remaining >= 4 && (offset % 4) == 0)
46 {
47 payload.putInt(start,payload.getInt(start) ^ maskInt);
48 start += 4;
49 offset += 4;
50 }
51 else
52 {
53 payload.put(start,(byte)(payload.get(start) ^ maskBytes[offset & 3]));
54 ++start;
55 ++offset;
56 }
57 }
58 maskOffset = offset;
59 }
60
61 public void reset(byte mask[])
62 {
63 this.maskBytes = mask;
64 this.maskOffset = 0;
65 }
66
67 @Override
68 public void reset(Frame frame)
69 {
70 reset(frame.getMask());
71 }
72 }