/
write.go
84 lines (71 loc) 路 1.41 KB
/
write.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package ws
import (
"encoding/binary"
)
// Header size length bounds in bytes.
const (
MaxHeaderSize = 14
//MinHeaderSize = 2
)
const (
bit0 = 0x80
//bit1 = 0x40
//bit2 = 0x20
//bit3 = 0x10
//bit4 = 0x08
bit5 = 0x04
bit6 = 0x02
bit7 = 0x01
len7 = int64(125)
len16 = int64(^(uint16(0)))
len64 = int64(^(uint64(0)) >> 1)
)
//// HeaderSize returns number of bytes that are needed to encode given header.
//// It returns -1 if header is malformed.
//func HeaderSize(h *Header) (n int) {
// switch {
// case h.Length < 126:
// n = 2
// case h.Length <= len16:
// n = 4
// case h.Length <= len64:
// n = 10
// default:
// return -1
// }
// if h.Masked {
// n += len(h.Mask)
// }
// return n
//}
// WriteHeader writes header binary representation into w.
func WriteHeader(h *Header) ([]byte, error) {
// Make slice of bytes with capacity 14 that could hold any header.
bts := make([]byte, MaxHeaderSize)
if h.Fin {
bts[0] |= bit0
}
bts[0] |= h.Rsv << 4
bts[0] |= byte(h.OpCode)
var n int
switch {
case h.Length <= len7:
bts[1] = byte(h.Length)
n = 2
case h.Length <= len16:
bts[1] = 126
binary.BigEndian.PutUint16(bts[2:4], uint16(h.Length))
n = 4
case h.Length <= len64:
bts[1] = 127
binary.BigEndian.PutUint64(bts[2:10], uint64(h.Length))
n = 10
default:
return nil, ErrHeaderLengthUnexpected
}
if h.Masked {
bts[1] |= bit0
n += copy(bts[n:], h.Mask[:])
}
return bts[:n], nil
}