fix: preserve exception subtype in request(), render params/timeout in as_curl()
request() re-raised every aiohttp.ClientError subclass as the bare base class, losing ClientConnectorError/ClientProxyConnectionError/ClientResponseError (.status/.headers)/TooManyRedirects and their attributes; direct callers branching by type never matched. Now the original exception is bare-raised, preserving subtype, attributes, and __cause__. request_with_retries (which catches the base ClientError) is unaffected. as_curl() silently dropped params and timeout, so a debug=True replay of a params-driven request hit a different URL than the one actually sent. params are now merged into the URL via yarl before quoting, and timeout renders as --max-time. Bumps 0.1.7 -> 0.1.8. Signed-off-by: disqualifier <dev@disqualifier.me>
This commit is contained in:
@@ -11,18 +11,18 @@ and swap the HTTP client while inheriting everything else.
|
||||
`requirements.txt`:
|
||||
|
||||
```
|
||||
aioweb @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb.git@v0.1.7
|
||||
aioweb @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb.git@v0.1.8
|
||||
```
|
||||
|
||||
Direct:
|
||||
|
||||
```bash
|
||||
pip install "aioweb @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb.git@v0.1.7"
|
||||
pip install "aioweb @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb.git@v0.1.8"
|
||||
```
|
||||
|
||||
Requires `aiohttp` and `yarl` (pulled transitively).
|
||||
|
||||
Drop the `@v0.1.7` suffix from the line above to install the latest unpinned.
|
||||
Drop the `@v0.1.8` suffix from the line above to install the latest unpinned.
|
||||
|
||||
## Usage
|
||||
|
||||
@@ -65,6 +65,15 @@ resp = await s.request_with_retries(
|
||||
|
||||
Returns a `FailureResponse` (falsy) if every attempt fails.
|
||||
|
||||
`request()` (the non-retrying call) raises on failure: a total timeout raises
|
||||
`aiohttp.ServerTimeoutError`, and any other network/protocol failure raises its real
|
||||
`aiohttp.ClientError` subtype as-is (`ClientConnectorError`, `ClientProxyConnectionError`,
|
||||
`ClientResponseError` with `.status`/`.headers`, `TooManyRedirects`, ...) — it is not
|
||||
flattened into the base `ClientError`, so direct callers can branch by type or read
|
||||
subtype attributes. `request_with_retries` catches the base `aiohttp.ClientError` (and
|
||||
`asyncio.TimeoutError`) across all attempts and returns a falsy `FailureResponse` instead
|
||||
of raising.
|
||||
|
||||
## Header overwrites & ephemeral headers
|
||||
|
||||
```python
|
||||
@@ -88,7 +97,10 @@ s.overwrite_domain("internal.local", "127.0.0.1") # host-substring rewrite
|
||||
print(s.preview("POST", url, json={"a": 1}).as_curl()) # equivalent cURL command
|
||||
```
|
||||
|
||||
Pass `debug=True` to `request_with_retries` to log the cURL preview and request flow.
|
||||
`as_curl()` renders `params` (merged into the url's query string) and `timeout` (as
|
||||
`--max-time`) as well as headers/body/proxy, so the emitted command is faithful to what
|
||||
`request()` actually sends. Pass `debug=True` to `request_with_retries` to log the cURL
|
||||
preview and request flow.
|
||||
|
||||
## Custom backends
|
||||
|
||||
@@ -132,6 +144,23 @@ Two changes can't be shimmed without re-introducing the bugs they fix:
|
||||
|
||||
## Changelog
|
||||
|
||||
### v0.1.8
|
||||
|
||||
- **`request()` no longer flattens `aiohttp.ClientError` subtypes.** Every failure
|
||||
(connect errors, proxy errors, `raise_for_status()`-style response errors,
|
||||
redirect limits, ...) was re-raised as a bare `aiohttp.ClientError`, losing the
|
||||
real subtype and its attributes (`.os_error`, `.status`, `.headers`, ...) — a
|
||||
direct caller doing `except ClientProxyConnectionError:` or `if e.status == 401`
|
||||
would silently never match. Now the original exception is re-raised as-is (its
|
||||
subtype, attributes, and `__cause__` all preserved). `request_with_retries`
|
||||
still catches the base `aiohttp.ClientError` across attempts, so its behavior
|
||||
(and its `FailureResponse` return on exhaustion) is unchanged.
|
||||
- **`as_curl()` now renders `params` and `timeout`.** Previously a preview built
|
||||
with `params=` silently omitted the query string (and a `timeout=` omitted
|
||||
`--max-time`), so a `debug=True` cURL replay of a params-driven request hit a
|
||||
different URL than the one actually sent. `params` are now merged into the url's
|
||||
query string (via `yarl`) and `timeout` is emitted as `--max-time`.
|
||||
|
||||
### v0.1.7
|
||||
|
||||
- **`get_cookies()` now returns real cookies.** Previously called `filter_cookies()`
|
||||
|
||||
Reference in New Issue
Block a user