third_party_nghttp2/genheaderfunc.py

89 lines
1.7 KiB
Python
Raw Normal View History

#!/usr/bin/env python
HEADERS = [
':authority',
':method',
':path',
':scheme',
# disallowed h1 headers
'connection',
'expect',
'host',
'if-modified-since',
'keep-alive',
'proxy-connection',
'te',
'transfer-encoding',
'upgrade'
]
def to_enum_hd(k):
res = 'HD_'
for c in k.upper():
if c == ':':
continue
if c == '-':
res += '_'
continue
res += c
return res
def build_header(headers):
res = {}
for k in headers:
size = len(k)
if size not in res:
res[size] = {}
ent = res[size]
c = k[-1]
if c not in ent:
ent[c] = []
ent[c].append(k)
return res
def gen_enum():
print '''\
enum {'''
for k in sorted(HEADERS):
print '''\
{},'''.format(to_enum_hd(k))
print '''\
HD_MAXIDX,
};'''
def gen_index_header():
print '''\
2015-01-03 12:56:59 +00:00
void index_header(int *hdidx, const uint8_t *name, size_t namelen, size_t idx) {
switch (namelen) {'''
b = build_header(HEADERS)
for size in sorted(b.keys()):
ents = b[size]
print '''\
case {}:'''.format(size)
print '''\
2015-01-03 12:56:59 +00:00
switch (util::lowcase(name[namelen - 1])) {'''
for c in sorted(ents.keys()):
headers = sorted(ents[c])
print '''\
case '{}':'''.format(c)
for k in headers:
print '''\
2015-01-03 12:56:59 +00:00
if (util::streq("{}", name, {})) {{
hdidx[{}] = idx;
return;
}}'''.format(k[:-1], size - 1, to_enum_hd(k))
print '''\
break;'''
print '''\
}
break;'''
print '''\
}
}'''
if __name__ == '__main__':
gen_enum()
print ''
gen_index_header()