Skip to main content

HTTP/2 implementation with hyper-h2 on Python 3 asyncio.

Project description

aioh2

Documentation Status

HTTP/2 implementation with hyper-h2 on Python 3 asyncio.

Features

  • Asynchronous HTTP/2 client and server
  • Multiplexing streams of data with managed flow and priority control
  • Optional tickless health check
  • More to come

Non-features:

  • Request/Response wrappers
  • Web server, dispatcher, cookie, etc
  • HTTP/2 upgrade

Example

A server saying hello:

# Server request handler
async def on_connected(proto):
    try:
        while True:
            # Receive a request from queue
            stream_id, headers = await proto.recv_request()

            # Send response headers
            await proto.start_response(stream_id, {':status': '200'})

            # Response body starts with "hello"
            await proto.send_data(stream_id, b'hello, ')

            # Read all request body as a name from client side
            name = await proto.read_stream(stream_id, -1)

            # Amend response body with the name
            await proto.send_data(stream_id, name)

            # Send trailers with the length of the name
            await proto.send_trailers(stream_id, {'len': str(len(name))})
    except asyncio.CancelledError:
        # do cleanup here
        pass

# Start server on random port, with maximum concurrent requests of 3
server = await aioh2.start_server(on_connected, port=0, concurrency=3)
port = server.sockets[0].getsockname()[1]

And a client to try out:

# Open client connection
client = await aioh2.open_connection('0.0.0.0', port,
                                     functional_timeout=0.1)

# Optionally wait for an ack of tickless ping - a.k.a. until functional
await asyncio.sleep(0.1)  # simulate client being busy with something else
rtt = await client.wait_functional()
if rtt:
    print('Round-trip time: %.1fms' % (rtt * 1000))

# Start request with headers
stream_id = await client.start_request(
    {':method': 'GET', ':path': '/index.html'})

# Send my name "world" as whole request body
await client.send_data(stream_id, b'world', end_stream=True)

# Receive response headers
headers = await client.recv_response(stream_id)
print('Response headers:', headers)

# Read all response body
resp = await client.read_stream(stream_id, -1)
print('Response body:', resp)

# Read response trailers
trailers = await client.recv_trailers(stream_id)
print('Response trailers:', trailers)

client.close_connection()
await asyncio.sleep(.1)

Above example can be found at examples/core.py.

Credits

A big thanks to the great library hyper-h2 from Cory Benfield.

DecentFoX Studio is a software outsourcing company delivering high-quality web-based products and mobile apps for global customers with agile methodology, focusing on bleeding-edge technologies and fast-developing scalable architectures.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

History

0.2.1 (2017-12-03)

  • Updated to h2 3.0 (Contributed by Arthur Darcet and Peter Wu)
  • Dropped support for Python 3.3

0.1.0 (2016-2-6)

  • First release on PyPI.

Project details


Release history Release notifications

This version
History Node

0.2.2

History Node

0.2.1

History Node

0.1.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
aioh2-0.2.2.tar.gz (24.6 kB) Copy SHA256 hash SHA256 Source None Feb 5, 2018

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page