- request_with_retries labels an exhausted total-timeout as 'timeout' instead of the
generic 'unexpected error' catch-all (nit)
- as_curl() renders an empty-but-valid json body ({} / []) via is-not-None instead of
dropping it as falsy (nit)
- _apply_overwrites snapshots the shared override dicts before iterating, so a
concurrent mutation can't raise 'dict changed size during iteration' (nit).
Signed-off-by: disqualifier <dev@disqualifier.me>
broaden the except to (aiohttp.ClientError, asyncio.TimeoutError) and re-wrap into
the same typed aiohttp.ClientError path. a total ClientTimeout raises a bare
asyncio.TimeoutError, which is NOT an aiohttp.ClientError subclass, so it previously
leaked raw out of request()/test_proxies(). add the missing asyncio import.
Signed-off-by: disqualifier <dev@disqualifier.me>
header/body/url/proxy values were wrapped in raw single quotes, so a value containing a quote or shell metacharacter produced a broken or injectable command. every interpolated value is now shell-quoted.
Signed-off-by: disqualifier <dev@disqualifier.me>
bump the commons dependency pin to v0.2.1 (retry attempts-floor fix). no code change;
the aretry migration is unaffected.
verified: 18/18 migration harness passes against commons 0.2.1.
Signed-off-by: disqualifier <dev@disqualifier.me>