OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / github.com / gorilla / websocket / mask.go
diff --git a/vendor/github.com/gorilla/websocket/mask.go b/vendor/github.com/gorilla/websocket/mask.go
new file mode 100644 (file)
index 0000000..577fce9
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved.  Use of
+// this source code is governed by a BSD-style license that can be found in the
+// LICENSE file.
+
+// +build !appengine
+
+package websocket
+
+import "unsafe"
+
+const wordSize = int(unsafe.Sizeof(uintptr(0)))
+
+func maskBytes(key [4]byte, pos int, b []byte) int {
+       // Mask one byte at a time for small buffers.
+       if len(b) < 2*wordSize {
+               for i := range b {
+                       b[i] ^= key[pos&3]
+                       pos++
+               }
+               return pos & 3
+       }
+
+       // Mask one byte at a time to word boundary.
+       if n := int(uintptr(unsafe.Pointer(&b[0]))) % wordSize; n != 0 {
+               n = wordSize - n
+               for i := range b[:n] {
+                       b[i] ^= key[pos&3]
+                       pos++
+               }
+               b = b[n:]
+       }
+
+       // Create aligned word size key.
+       var k [wordSize]byte
+       for i := range k {
+               k[i] = key[(pos+i)&3]
+       }
+       kw := *(*uintptr)(unsafe.Pointer(&k))
+
+       // Mask one word at a time.
+       n := (len(b) / wordSize) * wordSize
+       for i := 0; i < n; i += wordSize {
+               *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&b[0])) + uintptr(i))) ^= kw
+       }
+
+       // Mask one byte at a time for remaining bytes.
+       b = b[n:]
+       for i := range b {
+               b[i] ^= key[pos&3]
+               pos++
+       }
+
+       return pos & 3
+}