quadkit-http
Outbound HTTP client for the Quadkit Framework.
Overview
Async outbound HTTP client for the Quadkit Framework. Provides a first-class
async HTTP client backed by aiohttp, with connection pooling, typed request/
response contexts, interceptor chains, base URL clients, streaming support, and
DI integration.
This package focuses on making outbound HTTP requests — for inbound web servers,
use quadkit-web. Resilience patterns (retry, circuit breaker) are layered in
through the optional provider, not built in by default.
Full documentation: docs.quadkit.dev
Install
uv add quadkit-http
Quick Start
from quadkit import Application
from quadkit.di.module import Module, module
from quadkit.http import HTTPModule, HTTPClientConfig
@module(imports=[HTTPModule.configure(HTTPClientConfig())])
class AppModule(Module):
pass
async def main():
async with Application.boot(modules=[AppModule]) as app:
from quadkit.http import HTTPClient
async with HTTPClient.session_context() as client:
response = await client.get("https://api.example.com/users/123")
if response.ok:
user = await response.json()
print(user)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
Configuration
Zero-config usage: Call
HTTPModule.configure()with no arguments to use defaults.
Option 1 — YAML file
# application.yaml
http:
pool:
max_connections: 100
max_keepalive_connections: 50
timeout: 30.0
trust_env: true
cookie_jar: true
Option 2 — Profiles + Environment Variables (recommended)
export QK_HTTP__POOL__MAX_CONNECTIONS=100
export QK_HTTP__POOL__TIMEOUT=30.0
export QK_HTTP__TRUST_ENV=true
Option 3 — Python
from quadkit.http import HTTPModule, HTTPClientConfig, ConnectionPoolConfig
HTTPModule.configure(
HTTPClientConfig(
pool=ConnectionPoolConfig(
max_connections=100,
timeout=30.0,
),
trust_env=True,
cookie_jar=True,
)
)
Config reference
| Field | Default | Env var | Description |
|---|---|---|---|
pool.max_connections |
10 |
QK_HTTP__POOL__MAX_CONNECTIONS |
Total concurrent connections across all hosts |
pool.max_keepalive_connections |
5 |
QK_HTTP__POOL__MAX_KEEPALIVE_CONNECTIONS |
Keep-alive connections per host |
pool.max_connections_per_host |
10 |
QK_HTTP__POOL__MAX_CONNECTIONS_PER_HOST |
Max connections per individual host |
pool.timeout |
30.0 |
QK_HTTP__POOL__TIMEOUT |
Request timeout (seconds) |
pool.ttl_dns_cache |
300 |
QK_HTTP__POOL__TTL_DNS_CACHE |
DNS cache TTL (seconds) |
proxy |
null |
QK_HTTP__PROXY |
HTTP/HTTPS proxy URL |
trust_env |
True |
QK_HTTP__TRUST_ENV |
Read proxy settings from environment variables |
cookie_jar |
True |
QK_HTTP__COOKIE_JAR |
Enable in-memory cookie jar |
Module Factory Methods
| Method | Description |
|---|---|
HTTPModule.configure(...) |
Configure with explicit HTTPClientConfig |
HTTPModule.stub() |
No-op HTTPModule for unit testing |
Key Features
- Connection pooling — per-host limits, keepalive, DNS caching via aiohttp
- Proxy support — HTTP/HTTPS with environment variable auto-detection
- Cookie jar — optional, per-session in-memory cookie persistence
- Streaming —
StreamContextfor large file downloads - Interceptor chains — composable auth, logging, metrics hooks
- Type-safe contexts —
RequestContextandResponseContexttyped models
Testing
from quadkit.contracts.web import HTTPClientProtocol, HttpResponse
class FakeHTTPClient(HTTPClientProtocol):
async def get(self, url: str, **kwargs) -> HttpResponse:
return HttpResponse(status=200, headers={}, body=b'{"id": 123}')
# Inject into service under test
service = UserService(http_client=FakeHTTPClient())
Key Source Files
| File | What it contains |
|---|---|
src/quadkit/http/module.py |
HTTPModule with factory methods |
src/quadkit/http/config.py |
HTTPClientConfig and ConnectionPoolConfig |
src/quadkit/http/di/provider.py |
HTTPProvider — wires HTTP client into DI container |
src/quadkit/http/client/ |
HTTPClient and BaseURLHTTPClient |
src/quadkit/http/pool/ |
ConnectionPool (aiohttp connector abstraction) |
src/quadkit/http/types.py |
RequestContext and ResponseContext typed models |
Metadata
Release files for quadkit-http 0.0.45
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| quadkit_http-0.0.45.tar.gz | 68.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| quadkit_http-0.0.45-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 120.2 kB
Release files / quadkit_http-0.0.45.tar.gz
| Download URL | quadkit_http-0.0.45.tar.gz |
|---|---|
| Size | 68.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f79cf8a63eed1e7ad3e87d98f89d33def6579647ad591b26bba1c78445e21a54
|
|
BLAKE2b-256 checksum How to use checksums |
5fc76525924c360dd2fb035d30df23c32d9bfcc806d4983e217d09aedf27f2da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / quadkit_http-0.0.45-py3-none-any.whl
| Download URL | quadkit_http-0.0.45-py3-none-any.whl |
|---|---|
| Size | 51.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
87db9809a84d6dc7f234944dfc045402dd30839ba34bd8d6a97fd510a2855452
|
|
BLAKE2b-256 checksum How to use checksums |
91c7d71848ec650db97b770a6d069849ca2b23518225fbf8a0e9086a3e9cc54b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for quadkit-http 0.0.45
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.