{"library":"qh3","title":"qh3: QUIC and HTTP/3","description":"qh3 is a lightweight and fast Python library providing a QUIC and HTTP/3 implementation. It is a actively maintained fork of `aioquic`, designed to be embedded into other Python client and server libraries. It focuses on client-side functionality, features a minimal TLS 1.3 implementation, and does not rely on external C/OpenSSL dependencies, instead using a Rust-based cryptography backend. The library maintains a regular release cadence with updates often several times a month.","language":"python","status":"active","last_verified":"Thu May 21","install":{"commands":["pip install qh3"],"cli":null},"imports":["from qh3.quic.configuration import QuicConfiguration","from qh3.asyncio.client import connect","from qh3.h3.connection import H3Connection","from qh3.h3.events import H3Event"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import asyncio\nimport ssl\nfrom qh3.quic.configuration import QuicConfiguration\nfrom qh3.asyncio.client import connect\nfrom qh3.h3.connection import H3Connection\nfrom qh3.h3.events import DataReceived, HeadersReceived\n\n\nasync def fetch_http3_url(url: str):\n    # Create a QUIC configuration\n    configuration = QuicConfiguration(\n        is_client=True,\n        alpn_protocols=[\"h3-29\"],\n        max_datagram_frame_size=65536,\n        # Set up a basic TLS context. For production, use proper certificate validation.\n        # In this example, we disable it for simplicity, NOT recommended for production.\n        verify_mode=ssl.CERT_NONE, \n        # You can add root CAs if needed: ciphers=[...], root_cert=b\"...\"\n    )\n\n    print(f\"Connecting to {url}...\")\n    async with connect(url, configuration=configuration) as client:\n        print(f\"Connected to {url}. Client: {client}\")\n        h3_connection = H3Connection(client.quic.configuration)\n\n        # Send a GET request\n        stream_id = client.quic.get_next_available_stream_id()\n        headers = [\n            (b\":method\", b\"GET\"),\n            (b\":scheme\", b\"https\"),\n            (b\":authority\", client.host.encode()),\n            (b\":path\", b\"/\"),\n            (b\"user-agent\", b\"qh3-client\"),\n        ]\n        h3_connection.send_headers(stream_id, headers)\n\n        await client.transmit()\n\n        # Receive response\n        data = b''\n        while True:\n            events = h3_connection.handle_quic_events(client.quic.receive())\n            for event in events:\n                if isinstance(event, HeadersReceived):\n                    print(\"Received headers:\")\n                    for k, v in event.headers:\n                        print(f\"  {k.decode()}: {v.decode()}\")\n                elif isinstance(event, DataReceived):\n                    data += event.data\n            if client.quic.is_idle: # Check if the QUIC connection is idle (all data received/sent)\n                break\n            await asyncio.sleep(0.01) # Yield to event loop\n            \n        print(\"\\n--- Response Body ---\")\n        print(data.decode(errors='ignore')) # Ignore decoding errors for simplicity\n\n# Example Usage:\n# You need a running HTTP/3 server to test this.\n# For local testing, you might use `mkcert` to generate a trusted cert for 'localhost'\n# and run a server like `aioquic/examples/http3_server.py` adapted for qh3.\n# This example targets a public HTTP/3 enabled endpoint for demonstration, \n# but actual connectivity depends on network and server configuration.\n\n# Replace with a known HTTP/3 server if available\n# Note: Public HTTP/3 test servers are not always stable or available.\n# For best results, run a local qh3/aioquic compatible server.\n# Example for aioquic server: `python -m aioquic.examples.http3_server --host 127.0.0.1 --port 4433 cert.pem key.pem`\n# and then use url = \"https://127.0.0.1:4433/\"\n\n# A real-world example would involve a public URL known to support HTTP/3.\n# For this example, we'll try a common one, but it might require a local setup.\n\nurl = os.environ.get('QH3_TEST_URL', 'https://quic.tech:8443/')\n\nasync def main():\n    await fetch_http3_url(url)\n\nif __name__ == '__main__':\n    import os\n    import logging\n    # Set basic logging for better visibility\n    logging.basicConfig(level=logging.INFO)\n    asyncio.run(main())\n","lang":"python","description":"This quickstart demonstrates how to establish an HTTP/3 client connection, send a GET request, and receive the response body. It leverages `asyncio` for asynchronous operations. Users should configure `QuicConfiguration` for certificate validation appropriate for their environment.","tag":null,"tag_description":null,"last_tested":"2026-04-25","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-21","installed_version":"1.8.1","pypi_latest":"1.8.1","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.9,"avg_import_s":0.36,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.19,"mem_mb":6.2,"disk_size":"25.0M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.23,"mem_mb":6.1,"disk_size":"24.8M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.9,"import_time_s":0.13,"mem_mb":6.2,"disk_size":"25M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":6.1,"disk_size":"25M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.33,"mem_mb":7.3,"disk_size":"27.1M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.42,"mem_mb":7.2,"disk_size":"26.8M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.29,"mem_mb":7.3,"disk_size":"27M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.3,"mem_mb":7.2,"disk_size":"27M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.52,"mem_mb":8.2,"disk_size":"18.9M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.7,"mem_mb":8.2,"disk_size":"18.7M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.47,"mem_mb":8.2,"disk_size":"19M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.53,"mem_mb":8.2,"disk_size":"19M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.51,"mem_mb":8.7,"disk_size":"18.7M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.73,"mem_mb":8.7,"disk_size":"18.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.7,"import_time_s":0.47,"mem_mb":8.7,"disk_size":"19M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.52,"mem_mb":8.7,"disk_size":"18M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.18,"mem_mb":6.1,"disk_size":"24.5M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.22,"mem_mb":6.2,"disk_size":"24.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.2,"import_time_s":0.15,"mem_mb":6.1,"disk_size":"24M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"qh3","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.2,"mem_mb":6,"disk_size":"24M"}]}}