You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
HTTP/2 SETTINGS values are not fingerprinted — all profiles share hyper defaults #385
All browser profiles in impit produce the same HTTP/2 Akamai fingerprint regardless of the selected browser. The SETTINGS frame values are hyper's defaults, not real browser values.
Tested all 17 profiles against tls.peet.ws/api/all:
Every profile has the exact same SETTINGS, only pseudo-header order differs.
What's wrong
HTTP/2 SETTING
impit
Chrome 144
HEADER_TABLE_SIZE (1)
not sent (4096 default)
65536
INITIAL_WINDOW_SIZE (4)
2097152
6291456
MAX_FRAME_SIZE (5)
16384 (sent)
16384 (not sent)
MAX_HEADER_LIST_SIZE (6)
16384
262144
WINDOW_UPDATE
5177345
15663105
Why
Http2Fingerprint only holds pseudo_header_order. The actual SETTINGS values come from hyper defaults and are never overridden in new_reqwest_client().
Practical impact
Akamai Bot Manager uses the HTTP/2 fingerprint as a detection signal. Correct TLS (JA3/JA4) alone is not enough — Akamai returns 403 when the HTTP/2 fingerprint doesn't match a real browser. This is likely less of an issue with Cloudflare, which explains why it hasn't surfaced earlier.
For comparison: curl_cffi and wreq-js (both using BoringSSL) produce the correct HTTP/2 fingerprint and pass Akamai checks.
Fix
4 of 5 values are already configurable via reqwest:
Activity
barjin commentedon Feb 27, 2026
Sorry for the noise, I'll keep this one open for a bit until we add support for
HEADER_TABLE_SIZE. Cheers!jackc625 commentedon Jul 31, 2026
jackc625 commentedon Aug 7, 2026
feat: send HTTP/2 `MAX_CONCURRENT_STREAMS` from browser fingerprints
feat: send HTTP/2 `HEADER_TABLE_SIZE` and `MAX_CONCURRENT_STREAMS` fr…