89 lines
1.7 KiB
Python
89 lines
1.7 KiB
Python
|
#!/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 '''\
|
||
|
void index_header(int *hdidx, const uint8_t *s, size_t len, size_t idx) {
|
||
|
switch (len) {'''
|
||
|
b = build_header(HEADERS)
|
||
|
for size in sorted(b.keys()):
|
||
|
ents = b[size]
|
||
|
print '''\
|
||
|
case {}:'''.format(size)
|
||
|
print '''\
|
||
|
switch (util::lowcase(s[len - 1])) {'''
|
||
|
for c in sorted(ents.keys()):
|
||
|
headers = sorted(ents[c])
|
||
|
print '''\
|
||
|
case '{}':'''.format(c)
|
||
|
for k in headers:
|
||
|
print '''\
|
||
|
if (util::strieq("{}", s, {})) {{
|
||
|
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()
|