diff options
Diffstat (limited to '')
-rwxr-xr-x | genlibtokenlookup.py | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/genlibtokenlookup.py b/genlibtokenlookup.py new file mode 100755 index 0000000..cd6163f --- /dev/null +++ b/genlibtokenlookup.py @@ -0,0 +1,185 @@ +#!/usr/bin/env python + +HEADERS = [ + (':authority', 0), + (':path', 1), + ('age', 2), + ('content-disposition', 3), + ('content-length', 4), + ('cookie', 5), + ('date', 6), + ('etag', 7), + ('if-modified-since', 8), + ('if-none-match', 9), + ('last-modified', 10), + ('link', 11), + ('location', 12), + ('referer', 13), + ('set-cookie', 14), + (':method', 15), + (':method', 16), + (':method', 17), + (':method', 18), + (':method', 19), + (':method', 20), + (':method', 21), + (':scheme', 22), + (':scheme', 23), + (':status', 24), + (':status', 25), + (':status', 26), + (':status', 27), + (':status', 28), + ('accept', 29), + ('accept', 30), + ('accept-encoding', 31), + ('accept-ranges', 32), + ('access-control-allow-headers', 33), + ('access-control-allow-headers', 34), + ('access-control-allow-origin', 35), + ('cache-control', 36), + ('cache-control', 37), + ('cache-control', 38), + ('cache-control', 39), + ('cache-control', 40), + ('cache-control', 41), + ('content-encoding', 42), + ('content-encoding', 43), + ('content-type', 44), + ('content-type', 45), + ('content-type', 46), + ('content-type', 47), + ('content-type', 48), + ('content-type', 49), + ('content-type', 50), + ('content-type', 51), + ('content-type', 52), + ('content-type', 53), + ('content-type', 54), + ('range', 55), + ('strict-transport-security', 56), + ('strict-transport-security', 57), + ('strict-transport-security', 58), + ('vary', 59), + ('vary', 60), + ('x-content-type-options', 61), + ('x-xss-protection', 62), + (':status', 63), + (':status', 64), + (':status', 65), + (':status', 66), + (':status', 67), + (':status', 68), + (':status', 69), + (':status', 70), + (':status', 71), + ('accept-language', 72), + ('access-control-allow-credentials', 73), + ('access-control-allow-credentials', 74), + ('access-control-allow-headers', 75), + ('access-control-allow-methods', 76), + ('access-control-allow-methods', 77), + ('access-control-allow-methods', 78), + ('access-control-expose-headers', 79), + ('access-control-request-headers', 80), + ('access-control-request-method', 81), + ('access-control-request-method', 82), + ('alt-svc', 83), + ('authorization', 84), + ('content-security-policy', 85), + ('early-data', 86), + ('expect-ct', 87), + ('forwarded', 88), + ('if-range', 89), + ('origin', 90), + ('purpose', 91), + ('server', 92), + ('timing-allow-origin', 93), + ('upgrade-insecure-requests', 94), + ('user-agent', 95), + ('x-forwarded-for', 96), + ('x-frame-options', 97), + ('x-frame-options', 98), + # Additional header fields for HTTP messaging validation + ('host', None), + ('connection', None), + ('keep-alive', None), + ('proxy-connection', None), + ('transfer-encoding', None), + ('upgrade', None), + ('te', None), + (':protocol', None), + ('priority', None), +] + +def to_enum_hd(k): + res = 'NGHTTP3_QPACK_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 '} nghttp3_qpack_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__': + print '''/* Don't use nghttp3_qpack_token below. Use mkstatichdtbl.py instead */''' + gen_enum() + print '' + gen_index_header() |