Skip to main content

Async HTTP client with retry, backoff, and proxy rotation

Project description

resilient-httpx

python coverage

Async HTTP client with retry, backoff, and proxy rotation. Built on top of httpx, tenacity, and structlog.

Installation

pip install resilient-httpx

Usage

Basic (no proxies)

from resilient_httpx import ProxyHttpClient, RetryPolicy

async with ProxyHttpClient(retry=RetryPolicy(max_attempts=5), timeout=15.0) as client:
    response = await client.get("https://api.example.com/data")

With proxy rotation

from resilient_httpx import ProxyHttpClient, RetryPolicy

client = ProxyHttpClient(
    proxies=[
        "http://proxy1:8080",
        "http://user:pass@proxy2:8080",
        "socks5://proxy3:1080",
    ],
    proxy_strategy="round-robin",  # or "random"
    retry=RetryPolicy(max_attempts=5, backoff="exponential"),
    timeout=15.0,
    blacklist_threshold=3,
    blacklist_ttl=300.0,
)

async with client:
    response = await client.get("https://api.example.com/data")
    data = response.json()

Custom retry policy

import httpx
from resilient_httpx import RetryPolicy

policy = RetryPolicy(
    max_attempts=5,
    backoff="exponential",       # "exponential" | "fixed" | "random_jitter"
    min_wait=1.0,
    max_wait=30.0,
    retry_on=[429, 500, 502, 503, 504],
    retry_on_exception=[httpx.TimeoutException, httpx.ConnectError],
)

Error handling

from resilient_httpx import ProxyHttpClient, AllProxiesExhausted, MaxRetriesExceeded

async with ProxyHttpClient(proxies=proxy_list) as client:
    try:
        response = await client.get("https://api.example.com/data")
    except AllProxiesExhausted:
        ...  # all proxies blacklisted
    except MaxRetriesExceeded as exc:
        ...  # retries exhausted, exc.__cause__ has the last error

Configuration Reference

Parameter Type Default Description
proxies list[str] | None None Proxy URLs
proxy_strategy str "round-robin" "round-robin" or "random"
retry RetryPolicy RetryPolicy() Retry configuration
timeout float 30.0 Request timeout in seconds
headers dict[str, str] | None None Default headers
blacklist_threshold int 3 Consecutive failures before blacklisting
blacklist_ttl float 300.0 Blacklist duration in seconds
fallback_to_direct bool False Request without proxy when all are blacklisted

Development

python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest

Run with coverage:

pytest --cov=resilient_httpx --cov-report=term-missing

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

resilient_httpx-0.2.0.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

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

resilient_httpx-0.2.0-py3-none-any.whl (7.2 kB view details)

Uploaded Python 3

File details

Details for the file resilient_httpx-0.2.0.tar.gz.

File metadata

  • Download URL: resilient_httpx-0.2.0.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resilient_httpx-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ae5df9e3e361e37ee530fa5eafca0e6b52a1e5c315ead0f9226682f345af7ca5
MD5 18b1dd549e99a243936de7a9671f4499
BLAKE2b-256 490cb1cc4075bf9eec02ed37f4c6b27c7356dca075d42e75e9d41f72441fa902

See more details on using hashes here.

Provenance

The following attestation bundles were made for resilient_httpx-0.2.0.tar.gz:

Publisher: publish.yml on galthran-wq/resilient-httpx

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

File details

Details for the file resilient_httpx-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for resilient_httpx-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d5628115e2ac7f0d278815a3cfe9304eb112e4333124e564ee7bb9fc53fdb3e9
MD5 255acb727677ea2c52fefb00aecef711
BLAKE2b-256 d0d89f92f4503b53126b034adf1fccc390da4795e86b08767375ef62bec8743f

See more details on using hashes here.

Provenance

The following attestation bundles were made for resilient_httpx-0.2.0-py3-none-any.whl:

Publisher: publish.yml on galthran-wq/resilient-httpx

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