OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / net / http2 / hpack / tables.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
6
7 import (
8         "fmt"
9 )
10
11 // headerFieldTable implements a list of HeaderFields.
12 // This is used to implement the static and dynamic tables.
13 type headerFieldTable struct {
14         // For static tables, entries are never evicted.
15         //
16         // For dynamic tables, entries are evicted from ents[0] and added to the end.
17         // Each entry has a unique id that starts at one and increments for each
18         // entry that is added. This unique id is stable across evictions, meaning
19         // it can be used as a pointer to a specific entry. As in hpack, unique ids
20         // are 1-based. The unique id for ents[k] is k + evictCount + 1.
21         //
22         // Zero is not a valid unique id.
23         //
24         // evictCount should not overflow in any remotely practical situation. In
25         // practice, we will have one dynamic table per HTTP/2 connection. If we
26         // assume a very powerful server that handles 1M QPS per connection and each
27         // request adds (then evicts) 100 entries from the table, it would still take
28         // 2M years for evictCount to overflow.
29         ents       []HeaderField
30         evictCount uint64
31
32         // byName maps a HeaderField name to the unique id of the newest entry with
33         // the same name. See above for a definition of "unique id".
34         byName map[string]uint64
35
36         // byNameValue maps a HeaderField name/value pair to the unique id of the newest
37         // entry with the same name and value. See above for a definition of "unique id".
38         byNameValue map[pairNameValue]uint64
39 }
40
41 type pairNameValue struct {
42         name, value string
43 }
44
45 func (t *headerFieldTable) init() {
46         t.byName = make(map[string]uint64)
47         t.byNameValue = make(map[pairNameValue]uint64)
48 }
49
50 // len reports the number of entries in the table.
51 func (t *headerFieldTable) len() int {
52         return len(t.ents)
53 }
54
55 // addEntry adds a new entry.
56 func (t *headerFieldTable) addEntry(f HeaderField) {
57         id := uint64(t.len()) + t.evictCount + 1
58         t.byName[f.Name] = id
59         t.byNameValue[pairNameValue{f.Name, f.Value}] = id
60         t.ents = append(t.ents, f)
61 }
62
63 // evictOldest evicts the n oldest entries in the table.
64 func (t *headerFieldTable) evictOldest(n int) {
65         if n > t.len() {
66                 panic(fmt.Sprintf("evictOldest(%v) on table with %v entries", n, t.len()))
67         }
68         for k := 0; k < n; k++ {
69                 f := t.ents[k]
70                 id := t.evictCount + uint64(k) + 1
71                 if t.byName[f.Name] == id {
72                         delete(t.byName, f.Name)
73                 }
74                 if p := (pairNameValue{f.Name, f.Value}); t.byNameValue[p] == id {
75                         delete(t.byNameValue, p)
76                 }
77         }
78         copy(t.ents, t.ents[n:])
79         for k := t.len() - n; k < t.len(); k++ {
80                 t.ents[k] = HeaderField{} // so strings can be garbage collected
81         }
82         t.ents = t.ents[:t.len()-n]
83         if t.evictCount+uint64(n) < t.evictCount {
84                 panic("evictCount overflow")
85         }
86         t.evictCount += uint64(n)
87 }
88
89 // search finds f in the table. If there is no match, i is 0.
90 // If both name and value match, i is the matched index and nameValueMatch
91 // becomes true. If only name matches, i points to that index and
92 // nameValueMatch becomes false.
93 //
94 // The returned index is a 1-based HPACK index. For dynamic tables, HPACK says
95 // that index 1 should be the newest entry, but t.ents[0] is the oldest entry,
96 // meaning t.ents is reversed for dynamic tables. Hence, when t is a dynamic
97 // table, the return value i actually refers to the entry t.ents[t.len()-i].
98 //
99 // All tables are assumed to be a dynamic tables except for the global
100 // staticTable pointer.
101 //
102 // See Section 2.3.3.
103 func (t *headerFieldTable) search(f HeaderField) (i uint64, nameValueMatch bool) {
104         if !f.Sensitive {
105                 if id := t.byNameValue[pairNameValue{f.Name, f.Value}]; id != 0 {
106                         return t.idToIndex(id), true
107                 }
108         }
109         if id := t.byName[f.Name]; id != 0 {
110                 return t.idToIndex(id), false
111         }
112         return 0, false
113 }
114
115 // idToIndex converts a unique id to an HPACK index.
116 // See Section 2.3.3.
117 func (t *headerFieldTable) idToIndex(id uint64) uint64 {
118         if id <= t.evictCount {
119                 panic(fmt.Sprintf("id (%v) <= evictCount (%v)", id, t.evictCount))
120         }
121         k := id - t.evictCount - 1 // convert id to an index t.ents[k]
122         if t != staticTable {
123                 return uint64(t.len()) - k // dynamic table
124         }
125         return k + 1
126 }
127
128 // http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07#appendix-B
129 var staticTable = newStaticTable()
130 var staticTableEntries = [...]HeaderField{
131         {Name: ":authority"},
132         {Name: ":method", Value: "GET"},
133         {Name: ":method", Value: "POST"},
134         {Name: ":path", Value: "/"},
135         {Name: ":path", Value: "/index.html"},
136         {Name: ":scheme", Value: "http"},
137         {Name: ":scheme", Value: "https"},
138         {Name: ":status", Value: "200"},
139         {Name: ":status", Value: "204"},
140         {Name: ":status", Value: "206"},
141         {Name: ":status", Value: "304"},
142         {Name: ":status", Value: "400"},
143         {Name: ":status", Value: "404"},
144         {Name: ":status", Value: "500"},
145         {Name: "accept-charset"},
146         {Name: "accept-encoding", Value: "gzip, deflate"},
147         {Name: "accept-language"},
148         {Name: "accept-ranges"},
149         {Name: "accept"},
150         {Name: "access-control-allow-origin"},
151         {Name: "age"},
152         {Name: "allow"},
153         {Name: "authorization"},
154         {Name: "cache-control"},
155         {Name: "content-disposition"},
156         {Name: "content-encoding"},
157         {Name: "content-language"},
158         {Name: "content-length"},
159         {Name: "content-location"},
160         {Name: "content-range"},
161         {Name: "content-type"},
162         {Name: "cookie"},
163         {Name: "date"},
164         {Name: "etag"},
165         {Name: "expect"},
166         {Name: "expires"},
167         {Name: "from"},
168         {Name: "host"},
169         {Name: "if-match"},
170         {Name: "if-modified-since"},
171         {Name: "if-none-match"},
172         {Name: "if-range"},
173         {Name: "if-unmodified-since"},
174         {Name: "last-modified"},
175         {Name: "link"},
176         {Name: "location"},
177         {Name: "max-forwards"},
178         {Name: "proxy-authenticate"},
179         {Name: "proxy-authorization"},
180         {Name: "range"},
181         {Name: "referer"},
182         {Name: "refresh"},
183         {Name: "retry-after"},
184         {Name: "server"},
185         {Name: "set-cookie"},
186         {Name: "strict-transport-security"},
187         {Name: "transfer-encoding"},
188         {Name: "user-agent"},
189         {Name: "vary"},
190         {Name: "via"},
191         {Name: "www-authenticate"},
192 }
193
194 func newStaticTable() *headerFieldTable {
195         t := &headerFieldTable{}
196         t.init()
197         for _, e := range staticTableEntries[:] {
198                 t.addEntry(e)
199         }
200         return t
201 }
202
203 var huffmanCodes = [256]uint32{
204         0x1ff8,
205         0x7fffd8,
206         0xfffffe2,
207         0xfffffe3,
208         0xfffffe4,
209         0xfffffe5,
210         0xfffffe6,
211         0xfffffe7,
212         0xfffffe8,
213         0xffffea,
214         0x3ffffffc,
215         0xfffffe9,
216         0xfffffea,
217         0x3ffffffd,
218         0xfffffeb,
219         0xfffffec,
220         0xfffffed,
221         0xfffffee,
222         0xfffffef,
223         0xffffff0,
224         0xffffff1,
225         0xffffff2,
226         0x3ffffffe,
227         0xffffff3,
228         0xffffff4,
229         0xffffff5,
230         0xffffff6,
231         0xffffff7,
232         0xffffff8,
233         0xffffff9,
234         0xffffffa,
235         0xffffffb,
236         0x14,
237         0x3f8,
238         0x3f9,
239         0xffa,
240         0x1ff9,
241         0x15,
242         0xf8,
243         0x7fa,
244         0x3fa,
245         0x3fb,
246         0xf9,
247         0x7fb,
248         0xfa,
249         0x16,
250         0x17,
251         0x18,
252         0x0,
253         0x1,
254         0x2,
255         0x19,
256         0x1a,
257         0x1b,
258         0x1c,
259         0x1d,
260         0x1e,
261         0x1f,
262         0x5c,
263         0xfb,
264         0x7ffc,
265         0x20,
266         0xffb,
267         0x3fc,
268         0x1ffa,
269         0x21,
270         0x5d,
271         0x5e,
272         0x5f,
273         0x60,
274         0x61,
275         0x62,
276         0x63,
277         0x64,
278         0x65,
279         0x66,
280         0x67,
281         0x68,
282         0x69,
283         0x6a,
284         0x6b,
285         0x6c,
286         0x6d,
287         0x6e,
288         0x6f,
289         0x70,
290         0x71,
291         0x72,
292         0xfc,
293         0x73,
294         0xfd,
295         0x1ffb,
296         0x7fff0,
297         0x1ffc,
298         0x3ffc,
299         0x22,
300         0x7ffd,
301         0x3,
302         0x23,
303         0x4,
304         0x24,
305         0x5,
306         0x25,
307         0x26,
308         0x27,
309         0x6,
310         0x74,
311         0x75,
312         0x28,
313         0x29,
314         0x2a,
315         0x7,
316         0x2b,
317         0x76,
318         0x2c,
319         0x8,
320         0x9,
321         0x2d,
322         0x77,
323         0x78,
324         0x79,
325         0x7a,
326         0x7b,
327         0x7ffe,
328         0x7fc,
329         0x3ffd,
330         0x1ffd,
331         0xffffffc,
332         0xfffe6,
333         0x3fffd2,
334         0xfffe7,
335         0xfffe8,
336         0x3fffd3,
337         0x3fffd4,
338         0x3fffd5,
339         0x7fffd9,
340         0x3fffd6,
341         0x7fffda,
342         0x7fffdb,
343         0x7fffdc,
344         0x7fffdd,
345         0x7fffde,
346         0xffffeb,
347         0x7fffdf,
348         0xffffec,
349         0xffffed,
350         0x3fffd7,
351         0x7fffe0,
352         0xffffee,
353         0x7fffe1,
354         0x7fffe2,
355         0x7fffe3,
356         0x7fffe4,
357         0x1fffdc,
358         0x3fffd8,
359         0x7fffe5,
360         0x3fffd9,
361         0x7fffe6,
362         0x7fffe7,
363         0xffffef,
364         0x3fffda,
365         0x1fffdd,
366         0xfffe9,
367         0x3fffdb,
368         0x3fffdc,
369         0x7fffe8,
370         0x7fffe9,
371         0x1fffde,
372         0x7fffea,
373         0x3fffdd,
374         0x3fffde,
375         0xfffff0,
376         0x1fffdf,
377         0x3fffdf,
378         0x7fffeb,
379         0x7fffec,
380         0x1fffe0,
381         0x1fffe1,
382         0x3fffe0,
383         0x1fffe2,
384         0x7fffed,
385         0x3fffe1,
386         0x7fffee,
387         0x7fffef,
388         0xfffea,
389         0x3fffe2,
390         0x3fffe3,
391         0x3fffe4,
392         0x7ffff0,
393         0x3fffe5,
394         0x3fffe6,
395         0x7ffff1,
396         0x3ffffe0,
397         0x3ffffe1,
398         0xfffeb,
399         0x7fff1,
400         0x3fffe7,
401         0x7ffff2,
402         0x3fffe8,
403         0x1ffffec,
404         0x3ffffe2,
405         0x3ffffe3,
406         0x3ffffe4,
407         0x7ffffde,
408         0x7ffffdf,
409         0x3ffffe5,
410         0xfffff1,
411         0x1ffffed,
412         0x7fff2,
413         0x1fffe3,
414         0x3ffffe6,
415         0x7ffffe0,
416         0x7ffffe1,
417         0x3ffffe7,
418         0x7ffffe2,
419         0xfffff2,
420         0x1fffe4,
421         0x1fffe5,
422         0x3ffffe8,
423         0x3ffffe9,
424         0xffffffd,
425         0x7ffffe3,
426         0x7ffffe4,
427         0x7ffffe5,
428         0xfffec,
429         0xfffff3,
430         0xfffed,
431         0x1fffe6,
432         0x3fffe9,
433         0x1fffe7,
434         0x1fffe8,
435         0x7ffff3,
436         0x3fffea,
437         0x3fffeb,
438         0x1ffffee,
439         0x1ffffef,
440         0xfffff4,
441         0xfffff5,
442         0x3ffffea,
443         0x7ffff4,
444         0x3ffffeb,
445         0x7ffffe6,
446         0x3ffffec,
447         0x3ffffed,
448         0x7ffffe7,
449         0x7ffffe8,
450         0x7ffffe9,
451         0x7ffffea,
452         0x7ffffeb,
453         0xffffffe,
454         0x7ffffec,
455         0x7ffffed,
456         0x7ffffee,
457         0x7ffffef,
458         0x7fffff0,
459         0x3ffffee,
460 }
461
462 var huffmanCodeLen = [256]uint8{
463         13, 23, 28, 28, 28, 28, 28, 28, 28, 24, 30, 28, 28, 30, 28, 28,
464         28, 28, 28, 28, 28, 28, 30, 28, 28, 28, 28, 28, 28, 28, 28, 28,
465         6, 10, 10, 12, 13, 6, 8, 11, 10, 10, 8, 11, 8, 6, 6, 6,
466         5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 8, 15, 6, 12, 10,
467         13, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
468         7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 13, 19, 13, 14, 6,
469         15, 5, 6, 5, 6, 5, 6, 6, 6, 5, 7, 7, 6, 6, 6, 5,
470         6, 7, 6, 5, 5, 6, 7, 7, 7, 7, 7, 15, 11, 14, 13, 28,
471         20, 22, 20, 20, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 24, 23,
472         24, 24, 22, 23, 24, 23, 23, 23, 23, 21, 22, 23, 22, 23, 23, 24,
473         22, 21, 20, 22, 22, 23, 23, 21, 23, 22, 22, 24, 21, 22, 23, 23,
474         21, 21, 22, 21, 23, 22, 23, 23, 20, 22, 22, 22, 23, 22, 22, 23,
475         26, 26, 20, 19, 22, 23, 22, 25, 26, 26, 26, 27, 27, 26, 24, 25,
476         19, 21, 26, 27, 27, 26, 27, 24, 21, 21, 26, 26, 28, 27, 27, 27,
477         20, 24, 20, 21, 22, 21, 21, 23, 22, 22, 25, 25, 24, 24, 26, 23,
478         26, 27, 26, 26, 27, 27, 27, 27, 27, 28, 27, 27, 27, 27, 27, 26,
479 }