cubefs

Форк
0
523 строки · 14.7 Кб
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
}
524

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.