fix: label TLS-backend timeouts ServerTimeoutError, flatten noble multi headers, ValueError on unknown profile (v0.1.5)
Both backends' asyncio.TimeoutError except-branch was dead code (neither curl_cffi nor noble_tls raises it), so a real wire timeout fell through to the generic OSError branch and got mislabeled a plain aiohttp.ClientError instead of aioweb's own ServerTimeoutError contract; now detected via curl_cffi's Timeout type or Go-side timeout text and re-wrapped correctly. Noble's multi-valued response headers (e.g. two Set-Cookie lines) arrived as Python lists instead of strings, breaking any downstream .split()/.lower() call; now comma-joined per RFC 7230. An unknown Noble client profile string raised a raw AttributeError from the enum lookup; now a ValueError listing the valid profile names. Also compresses essay-length docstrings and narrating comments across the module with no behavior change. Signed-off-by: disqualifier <dev@disqualifier.me>
This commit is contained in:
@@ -22,17 +22,17 @@ you want; importing the package never fails because an extra is missing.
|
||||
`requirements.txt` (pick the extra you need):
|
||||
|
||||
```
|
||||
aioweb_tls[curl] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.4
|
||||
aioweb_tls[noble] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.4
|
||||
aioweb_tls[all] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.4
|
||||
aioweb_tls[curl] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.5
|
||||
aioweb_tls[noble] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.5
|
||||
aioweb_tls[all] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.5
|
||||
```
|
||||
|
||||
Direct:
|
||||
|
||||
```bash
|
||||
pip install "aioweb_tls[curl] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.4"
|
||||
pip install "aioweb_tls[noble] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.4"
|
||||
pip install "aioweb_tls[all] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.4"
|
||||
pip install "aioweb_tls[curl] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.5"
|
||||
pip install "aioweb_tls[noble] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.5"
|
||||
pip install "aioweb_tls[all] @ git+ssh://git@git.rethinkstudios.io/rethink-public/aioweb_tls.git@v0.1.5"
|
||||
```
|
||||
|
||||
- `[curl]` → curl_cffi backend · `[noble]` → noble_tls backend · `[all]` → both.
|
||||
@@ -44,7 +44,7 @@ pip install "aioweb_tls[all] @ git+ssh://git@git.rethinkstudios.io/rethink-publi
|
||||
Constructing a backend whose client isn't installed raises that `RuntimeError` at
|
||||
construction, never at import.
|
||||
|
||||
Drop the `@v0.1.4` suffix from the line above to install the latest unpinned.
|
||||
Drop the `@v0.1.5` suffix from the line above to install the latest unpinned.
|
||||
|
||||
## curl_cffi backend
|
||||
|
||||
@@ -63,6 +63,10 @@ async with TLSSession(backend=CurlCffi(impersonate="chrome"), proxies={"https":
|
||||
backend kwargs — passing `impersonate=` there raises `TypeError`; set the profile on
|
||||
the `CurlCffi` instance for the retrying path.
|
||||
- curl_cffi forges JA3/JA4 + HTTP/2 fingerprints via the bundled curl-impersonate binary.
|
||||
- A wire-level timeout raises `aiohttp.ServerTimeoutError` (matching aioweb's own
|
||||
contract), not a generic `aiohttp.ClientError` — both backends detect their
|
||||
native timeout (curl_cffi's `Timeout` type, noble_tls's Go-side timeout text) and
|
||||
re-wrap it before the fallback client-error path (v0.1.5).
|
||||
|
||||
## noble backend
|
||||
|
||||
@@ -76,7 +80,8 @@ async with TLSSession(backend=Noble(client="chrome_133")) as s:
|
||||
print(resp.json()["tls"]["ja3"])
|
||||
```
|
||||
|
||||
- `Noble(client="chrome_133")` — accepts a `noble_tls.Client` enum or a string name.
|
||||
- `Noble(client="chrome_133")` — accepts a `noble_tls.Client` enum or a string name;
|
||||
an unknown string raises `ValueError` listing the valid profile names (v0.1.5).
|
||||
- noble_tls downloads a Go shared library on first use. `await s.setup()` fetches it
|
||||
once at startup; if you skip it, the first request fetches it lazily. The fetch is
|
||||
guarded by a lock, so even concurrent first requests download it exactly once.
|
||||
@@ -85,6 +90,10 @@ async with TLSSession(backend=Noble(client="chrome_133")) as s:
|
||||
bytes (`U+FFFD` replacement, wrong length) even on a 200 response — the Noble
|
||||
backend always requests `is_byte_response=True` and decodes the resulting
|
||||
base64 data-URI back into raw bytes, so `resp.content` is never lossy.
|
||||
- Multi-valued response headers (e.g. two `Set-Cookie` lines) arrive from noble_tls's
|
||||
Go side as a Python list — the Noble backend flattens them to a single
|
||||
comma-joined string per RFC 7230, so `resp.headers[...]` is always a plain string
|
||||
(v0.1.5).
|
||||
|
||||
## Writing your own backend (the `TLSBackend` protocol)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user