Skip to main content

chumicro-requests

A non-blocking HTTP/1.1 client that keeps your LED blinking through a TLS handshake.

A requests-flavored surface that advances one chunk per runner tick (connect, send, recv, parse), so your control loop never stalls waiting for a peer. It covers plain HTTP and HTTPS (live-verified on real boards), the POST / PUT / PATCH / DELETE verbs with a JSON helper, redirect handling, and Transfer-Encoding: chunked decode. For bodies bigger than RAM, stream=True reads a firmware image into a 512-byte buffer one chunk at a time.


Part of the ChuMicro family: small, focused Python libraries for microcontrollers and laptops. Browse all libraries.

Install

# CircuitPython (after `circup bundle-add ChuMicro/ChuMicro-Bundle`)
circup install chumicro_requests

# MicroPython
mpremote mip install github:ChuMicro/ChuMicro-Bundle/chumicro_requests

# CPython
pip install chumicro-requests

For bundle setup, pre-compiled .mpy bundles, the experimental channel, and details on PyPI naming, see the chumicro INSTALL guide.

Quick example

from chumicro_requests import HttpClient
from chumicro_sockets.sockets_factory import connector_factory
from chumicro_timing import ticks_ms

client = HttpClient(transport_factory=connector_factory())
handle = client.get("http://api.example.com/now", timeout_ms=5000)

while not handle.done:
    if client.check(ticks_ms()):
        client.handle(ticks_ms())

response = handle.result          # raises HttpError on failure
print(response.status_code)       # 200
print(response.headers["content-type"])
print(response.body)              # raw response bytes
print(response.text)              # decoded str (charset sniffed from Content-Type)
print(response.json())            # parsed JSON when Content-Type is application/json

What's included

Symbol Purpose
HttpClient Runner-shaped HTTP/1.1 client; check(now_ms) / handle(now_ms); per-verb methods plus generic request(...); stream=True for incremental bodies; cancel() aborts in flight.
RequestHandle Per-request handle: .done, .result, .error; .read_body_into(buffer) drains a streamed body.
Response Status code, reason, headers, raw body, URL; .text, .json(), .encoding; .streamed on streamed exchanges.
chumicro_requests.generators Opt-in submodule: yield from-shaped fetch / get / post / ... one-shots and stream + BodyReader for chunked body reads under Runner.add_generator.
CaseInsensitiveDict Header dict with case-insensitive lookups.
WhenOversized Policy enum for responses past max_body_bytes.
chumicro_sockets.sockets_factory.connector_factory(...) Shared module: convenience connection-factory wired to chumicro-sockets.
parse_url(url) URL → (scheme, host, port, path).
parse_charset(content_type) Extract charset from a Content-Type header value.
encode_request(...) Build raw HTTP request bytes.
ResponseParser Streaming response state machine.
HttpError + subclasses HttpBusyError, HttpTimeoutError, HttpProtocolError, HttpURLError, HttpOversizedError.
chumicro_requests.testing.FakeHttpClient Host-only fake for downstream test suites.

Where this fits

Depends on chumicro-sockets for TCP / TLS and chumicro-timing for ticks. Used directly in app code.

Platform support

Works on CPython, MicroPython, and CircuitPython. Pure Python, no native extensions.

Examples

Example What it shows
periodic_get.py Periodic GET on a real CP/MP board. Brings wifi up, hits a configured URL every N seconds, prints status + body length, drives an LED-blink counter to verify the request never blocks the loop. Reads wifi + target URL from runtime_config.msgpack (chumicro-workspace) with a constants fallback. Cross-runtime (CP + MP).
generator_fetch.py The generator surface: a straight-line yield from get(...) fetch driven by runner.add_generator, no callbacks or state polling.

Wiring wifi credentials for examples

The board-side examples need wifi credentials to reach the network. periodic_get.py reads them (and its target URL) from a runtime_config.msgpack written by chumicro-workspace, and falls back to in-file placeholder constants you edit directly when no config file is deployed. The library itself never reads config: it takes a transport_factory and goes, so credential and config wiring stay in your application.

Contributing

Issues, bug reports, and pull requests are welcome, and so is "I ran it on this board and here's what happened", some of the most useful feedback a hardware project can get. Development happens in the ChuMicro repository, whose contributing guide covers setup and the test workflow.

Docs

📖 Stable docs · Experimental docs

Find this library

License

MIT

Metadata

Release files for chumicro-requests 0.21.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 chumicro-requests 0.21.2
File Size Uploaded
chumicro_requests-0.21.2.tar.gz 68.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for chumicro-requests 0.21.2
File Interpreter ABI Platform
chumicro_requests-0.21.2-py3-none-any.whl Python 3 none any Details

Total release size: 96.1 kB

Release files / chumicro_requests-0.21.2.tar.gz

Download URL chumicro_requests-0.21.2.tar.gz
Size 68.7 kB
Tags Source
SHA-256 checksum
How to use checksums
9d51e298b2181251e95f4a138eed85a8b0f224d8bcd0702ea78d76f085a222d1
BLAKE2b-256 checksum
How to use checksums
c470476aa3316e569c4be89c6187faa89719696cb4f1d5082767e76485331802
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 Aug 18, 2026.

Transparency log

Release files / chumicro_requests-0.21.2-py3-none-any.whl

Download URL chumicro_requests-0.21.2-py3-none-any.whl
Size 27.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dc33aa1436306654c180b54ddccb73caec4a502145fb2a463455758bb1e2d0ae
BLAKE2b-256 checksum
How to use checksums
5afbb815e106c876285824a49aaa2c8846f02e2a11017432b166fb7df4d969d8
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 Aug 18, 2026.

Transparency log

Release history Release notifications | RSS feed

0.21.3

2 release files

This release

0.21.2 This release

2 release files

0.21.1

2 release files

0.21.0

2 release files

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