-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsharedtypes.go
118 lines (90 loc) · 1.93 KB
/
sharedtypes.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package mux
import (
"io"
"math"
"errors"
"fmt"
"encoding/binary"
)
// A part of a larger frame which has been broken up to alleviate head of line blocking
type Fragment struct {
data []byte
}
// A simple key value pair
type Header struct {
Key []byte
Value []byte
}
////////////////////////////
// decoding methods
////////////////////////////
func decodeHeaders(input io.Reader) ([]Header, error) {
var count int16
err := binary.Read(input, binary.BigEndian, &count)
if err != nil {
return []Header{}, err
}
headers := make([]Header, 0, count)
for i := int16(0); i < count; i++ {
header, err := decodeHeader(input)
if err != nil {
return headers, err
}
headers = append(headers, header)
}
return headers, nil
}
func decodeHeader(input io.Reader) (Header, error) {
key, err := decodeInt16Bytes(input)
if err != nil {
return Header{}, err
}
value, err := decodeInt16Bytes(input)
if err != nil {
return Header{}, err
}
header := Header {
Key: key,
Value: value,
}
return header, nil
}
////////////////////////////
// encoding methods
////////////////////////////
func encodeHeader(header *Header, writer io.Writer) error {
err := encodeBytesInt16(writer, header.Key)
if err != nil {
return err
}
return encodeBytesInt16(writer, header.Value)
}
func encodeHeaders(writer io.Writer, headers []Header) (err error) {
// write the count
l := len(headers)
if l > math.MaxInt16 {
return errors.New(fmt.Sprintf("Too many headers: %d", l))
}
int16length := int16(l)
err = binary.Write(writer, binary.BigEndian, &int16length)
if err != nil {
return
}
// write each header
for _, header := range headers {
err = encodeHeader(&header, writer)
if err != nil {
return
}
}
return nil
}
func headersSize(headers []Header) int {
acc := 2 // int16 for header count
for _, h := range headers {
acc += 4 // int16 for key and value
acc += len(h.Key)
acc += len(h.Value)
}
return acc
}