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.2

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.2
File Size Uploaded
polite_http-0.1.2.tar.gz 21.4 kB Details

Built distribution (wheel)

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

Total release size: 40.9 kB

Release files / polite_http-0.1.2.tar.gz

Download URL polite_http-0.1.2.tar.gz
Size 21.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f8566f998e2d8eea27b2cdcb62c254f037dee48aa997a5d50b190e8ea8529ead
BLAKE2b-256 checksum
How to use checksums
f8f024000bb1568eb11ed5ce2384d367baaf173d5c2b1b4111c871cad09a832f
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.2-py3-none-any.whl

Download URL polite_http-0.1.2-py3-none-any.whl
Size 19.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2b1db86eea41663400de98ca828bdcc0bfa5a65f5b7f0969a4bfc6b58644dabc
BLAKE2b-256 checksum
How to use checksums
0b2992058a880564632c4a6f3b461cc62bc00b0ba92dba76640731fd1f00c117
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

This release

0.1.2 This release

2 release files

0.1.1

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