Skip to main content

An async HTTP client built on httpunk

Project description

punkreq

punkreq is an async HTTP client for Python, built on top of httpunk.

Note: punkreq is currently in alpha stage.

Note: punkreq was built with substantial help from LLMs, under human supervision.

In a nutshell

  • Async only, with multiple runtime backends: import the client from the module matching your runtime – punkreq.asyncio or punkreq.tonio
  • HTTP/1.1 and HTTP/2, negotiated via TLS ALPN by default; HTTP/2 prior knowledge with http1=False
  • Connection pooling with keep-alive (h1) and multiplexing (h2)
  • Transparent response decompression: gzip and deflate everywhere, zstd on Python 3.14+, brotli with the punkreq[brotli] extra
  • Conservative automatic retries — only requests the server provably never processed (HTTP/2 graceful GOAWAY, refused streams, keep-alive races)
  • Opt-in cookie jar, basic/bearer auth, multipart uploads
  • HTTP proxies: HTTP_PROXY/HTTPS_PROXY/NO_PROXY environment support, CONNECT tunneling for https destinations.
  • Zero runtime dependencies beyond httpunk

Installation

pip install punkreq

Quickstart

import asyncio
from punkreq.asyncio import Client

async def main():
    async with Client(base_url="https://api.example.com") as client:
        response = await client.post("/items", json={"name": "widget"})
        response.raise_for_status()
        print(await response.json())

asyncio.run(main())

One-off requests without managing a client:

from punkreq import asyncio as punkreq

response = await punkreq.get("https://www.example.com")
print(response.status_code, response.headers["content-type"])

Responses resolve as soon as the head arrives; the body is read on demand — await response.read() / text() / json(), or streamed:

async with Client() as client:
    response = await client.get("https://example.com/large.bin")
    async for chunk in response.iter_bytes(chunk_size=65536):
        ...

Reading to the end releases the connection automatically. When you might stop early, use the request as a context manager so the response is always closed:

async with client.get("https://example.com/huge.ndjson") as response:
    async for line in response.iter_lines():
        if found(line):
            break  # the block exit closes the response and frees the connection

Configuration

import punkreq
from punkreq.asyncio import Client

client = Client(
    base_url="https://api.example.com",
    headers={"x-api-key": "..."},
    auth=("user", "pass"),                       # or punkreq.BearerAuth("token")
    cookies={},                                  # enables the cookie jar (off by default)
    timeout=punkreq.Timeout(5.0, total=30.0),    # no timeouts by default
    limits=punkreq.Limits(max_connections=100),
    proxy="http://proxy.internal:3128",          # env vars honored by default
    verify=True,                                 # bool | CA bundle path | ssl.SSLContext
)

By default: redirects on (max 10), no timeouts, no cookie jar unless requested, HTTP/2 enabled, 90s keep-alive expiry, unlimited connections.

Timeout has four independent fields — total (a deadline for the whole request, redirects included), connect, read and pool. There is no write timeout: request bodies are written full-duplex from background tasks, so total is the bound for slow uploads.

Backends

punkreq never asks for a backend at call sites — pick it by import:

from punkreq.asyncio import Client   # asyncio, available everywhere
from punkreq.tonio import Client     # tonio, free-threaded CPython >= 3.14 on Unix

License

punkreq is released under the BSD License.

Project details


Download files

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

Source Distribution

punkreq-0.1.0.tar.gz (53.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

punkreq-0.1.0-py3-none-any.whl (43.7 kB view details)

Uploaded Python 3

File details

Details for the file punkreq-0.1.0.tar.gz.

File metadata

  • Download URL: punkreq-0.1.0.tar.gz
  • Upload date:
  • Size: 53.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for punkreq-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bb9a4e829f98bd0252749c9f1354bdb617577ab236b05efff0de7b1ec077f1f9
MD5 640a5bc08047b814a3d27f2ff6d37fea
BLAKE2b-256 4a5e61523ad42f602c3262c80edf493d6f064c162d71b178f66dccfff4ce9905

See more details on using hashes here.

Provenance

The following attestation bundles were made for punkreq-0.1.0.tar.gz:

Publisher: publish.yml on gi0baro/punkreq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file punkreq-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: punkreq-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 43.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for punkreq-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ed486d485736f03e0ac4b5a414944420525832204673be3613b5c4f3e277ddca
MD5 b65544a90120e3eb04be3ca99b6fdc59
BLAKE2b-256 0ddba6a2eefc2b9072420e5ffc23de9d07dd7a39d60eb410d932564332ec2790

See more details on using hashes here.

Provenance

The following attestation bundles were made for punkreq-0.1.0-py3-none-any.whl:

Publisher: publish.yml on gi0baro/punkreq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page