16 """Read from stdin a set of colon separated http headers:
18 content-type: application/grpc
19 Write a set of strings containing a hpack encoded http2 frame that
20 represents said headers."""
28 payload_line.append(0x10)
29 assert (
len(key) <= 126)
30 payload_line.append(
len(key))
31 payload_line.extend(
ord(c)
for c
in key)
32 assert (
len(value) <= 126)
33 payload_line.append(
len(value))
34 payload_line.extend(
ord(c)
for c
in value)
38 payload_line.append(0x40)
39 assert (
len(key) <= 126)
40 payload_line.append(
len(key))
41 payload_line.extend(
ord(c)
for c
in key)
42 assert (
len(value) <= 126)
43 payload_line.append(
len(value))
44 payload_line.extend(
ord(c)
for c
in value)
48 payload_line.append(0x80 + 61 + count - n)
52 'never': append_never_indexed,
53 'inc': append_inc_indexed,
54 'pre': append_pre_indexed,
57 argp = argparse.ArgumentParser(
'Generate header frames')
58 argp.add_argument(
'--set_end_stream',
62 argp.add_argument(
'--no_framing',
66 argp.add_argument(
'--compression',
67 choices=sorted(_COMPRESSORS.keys()),
69 argp.add_argument(
'--hex', default=
False, action=
'store_const', const=
True)
70 args = argp.parse_args()
74 for line
in sys.stdin:
80 key_tail, value = line[1:].
split(
':')
81 key = (line[0] + key_tail).strip()
83 vals.append((key, value))
87 if not args.no_framing:
88 payload_bytes.append([])
91 for key, value
in vals:
93 _COMPRESSORS[args.compression](payload_line, n,
len(vals), key, value)
95 payload_len +=
len(payload_line)
96 payload_bytes.append(payload_line)
99 if not args.no_framing:
101 if args.set_end_stream:
103 payload_bytes[0].extend([
104 (payload_len >> 16) & 0xff,
105 (payload_len >> 8) & 0xff,
106 (payload_len) & 0xff,
118 hex_bytes = [
ord(c)
for c
in "abcdefABCDEF0123456789"]
126 if c
in hex_bytes
and last_was_hex:
142 for line
in payload_bytes:
143 all_bytes.extend(line)
144 print((
'{%s}' %
', '.join(
'0x%02x' % c
for c
in all_bytes)))
146 for line
in payload_bytes: