tizen 2.4 release
[external/nghttp2.git] / genheaderfunc.py
1 #!/usr/bin/env python
2
3 HEADERS = [
4     ':authority',
5     ':method',
6     ':path',
7     ':scheme',
8     ':status',
9     ':host', # for spdy
10     'expect',
11     'host',
12     'if-modified-since',
13     "te",
14     "cookie",
15     "http2-settings",
16     "server",
17     "via",
18     "x-forwarded-for",
19     "x-forwarded-proto",
20     "alt-svc",
21     "content-length",
22     "location",
23     "trailer",
24     "link",
25     "accept-encoding",
26     "accept-language",
27     "cache-control",
28     "user-agent",
29     # disallowed h1 headers
30     'connection',
31     'keep-alive',
32     'proxy-connection',
33     'transfer-encoding',
34     'upgrade'
35 ]
36
37 def to_enum_hd(k):
38     res = 'HD_'
39     for c in k.upper():
40         if c == ':' or c == '-':
41             res += '_'
42             continue
43         res += c
44     return res
45
46 def build_header(headers):
47     res = {}
48     for k in headers:
49         size = len(k)
50         if size not in res:
51             res[size] = {}
52         ent = res[size]
53         c = k[-1]
54         if c not in ent:
55             ent[c] = []
56         ent[c].append(k)
57
58     return res
59
60 def gen_enum():
61     print '''\
62 enum {'''
63     for k in sorted(HEADERS):
64         print '''\
65   {},'''.format(to_enum_hd(k))
66     print '''\
67   HD_MAXIDX,
68 };'''
69
70 def gen_index_header():
71     print '''\
72 int lookup_token(const uint8_t *name, size_t namelen) {
73   switch (namelen) {'''
74     b = build_header(HEADERS)
75     for size in sorted(b.keys()):
76         ents = b[size]
77         print '''\
78   case {}:'''.format(size)
79         print '''\
80     switch (name[namelen - 1]) {'''
81         for c in sorted(ents.keys()):
82             headers = sorted(ents[c])
83             print '''\
84     case '{}':'''.format(c)
85             for k in headers:
86                 print '''\
87       if (util::streq("{}", name, {})) {{
88         return {};
89       }}'''.format(k[:-1], size - 1, to_enum_hd(k))
90             print '''\
91       break;'''
92         print '''\
93     }
94     break;'''
95     print '''\
96   }
97   return -1;
98 }'''
99
100 if __name__ == '__main__':
101     gen_enum()
102     print ''
103     gen_index_header()