HTTP Types in Python
Python (3.6 or later) library to read and write records of HTTP exchanges in the HTTP types format.
Installation
pip install http-types
Writing HTTP exchanges
Using HttpExchangeWriter
a recording of HTTP traffic can be serialised for use with any program that can handle the HTTP Types format:
request = RequestBuilder.from_dict({
"host": "api.github.com",
"protocol": "https",
"method": "get",
"pathname": "/v1/users",
"query": {"a": "b", "q": ["1", "2"]},
}
)
response = ResponseBuilder.from_dict({
"statusCode": 200,
"headers": {"content-type": "text/plain"},
"body": "(response body string)",
}
)
exchange = HttpExchange(request=request, response=response)
with tempfile.TemporaryFile(mode="w") as output:
writer = HttpExchangeWriter(output)
writer.write(exchange)
# Serialize to dictionary
as_dict = HttpExchangeWriter.to_dict(exchange)
# Serialize to JSON string
as_str = HttpExchangeWriter.to_json(exchange)
Reading HTTP exchanges
With HttpExchangeReader
recordings in the HTTP Types format can be read for processing:
for exchange in HttpExchangeReader.from_jsonl(input_file):
assert exchange.request.method == HttpMethod.GET
assert exchange.request.protocol == Protocol.HTTPS
assert exchange.response.statusCode == 200
Development
Initial setup:
- Create a new virtual environment.
- Install dependencies:
pip install --upgrade -e '.[dev]'
To test, run python setup.py test
, which will:
- Enforce code formatting using black.
- Test with
pytest
, configured in pytest.ini. - Type check with
mypy
. - Enforce style guide with flake8, configured in .flake8.
Publishing
- Bump the version in setup.py if the version is the same as in the published package. Commit and push.
- Run
python setup.py test
andpython setup.py dist
to check that everything works. - To build and upload the package, run
python setup.py upload
. Insert PyPI credentials to upload the package toPyPI
. The command will also rungit tag
to tag the commit as a release and push the tags to remote.
To see what the different commands do, see Command
classes in setup.py.