mirror of
https://gitee.com/openharmony/third_party_nghttp2
synced 2024-11-27 01:50:28 +00:00
c10a55588b
This commit implements RFC 9218 extensible prioritization scheme. It is enabled when a local endpoint submits SETTINGS_NO_RFC7540_PRIORITIES = 1. This commit only handles priority signal in HTTP request header field. Priority header field in PUSH_PROMISE is not supported. HTTP messaging must be enabled to take advantage of this prioritization scheme because HTTP fields are not parsed if HTTP messaging is disabled.
144 lines
3.2 KiB
Python
Executable File
144 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
HEADERS = [
|
|
(':authority', 0),
|
|
(':method', 1),
|
|
(':method', 2),
|
|
(':path', 3),
|
|
(':path', 4),
|
|
(':scheme', 5),
|
|
(':scheme', 6),
|
|
(':status', 7),
|
|
(':status', 8),
|
|
(':status', 9),
|
|
(':status', 10),
|
|
(':status', 11),
|
|
(':status', 12),
|
|
(':status', 13),
|
|
('accept-charset', 14),
|
|
('accept-encoding', 15),
|
|
('accept-language', 16),
|
|
('accept-ranges', 17),
|
|
('accept', 18),
|
|
('access-control-allow-origin', 19),
|
|
('age', 20),
|
|
('allow', 21),
|
|
('authorization', 22),
|
|
('cache-control', 23),
|
|
('content-disposition', 24),
|
|
('content-encoding', 25),
|
|
('content-language', 26),
|
|
('content-length', 27),
|
|
('content-location', 28),
|
|
('content-range', 29),
|
|
('content-type', 30),
|
|
('cookie', 31),
|
|
('date', 32),
|
|
('etag', 33),
|
|
('expect', 34),
|
|
('expires', 35),
|
|
('from', 36),
|
|
('host', 37),
|
|
('if-match', 38),
|
|
('if-modified-since', 39),
|
|
('if-none-match', 40),
|
|
('if-range', 41),
|
|
('if-unmodified-since', 42),
|
|
('last-modified', 43),
|
|
('link', 44),
|
|
('location', 45),
|
|
('max-forwards', 46),
|
|
('proxy-authenticate', 47),
|
|
('proxy-authorization', 48),
|
|
('range', 49),
|
|
('referer', 50),
|
|
('refresh', 51),
|
|
('retry-after', 52),
|
|
('server', 53),
|
|
('set-cookie', 54),
|
|
('strict-transport-security', 55),
|
|
('transfer-encoding', 56),
|
|
('user-agent', 57),
|
|
('vary', 58),
|
|
('via', 59),
|
|
('www-authenticate', 60),
|
|
('te', None),
|
|
('connection', None),
|
|
('keep-alive',None),
|
|
('proxy-connection', None),
|
|
('upgrade', None),
|
|
(':protocol', None),
|
|
('priority', None),
|
|
]
|
|
|
|
def to_enum_hd(k):
|
|
res = 'NGHTTP2_TOKEN_'
|
|
for c in k.upper():
|
|
if c == ':' or 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] = []
|
|
if k not in ent[c]:
|
|
ent[c].append(k)
|
|
|
|
return res
|
|
|
|
def gen_enum():
|
|
name = ''
|
|
print('typedef enum {')
|
|
for k, token in HEADERS:
|
|
if token is None:
|
|
print(' {},'.format(to_enum_hd(k)))
|
|
else:
|
|
if name != k:
|
|
name = k
|
|
print(' {} = {},'.format(to_enum_hd(k), token))
|
|
print('} nghttp2_token;')
|
|
|
|
def gen_index_header():
|
|
print('''\
|
|
static int32_t lookup_token(const uint8_t *name, size_t namelen) {
|
|
switch (namelen) {''')
|
|
b = build_header(HEADERS)
|
|
for size in sorted(b.keys()):
|
|
ents = b[size]
|
|
print('''\
|
|
case {}:'''.format(size))
|
|
print('''\
|
|
switch (name[{}]) {{'''.format(size - 1))
|
|
for c in sorted(ents.keys()):
|
|
headers = sorted(ents[c])
|
|
print('''\
|
|
case '{}':'''.format(c))
|
|
for k in headers:
|
|
print('''\
|
|
if (memeq("{}", name, {})) {{
|
|
return {};
|
|
}}'''.format(k[:-1], size - 1, to_enum_hd(k)))
|
|
print('''\
|
|
break;''')
|
|
print('''\
|
|
}
|
|
break;''')
|
|
print('''\
|
|
}
|
|
return -1;
|
|
}''')
|
|
|
|
if __name__ == '__main__':
|
|
gen_enum()
|
|
print()
|
|
gen_index_header()
|