Build any browser fingerprint from JSON
describe_preset(name) emits every effective fingerprint field as a
JSON document. Mutate, load_preset_from_json, register, use. Same
workflow across Python / Node.js / .NET / Go. Round-trip byte-equal.
Per-resource-type H2 stream priority (Issue #56)
Chrome 141..147 desktop/android and Firefox 148 now emit a distinct
RFC 7540 stream weight + RFC 9218 priority: header per
Sec-Fetch-Dest. Safari and iOS variants stay opted out
(NoRFC7540Priorities=true). 14-dest default table inherits when a
preset doesn't define its own.
Caller-supplied headers respect HPACK position
cache-control / content-type / content-length / origin / referer /
cookie now land at their real-Chrome HPACK slot instead of being
appended after the preset's last entry.
Per-request timeout uniformly seconds
Python Session.get/post/etc, .NET Session.Get/Post/etc, and Node.js
Session.get/post all accept timeout in seconds, matching
Session(timeout=). Three coordinated bugs fixed across bindings and
clib async paths.
Cookie API close-out (BREAKING)
get_cookies() / getCookies() / GetCookies() now return cookie
objects with full metadata (List[Cookie] / Cookie[] / List<Cookie>),
closing the v1.6.1 deprecation cycle. The flat name->value dict
shape is gone. Same change for the singular get_cookie(name) /
getCookie(name) / GetCookie(name) -> Cookie object or null.
Migration: cookies.find(c => c.name == 'foo')?.value or equivalent.
JSON preset loader hardening
RegisterStrict() rejects (a) name collision with a built-in,
(b) duplicate custom-name registration, (c) empty name. clib
loader paths use it. BuildPreset gains an inheritance-loop
walker (rejects based_on chains that re-enter themselves) and
early ParseJA3 validation (malformed JA3 errors at load time
instead of mid-handshake).
http2.akamai shorthand authoritative override
When a custom preset spec inherits from a built-in AND sets
http2.akamai to a captured shorthand, the SETTINGS values +
WINDOW_UPDATE + stream weight + pseudo-order from the shorthand
now win over inherited discrete fields for the slots the
shorthand specifies. Previously the discrete zero defaults that
describe_preset always emits silently clobbered the captured
shorthand values.
Dependency bump: sardanioss/quic-go v1.2.24
Picks up the per-connection QUIC transport parameters work
(a8287c14). Removes the long-standing local-fork replace
directive that previously made `go install` impossible.
Other notable
- chrome-148-ios preset + embedded JSON registry
- Expanded JSON preset spec (key_share_curves,
delegated_credential_algorithms, QUIC H3 fields)
- Tweak-fingerprint examples in Python / Node.js / .NET
- WithDisableHTTP3() session option
- PresetPool rotation (round-robin / random) in all bindings
- Issue #57: retry default = 0 (was 3 in Python / Node.js)
- Issue #52: strip Referer / Authorization on scheme downgrade
and cross-origin redirects
- Issue #48: Node.js FFI string leaks fixed via koffi disposable
- Issue #53: fetch_mode kwarg on every request method
- Issue #51: .NET cookie Max-Age widened to int64
- Issue #42: binary response body corruption fixed across all
bindings via base64 envelope
- Hybrid-PQ JA3 handshake fix (X25519MLKEM768 first key share)
- QUIC google_connection_options corrected to ORIG