Code refactoring for bpa operator
[icn.git] / cmd / bpa-operator / vendor / golang.org / x / net / http2 / hpack / hpack.go
1 // Copyright 2014 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // Package hpack implements HPACK, a compression format for
6 // efficiently representing HTTP header fields in the context of HTTP/2.
7 //
8 // See http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-09
9 package hpack
10
11 import (
12         "bytes"
13         "errors"
14         "fmt"
15 )
16
17 // A DecodingError is something the spec defines as a decoding error.
18 type DecodingError struct {
19         Err error
20 }
21
22 func (de DecodingError) Error() string {
23         return fmt.Sprintf("decoding error: %v", de.Err)
24 }
25
26 // An InvalidIndexError is returned when an encoder references a table
27 // entry before the static table or after the end of the dynamic table.
28 type InvalidIndexError int
29
30 func (e InvalidIndexError) Error() string {
31         return fmt.Sprintf("invalid indexed representation index %d", int(e))
32 }
33
34 // A HeaderField is a name-value pair. Both the name and value are
35 // treated as opaque sequences of octets.
36 type HeaderField struct {
37         Name, Value string
38
39         // Sensitive means that this header field should never be
40         // indexed.
41         Sensitive bool
42 }
43
44 // IsPseudo reports whether the header field is an http2 pseudo header.
45 // That is, it reports whether it starts with a colon.
46 // It is not otherwise guaranteed to be a valid pseudo header field,
47 // though.
48 func (hf HeaderField) IsPseudo() bool {
49         return len(hf.Name) != 0 && hf.Name[0] == ':'
50 }
51
52 func (hf HeaderField) String() string {
53         var suffix string
54         if hf.Sensitive {
55                 suffix = " (sensitive)"
56         }
57         return fmt.Sprintf("header field %q = %q%s", hf.Name, hf.Value, suffix)
58 }
59
60 // Size returns the size of an entry per RFC 7541 section 4.1.
61 func (hf HeaderField) Size() uint32 {
62         // http://http2.github.io/http2-spec/compression.html#rfc.section.4.1
63         // "The size of the dynamic table is the sum of the size of
64         // its entries. The size of an entry is the sum of its name's
65         // length in octets (as defined in Section 5.2), its value's
66         // length in octets (see Section 5.2), plus 32.  The size of
67         // an entry is calculated using the length of the name and
68         // value without any Huffman encoding applied."
69
70         // This can overflow if somebody makes a large HeaderField
71         // Name and/or Value by hand, but we don't care, because that
72         // won't happen on the wire because the encoding doesn't allow
73         // it.
74         return uint32(len(hf.Name) + len(hf.Value) + 32)
75 }
76
77 // A Decoder is the decoding context for incremental processing of
78 // header blocks.
79 type Decoder struct {
80         dynTab dynamicTable
81         emit   func(f HeaderField)
82
83         emitEnabled bool // whether calls to emit are enabled
84         maxStrLen   int  // 0 means unlimited
85
86         // buf is the unparsed buffer. It's only written to
87         // saveBuf if it was truncated in the middle of a header
88         // block. Because it's usually not owned, we can only
89         // process it under Write.
90         buf []byte // not owned; only valid during Write
91
92         // saveBuf is previous data passed to Write which we weren't able
93         // to fully parse before. Unlike buf, we own this data.
94         saveBuf bytes.Buffer
95
96         firstField bool // processing the first field of the header block
97 }
98
99 // NewDecoder returns a new decoder with the provided maximum dynamic
100 // table size. The emitFunc will be called for each valid field
101 // parsed, in the same goroutine as calls to Write, before Write returns.
102 func NewDecoder(maxDynamicTableSize uint32, emitFunc func(f HeaderField)) *Decoder {
103         d := &Decoder{
104                 emit:        emitFunc,
105                 emitEnabled: true,
106                 firstField:  true,
107         }
108         d.dynTab.table.init()
109         d.dynTab.allowedMaxSize = maxDynamicTableSize
110         d.dynTab.setMaxSize(maxDynamicTableSize)
111         return d
112 }
113
114 // ErrStringLength is returned by Decoder.Write when the max string length
115 // (as configured by Decoder.SetMaxStringLength) would be violated.
116 var ErrStringLength = errors.New("hpack: string too long")
117
118 // SetMaxStringLength sets the maximum size of a HeaderField name or
119 // value string. If a string exceeds this length (even after any
120 // decompression), Write will return ErrStringLength.
121 // A value of 0 means unlimited and is the default from NewDecoder.
122 func (d *Decoder) SetMaxStringLength(n int) {
123         d.maxStrLen = n
124 }
125
126 // SetEmitFunc changes the callback used when new header fields
127 // are decoded.
128 // It must be non-nil. It does not affect EmitEnabled.
129 func (d *Decoder) SetEmitFunc(emitFunc func(f HeaderField)) {
130         d.emit = emitFunc
131 }
132
133 // SetEmitEnabled controls whether the emitFunc provided to NewDecoder
134 // should be called. The default is true.
135 //
136 // This facility exists to let servers enforce MAX_HEADER_LIST_SIZE
137 // while still decoding and keeping in-sync with decoder state, but
138 // without doing unnecessary decompression or generating unnecessary
139 // garbage for header fields past the limit.
140 func (d *Decoder) SetEmitEnabled(v bool) { d.emitEnabled = v }
141
142 // EmitEnabled reports whether calls to the emitFunc provided to NewDecoder
143 // are currently enabled. The default is true.
144 func (d *Decoder) EmitEnabled() bool { return d.emitEnabled }
145
146 // TODO: add method *Decoder.Reset(maxSize, emitFunc) to let callers re-use Decoders and their
147 // underlying buffers for garbage reasons.
148
149 func (d *Decoder) SetMaxDynamicTableSize(v uint32) {
150         d.dynTab.setMaxSize(v)
151 }
152
153 // SetAllowedMaxDynamicTableSize sets the upper bound that the encoded
154 // stream (via dynamic table size updates) may set the maximum size
155 // to.
156 func (d *Decoder) SetAllowedMaxDynamicTableSize(v uint32) {
157         d.dynTab.allowedMaxSize = v
158 }
159
160 type dynamicTable struct {
161         // http://http2.github.io/http2-spec/compression.html#rfc.section.2.3.2
162         table          headerFieldTable
163         size           uint32 // in bytes
164         maxSize        uint32 // current maxSize
165         allowedMaxSize uint32 // maxSize may go up to this, inclusive
166 }
167
168 func (dt *dynamicTable) setMaxSize(v uint32) {
169         dt.maxSize = v
170         dt.evict()
171 }
172
173 func (dt *dynamicTable) add(f HeaderField) {
174         dt.table.addEntry(f)
175         dt.size += f.Size()
176         dt.evict()
177 }
178
179 // If we're too big, evict old stuff.
180 func (dt *dynamicTable) evict() {
181         var n int
182         for dt.size > dt.maxSize && n < dt.table.len() {
183                 dt.size -= dt.table.ents[n].Size()
184                 n++
185         }
186         dt.table.evictOldest(n)
187 }
188
189 func (d *Decoder) maxTableIndex() int {
190         // This should never overflow. RFC 7540 Section 6.5.2 limits the size of
191         // the dynamic table to 2^32 bytes, where each entry will occupy more than
192         // one byte. Further, the staticTable has a fixed, small length.
193         return d.dynTab.table.len() + staticTable.len()
194 }
195
196 func (d *Decoder) at(i uint64) (hf HeaderField, ok bool) {
197         // See Section 2.3.3.
198         if i == 0 {
199                 return
200         }
201         if i <= uint64(staticTable.len()) {
202                 return staticTable.ents[i-1], true
203         }
204         if i > uint64(d.maxTableIndex()) {
205                 return
206         }
207         // In the dynamic table, newer entries have lower indices.
208         // However, dt.ents[0] is the oldest entry. Hence, dt.ents is
209         // the reversed dynamic table.
210         dt := d.dynTab.table
211         return dt.ents[dt.len()-(int(i)-staticTable.len())], true
212 }
213
214 // Decode decodes an entire block.
215 //
216 // TODO: remove this method and make it incremental later? This is
217 // easier for debugging now.
218 func (d *Decoder) DecodeFull(p []byte) ([]HeaderField, error) {
219         var hf []HeaderField
220         saveFunc := d.emit
221         defer func() { d.emit = saveFunc }()
222         d.emit = func(f HeaderField) { hf = append(hf, f) }
223         if _, err := d.Write(p); err != nil {
224                 return nil, err
225         }
226         if err := d.Close(); err != nil {
227                 return nil, err
228         }
229         return hf, nil
230 }
231
232 // Close declares that the decoding is complete and resets the Decoder
233 // to be reused again for a new header block. If there is any remaining
234 // data in the decoder's buffer, Close returns an error.
235 func (d *Decoder) Close() error {
236         if d.saveBuf.Len() > 0 {
237                 d.saveBuf.Reset()
238                 return DecodingError{errors.New("truncated headers")}
239         }
240         d.firstField = true
241         return nil
242 }
243
244 func (d *Decoder) Write(p []byte) (n int, err error) {
245         if len(p) == 0 {
246                 // Prevent state machine CPU attacks (making us redo
247                 // work up to the point of finding out we don't have
248                 // enough data)
249                 return
250         }
251         // Only copy the data if we have to. Optimistically assume
252         // that p will contain a complete header block.
253         if d.saveBuf.Len() == 0 {
254                 d.buf = p
255         } else {
256                 d.saveBuf.Write(p)
257                 d.buf = d.saveBuf.Bytes()
258                 d.saveBuf.Reset()
259         }
260
261         for len(d.buf) > 0 {
262                 err = d.parseHeaderFieldRepr()
263                 if err == errNeedMore {
264                         // Extra paranoia, making sure saveBuf won't
265                         // get too large. All the varint and string
266                         // reading code earlier should already catch
267                         // overlong things and return ErrStringLength,
268                         // but keep this as a last resort.
269                         const varIntOverhead = 8 // conservative
270                         if d.maxStrLen != 0 && int64(len(d.buf)) > 2*(int64(d.maxStrLen)+varIntOverhead) {
271                                 return 0, ErrStringLength
272                         }
273                         d.saveBuf.Write(d.buf)
274                         return len(p), nil
275                 }
276                 d.firstField = false
277                 if err != nil {
278                         break
279                 }
280         }
281         return len(p), err
282 }
283
284 // errNeedMore is an internal sentinel error value that means the
285 // buffer is truncated and we need to read more data before we can
286 // continue parsing.
287 var errNeedMore = errors.New("need more data")
288
289 type indexType int
290
291 const (
292         indexedTrue indexType = iota
293         indexedFalse
294         indexedNever
295 )
296
297 func (v indexType) indexed() bool   { return v == indexedTrue }
298 func (v indexType) sensitive() bool { return v == indexedNever }
299
300 // returns errNeedMore if there isn't enough data available.
301 // any other error is fatal.
302 // consumes d.buf iff it returns nil.
303 // precondition: must be called with len(d.buf) > 0
304 func (d *Decoder) parseHeaderFieldRepr() error {
305         b := d.buf[0]
306         switch {
307         case b&128 != 0:
308                 // Indexed representation.
309                 // High bit set?
310                 // http://http2.github.io/http2-spec/compression.html#rfc.section.6.1
311                 return d.parseFieldIndexed()
312         case b&192 == 64:
313                 // 6.2.1 Literal Header Field with Incremental Indexing
314                 // 0b10xxxxxx: top two bits are 10
315                 // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.1
316                 return d.parseFieldLiteral(6, indexedTrue)
317         case b&240 == 0:
318                 // 6.2.2 Literal Header Field without Indexing
319                 // 0b0000xxxx: top four bits are 0000
320                 // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.2
321                 return d.parseFieldLiteral(4, indexedFalse)
322         case b&240 == 16:
323                 // 6.2.3 Literal Header Field never Indexed
324                 // 0b0001xxxx: top four bits are 0001
325                 // http://http2.github.io/http2-spec/compression.html#rfc.section.6.2.3
326                 return d.parseFieldLiteral(4, indexedNever)
327         case b&224 == 32:
328                 // 6.3 Dynamic Table Size Update
329                 // Top three bits are '001'.
330                 // http://http2.github.io/http2-spec/compression.html#rfc.section.6.3
331                 return d.parseDynamicTableSizeUpdate()
332         }
333
334         return DecodingError{errors.New("invalid encoding")}
335 }
336
337 // (same invariants and behavior as parseHeaderFieldRepr)
338 func (d *Decoder) parseFieldIndexed() error {
339         buf := d.buf
340         idx, buf, err := readVarInt(7, buf)
341         if err != nil {
342                 return err
343         }
344         hf, ok := d.at(idx)
345         if !ok {
346                 return DecodingError{InvalidIndexError(idx)}
347         }
348         d.buf = buf
349         return d.callEmit(HeaderField{Name: hf.Name, Value: hf.Value})
350 }
351
352 // (same invariants and behavior as parseHeaderFieldRepr)
353 func (d *Decoder) parseFieldLiteral(n uint8, it indexType) error {
354         buf := d.buf
355         nameIdx, buf, err := readVarInt(n, buf)
356         if err != nil {
357                 return err
358         }
359
360         var hf HeaderField
361         wantStr := d.emitEnabled || it.indexed()
362         if nameIdx > 0 {
363                 ihf, ok := d.at(nameIdx)
364                 if !ok {
365                         return DecodingError{InvalidIndexError(nameIdx)}
366                 }
367                 hf.Name = ihf.Name
368         } else {
369                 hf.Name, buf, err = d.readString(buf, wantStr)
370                 if err != nil {
371                         return err
372                 }
373         }
374         hf.Value, buf, err = d.readString(buf, wantStr)
375         if err != nil {
376                 return err
377         }
378         d.buf = buf
379         if it.indexed() {
380                 d.dynTab.add(hf)
381         }
382         hf.Sensitive = it.sensitive()
383         return d.callEmit(hf)
384 }
385
386 func (d *Decoder) callEmit(hf HeaderField) error {
387         if d.maxStrLen != 0 {
388                 if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen {
389                         return ErrStringLength
390                 }
391         }
392         if d.emitEnabled {
393                 d.emit(hf)
394         }
395         return nil
396 }
397
398 // (same invariants and behavior as parseHeaderFieldRepr)
399 func (d *Decoder) parseDynamicTableSizeUpdate() error {
400         // RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
401         // beginning of the first header block following the change to the dynamic table size.
402         if !d.firstField && d.dynTab.size > 0 {
403                 return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
404         }
405
406         buf := d.buf
407         size, buf, err := readVarInt(5, buf)
408         if err != nil {
409                 return err
410         }
411         if size > uint64(d.dynTab.allowedMaxSize) {
412                 return DecodingError{errors.New("dynamic table size update too large")}
413         }
414         d.dynTab.setMaxSize(uint32(size))
415         d.buf = buf
416         return nil
417 }
418
419 var errVarintOverflow = DecodingError{errors.New("varint integer overflow")}
420
421 // readVarInt reads an unsigned variable length integer off the
422 // beginning of p. n is the parameter as described in
423 // http://http2.github.io/http2-spec/compression.html#rfc.section.5.1.
424 //
425 // n must always be between 1 and 8.
426 //
427 // The returned remain buffer is either a smaller suffix of p, or err != nil.
428 // The error is errNeedMore if p doesn't contain a complete integer.
429 func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) {
430         if n < 1 || n > 8 {
431                 panic("bad n")
432         }
433         if len(p) == 0 {
434                 return 0, p, errNeedMore
435         }
436         i = uint64(p[0])
437         if n < 8 {
438                 i &= (1 << uint64(n)) - 1
439         }
440         if i < (1<<uint64(n))-1 {
441                 return i, p[1:], nil
442         }
443
444         origP := p
445         p = p[1:]
446         var m uint64
447         for len(p) > 0 {
448                 b := p[0]
449                 p = p[1:]
450                 i += uint64(b&127) << m
451                 if b&128 == 0 {
452                         return i, p, nil
453                 }
454                 m += 7
455                 if m >= 63 { // TODO: proper overflow check. making this up.
456                         return 0, origP, errVarintOverflow
457                 }
458         }
459         return 0, origP, errNeedMore
460 }
461
462 // readString decodes an hpack string from p.
463 //
464 // wantStr is whether s will be used. If false, decompression and
465 // []byte->string garbage are skipped if s will be ignored
466 // anyway. This does mean that huffman decoding errors for non-indexed
467 // strings past the MAX_HEADER_LIST_SIZE are ignored, but the server
468 // is returning an error anyway, and because they're not indexed, the error
469 // won't affect the decoding state.
470 func (d *Decoder) readString(p []byte, wantStr bool) (s string, remain []byte, err error) {
471         if len(p) == 0 {
472                 return "", p, errNeedMore
473         }
474         isHuff := p[0]&128 != 0
475         strLen, p, err := readVarInt(7, p)
476         if err != nil {
477                 return "", p, err
478         }
479         if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) {
480                 return "", nil, ErrStringLength
481         }
482         if uint64(len(p)) < strLen {
483                 return "", p, errNeedMore
484         }
485         if !isHuff {
486                 if wantStr {
487                         s = string(p[:strLen])
488                 }
489                 return s, p[strLen:], nil
490         }
491
492         if wantStr {
493                 buf := bufPool.Get().(*bytes.Buffer)
494                 buf.Reset() // don't trust others
495                 defer bufPool.Put(buf)
496                 if err := huffmanDecode(buf, d.maxStrLen, p[:strLen]); err != nil {
497                         buf.Reset()
498                         return "", nil, err
499                 }
500                 s = buf.String()
501                 buf.Reset() // be nice to GC
502         }
503         return s, p[strLen:], nil
504 }