gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

hpack.go (15056B)


      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 	// https://httpwg.org/specs/rfc7541.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 	// https://httpwg.org/specs/rfc7541.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 // DecodeFull 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 		// https://httpwg.org/specs/rfc7541.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 		// https://httpwg.org/specs/rfc7541.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 		// https://httpwg.org/specs/rfc7541.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 		// https://httpwg.org/specs/rfc7541.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 		// https://httpwg.org/specs/rfc7541.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 	var undecodedName undecodedString
    363 	if nameIdx > 0 {
    364 		ihf, ok := d.at(nameIdx)
    365 		if !ok {
    366 			return DecodingError{InvalidIndexError(nameIdx)}
    367 		}
    368 		hf.Name = ihf.Name
    369 	} else {
    370 		undecodedName, buf, err = d.readString(buf)
    371 		if err != nil {
    372 			return err
    373 		}
    374 	}
    375 	undecodedValue, buf, err := d.readString(buf)
    376 	if err != nil {
    377 		return err
    378 	}
    379 	if wantStr {
    380 		if nameIdx <= 0 {
    381 			hf.Name, err = d.decodeString(undecodedName)
    382 			if err != nil {
    383 				return err
    384 			}
    385 		}
    386 		hf.Value, err = d.decodeString(undecodedValue)
    387 		if err != nil {
    388 			return err
    389 		}
    390 	}
    391 	d.buf = buf
    392 	if it.indexed() {
    393 		d.dynTab.add(hf)
    394 	}
    395 	hf.Sensitive = it.sensitive()
    396 	return d.callEmit(hf)
    397 }
    398 
    399 func (d *Decoder) callEmit(hf HeaderField) error {
    400 	if d.maxStrLen != 0 {
    401 		if len(hf.Name) > d.maxStrLen || len(hf.Value) > d.maxStrLen {
    402 			return ErrStringLength
    403 		}
    404 	}
    405 	if d.emitEnabled {
    406 		d.emit(hf)
    407 	}
    408 	return nil
    409 }
    410 
    411 // (same invariants and behavior as parseHeaderFieldRepr)
    412 func (d *Decoder) parseDynamicTableSizeUpdate() error {
    413 	// RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
    414 	// beginning of the first header block following the change to the dynamic table size.
    415 	if !d.firstField && d.dynTab.size > 0 {
    416 		return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
    417 	}
    418 
    419 	buf := d.buf
    420 	size, buf, err := readVarInt(5, buf)
    421 	if err != nil {
    422 		return err
    423 	}
    424 	if size > uint64(d.dynTab.allowedMaxSize) {
    425 		return DecodingError{errors.New("dynamic table size update too large")}
    426 	}
    427 	d.dynTab.setMaxSize(uint32(size))
    428 	d.buf = buf
    429 	return nil
    430 }
    431 
    432 var errVarintOverflow = DecodingError{errors.New("varint integer overflow")}
    433 
    434 // readVarInt reads an unsigned variable length integer off the
    435 // beginning of p. n is the parameter as described in
    436 // https://httpwg.org/specs/rfc7541.html#rfc.section.5.1.
    437 //
    438 // n must always be between 1 and 8.
    439 //
    440 // The returned remain buffer is either a smaller suffix of p, or err != nil.
    441 // The error is errNeedMore if p doesn't contain a complete integer.
    442 func readVarInt(n byte, p []byte) (i uint64, remain []byte, err error) {
    443 	if n < 1 || n > 8 {
    444 		panic("bad n")
    445 	}
    446 	if len(p) == 0 {
    447 		return 0, p, errNeedMore
    448 	}
    449 	i = uint64(p[0])
    450 	if n < 8 {
    451 		i &= (1 << uint64(n)) - 1
    452 	}
    453 	if i < (1<<uint64(n))-1 {
    454 		return i, p[1:], nil
    455 	}
    456 
    457 	origP := p
    458 	p = p[1:]
    459 	var m uint64
    460 	for len(p) > 0 {
    461 		b := p[0]
    462 		p = p[1:]
    463 		i += uint64(b&127) << m
    464 		if b&128 == 0 {
    465 			return i, p, nil
    466 		}
    467 		m += 7
    468 		if m >= 63 { // TODO: proper overflow check. making this up.
    469 			return 0, origP, errVarintOverflow
    470 		}
    471 	}
    472 	return 0, origP, errNeedMore
    473 }
    474 
    475 // readString reads an hpack string from p.
    476 //
    477 // It returns a reference to the encoded string data to permit deferring decode costs
    478 // until after the caller verifies all data is present.
    479 func (d *Decoder) readString(p []byte) (u undecodedString, remain []byte, err error) {
    480 	if len(p) == 0 {
    481 		return u, p, errNeedMore
    482 	}
    483 	isHuff := p[0]&128 != 0
    484 	strLen, p, err := readVarInt(7, p)
    485 	if err != nil {
    486 		return u, p, err
    487 	}
    488 	if d.maxStrLen != 0 && strLen > uint64(d.maxStrLen) {
    489 		// Returning an error here means Huffman decoding errors
    490 		// for non-indexed strings past the maximum string length
    491 		// are ignored, but the server is returning an error anyway
    492 		// and because the string is not indexed the error will not
    493 		// affect the decoding state.
    494 		return u, nil, ErrStringLength
    495 	}
    496 	if uint64(len(p)) < strLen {
    497 		return u, p, errNeedMore
    498 	}
    499 	u.isHuff = isHuff
    500 	u.b = p[:strLen]
    501 	return u, p[strLen:], nil
    502 }
    503 
    504 type undecodedString struct {
    505 	isHuff bool
    506 	b      []byte
    507 }
    508 
    509 func (d *Decoder) decodeString(u undecodedString) (string, error) {
    510 	if !u.isHuff {
    511 		return string(u.b), nil
    512 	}
    513 	buf := bufPool.Get().(*bytes.Buffer)
    514 	buf.Reset() // don't trust others
    515 	var s string
    516 	err := huffmanDecode(buf, d.maxStrLen, u.b)
    517 	if err == nil {
    518 		s = buf.String()
    519 	}
    520 	buf.Reset() // be nice to GC
    521 	bufPool.Put(buf)
    522 	return s, err
    523 }