• v1.1.0 952fe8a00f

    feat: hang-guard request() with an outer asyncio deadline

    dsql released this 2026-07-27 15:33:35 +00:00 | 2 commits to main since this release

    a backend can lose both its transfer wakeup and its own timeout enforcement in one
    failure (observed: a curl_cffi request that parked an aioweb consumer's event loop for
    24h+ - loop idle, nothing in flight, the await never completing). wrap _raw_request in
    asyncio.wait_for at the effective timeout + 5s slack: the backend's own timeout still
    fires first in every healthy failure, the envelope only trips when the backend's timer
    is dead, and its cancellation unwedges the orphaned transfer. deadline = per-call numeric
    timeout else the session timeout (default 10); timeout=None from request_with_retries
    guards on the session bound (that was the wedge path). explicit Session(timeout=None)
    stays unguarded - the documented opt-out for genuinely unbounded calls. additive, no new
    knob. fired: a never-completing backend hangs forever without this, dies at deadline+slack
    with it, and request_with_retries returns a FailureResponse instead of hanging.

    Signed-off-by: disqualifier dev@disqualifier.me

    Downloads