forked from vladaionescu/leveros
/
headers.go
57 lines (48 loc) · 1.25 KB
/
headers.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
package http2stream
import (
"strings"
"golang.org/x/net/http2"
"golang.org/x/net/http2/hpack"
)
const (
// http://http2.github.io/http2-spec/#SettingValues
http2InitHeaderTableSize = 4096
)
// headerFrame is either a http2.HeaderFrame or http2.ContinuationFrame.
type headerFrame interface {
Header() http2.FrameHeader
HeaderBlockFragment() []byte
HeadersEnded() bool
}
type hpackDecoder struct {
decoder *hpack.Decoder
err error
headers map[string][]string
}
func newHPACKDecoder() *hpackDecoder {
hpackDec := &hpackDecoder{}
hpackDec.reset()
hpackDec.decoder = hpack.NewDecoder(
http2InitHeaderTableSize, func(field hpack.HeaderField) {
key := strings.ToLower(field.Name)
hpackDec.headers[key] = append(
hpackDec.headers[key], field.Value)
})
return hpackDec
}
func (hpackDec *hpackDecoder) reset() {
hpackDec.headers = make(map[string][]string)
hpackDec.err = nil
}
func (hpackDec *hpackDecoder) decode(
frame headerFrame) (endHeaders bool, err error) {
_, hpackDec.err = hpackDec.decoder.Write(frame.HeaderBlockFragment())
if frame.HeadersEnded() {
closeErr := hpackDec.decoder.Close()
if closeErr != nil && hpackDec.err == nil {
hpackDec.err = closeErr
}
endHeaders = true
}
return endHeaders, hpackDec.err
}