Source code

Revision control

Copy as Markdown

Other Tools

# -*- coding: utf-8 -*-
import json
import os
from binascii import hexlify
from invoke import task
from hyper.http20.hpack import Encoder
@task
def hpack():
"""
This task generates HPACK test data suitable for use with
The current format defines a JSON object with three keys: 'draft',
'description' and 'cases'.
The cases key has as its value a list of objects, with each object
representing a set of headers and the output from the encoder. The object
has the following keys:
- 'header_table_size': the size of the header table used.
- 'headers': A list of the headers as JSON objects.
- 'wire': The output from the encoder in hexadecimal.
"""
# A generator that contains the paths to all the raw data files and their
# names.
raw_story_files = (
(os.path.join('test/test_fixtures/raw-data', name), name)
for name in os.listdir('test/test_fixtures/raw-data')
)
# For each file, build our output.
for source, outname in raw_story_files:
with open(source, 'rb') as f:
indata = json.load(f)
# Prepare the output and the encoder.
output = {
'description': 'Encoded by hyper. See github.com/Lukasa/hyper for more information.',
'cases': []
}
e = Encoder()
for case in indata['cases']:
outcase = {
'header_table_size': e.header_table_size,
'headers': case['headers'],
}
headers = []
for header in case['headers']:
key = header.keys()[0]
header = (key, header[key])
headers.append(header)
outcase['wire'] = hexlify(e.encode(headers))
output['cases'].append(outcase)
with open(outname, 'wb') as f:
f.write(json.dumps(output, sort_keys=True,
indent=2, separators=(',', ': ')))