Skip to main content

polite-http

CI PyPI version Python versions License

A courteous, dependency-free HTTP client for Python. It plays nice with rate-limited APIs out of the box:

  • Per-host rate limiting — cross-process, via a shared file lock.
  • Automatic retries on transient errors (HTTP 429, 5xx) and network errors.
  • Exponential backoff with optional jitter.
  • Retry-After support (server-directed backoff, both seconds and HTTP-date forms).
  • X-Throttling-Control proactive backpressure (as used by PubChem / NCBI).
  • Streaming helpers for large line-oriented and binary responses.
  • Zero third-party dependencies — built entirely on the standard library (urllib.request).

Installation

pip install polite-http

Requires Python 3.9+. Cross-process rate limiting works on Linux, macOS, and Windows — it uses fcntl on POSIX and msvcrt on Windows for the shared file lock (both standard library). On the rare platform that provides neither, it falls back to a best-effort in-process timer.

Quick start

from polite_http import HttpClient

# Scope a client to a base URL and a steady-state rate of 3 requests/second.
client = HttpClient("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/", qps=3)

# GET + parse JSON (relative paths are resolved against the base URL).
data = client.fetch_json("esummary.fcgi?db=pubmed&id=123456")

# POST a JSON body.
result = client.fetch_json(
    "esearch.fcgi",
    method="POST",
    json_body={"db": "pubmed", "term": "cancer"},
)

# Download raw bytes with a custom timeout.
pdf = client.fetch_bytes(
    "efetch.fcgi?db=pubmed&id=123456&rettype=abstract",
    timeout=60,
)

Streaming

# Stream a large response line-by-line without buffering it all in memory.
for line in client.stream_lines("large-export.tsv"):
    process(line)

# Stream binary content in chunks (e.g. to a file).
with open("paper.pdf", "wb") as f:
    for chunk in client.stream_bytes("paper.pdf"):
        f.write(chunk)

Configuration

HttpClient accepts the following keyword arguments:

Argument Default Description
qps required Maximum queries per second (steady state).
default_headers None Headers added to every request.
max_retries 7 Retry attempts for transient errors (total attempts = max_retries + 1).
timeout 60.0 Per-request timeout in seconds.
backoff_base 3.0 Base delay for exponential backoff.
backoff_max 180.0 Cap on backoff delay.
jitter 0.5 Max uniform random jitter added to each backoff.
user_agent env / "" User-Agent header; falls back to POLITE_HTTP_USER_AGENT.
retryable_status_codes {429, 500, 502, 503, 504} Status codes that trigger a retry.
referer None Optional Referer header sent with every request.

Environment variables

  • POLITE_HTTP_USER_AGENT — default User-Agent when one isn't passed explicitly. Many APIs (e.g. NCBI) reject requests without a descriptive User-Agent, so setting this is recommended.
  • POLITE_HTTP_LOCK_DIR — directory for the cross-process rate-limit lock files (defaults to the system temp directory).

Error handling

Failed requests raise HttpError, which carries the status_code, raw body bytes, and url:

from polite_http import HttpClient, HttpError

client = HttpClient("https://api.example.com/", qps=5)
try:
    data = client.fetch_json("widgets/42")
except HttpError as exc:
    print(exc.status_code, exc.url)
    if exc.body:
        print(exc.json())  # parse the error body as JSON, if applicable

Acknowledgements

The HTTP client at the heart of this package is derived from the science-skills project by Google DeepMind, used under the Apache License 2.0. See NOTICE for details of the changes.

License

Apache License 2.0.

Metadata

Release files for polite-http 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for polite-http 0.1.1
File Size Uploaded
polite_http-0.1.1.tar.gz 21.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for polite-http 0.1.1
File Interpreter ABI Platform
polite_http-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 40.8 kB

Release files / polite_http-0.1.1.tar.gz

Download URL polite_http-0.1.1.tar.gz
Size 21.3 kB
Tags Source
SHA-256 checksum
How to use checksums
b64ca215c571d9cbd7276c85f0a4e73dff6c4fd6ddee273f9fd830ec1124d7ee
BLAKE2b-256 checksum
How to use checksums
eda9a0c71b2783a04d4dfc68af880d080777a066eca1dce41f0298001b9df4f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.

Transparency log

Release files / polite_http-0.1.1-py3-none-any.whl

Download URL polite_http-0.1.1-py3-none-any.whl
Size 19.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
30c2067d8a214943078de614796a5f33a812c4e356406068ef840f80c266bbe6
BLAKE2b-256 checksum
How to use checksums
ff034d7a0e6b9a2eb883ed06b92241ff8038361ffd7736a33a1251d228c4b31f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 4, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.3

2 release files

0.1.2

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page