View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
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  }