All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project follows Semantic Versioning.
Unreleased
[0.4.2] - 11.06.2026
Added
- Support Req 0.6: the version constraint is relaxed to
~> 0.5 or ~> 0.6. Req 0.6's changes are confined to its request/response step pipeline (multipart escaping, decoder defaults, opt-in decompression), none of which touch the adapter contract; the full suite passes against Req 0.6.1.
Fixed
- A malicious
Content-Lengthresponse header can no longer abort the BEAM VM. The response buffer is no longer pre-allocated from the raw header value, which was only reachable undermax_body_size: :unlimited. - A crafted
Set-CookieDomainattribute containing a multibyte character no longer fails cookie-jar requests; the attribute is now parsed on a character boundary. - A native request that never delivers a reply now returns a
:transport_errorafter a deadline instead of blocking the calling process indefinitely.
Changed
- The native client cache no longer grows without bound under proxy, source-IP, or connect-timeout rotation. Proxy and source IP are applied per request (wreq's connection pool already isolates connections by both), the remaining cache is LRU-bounded, and clients are built outside the cache lock.
- Request bodies are copied on the Tokio worker thread instead of the calling BEAM scheduler, keeping scheduler work constant for any body size.
- Update the Rust NIF to rustler 0.38 (a clean drop-in: no source or API changes, no new warnings).
Documentation
- Document that
max_body_sizecaps both the request and the response body. - Update the install snippet to
~> 0.4.0and regenerate the impersonation-profile list againstwreq-util 3.0.0-rc.12.
[0.4.0] - 23.05.2026
Changed
- Run native HTTP requests asynchronously on the shared Tokio runtime instead of blocking DirtyIo NIF calls, improving high-concurrency throughput.
- Abort in-flight native requests when the BEAM caller exits before the response is delivered.
Fixed
- Respect Req
connect_optionsfor proxy configuration, proxy headers, and connect timeout in the nativewreqadapter. - Reject unsupported
connect_optionswith clear adapter errors instead of silently ignoring them.
[0.3.2] - 07.03.2026
Added
- Ship
usage-rules.mdwith the Hex package so consumers and LLM tooling can discover the canonical adapter usage and options.
Changed
- Add a
HexDocspackage link in Hex metadata and a docs link near the top of the README. - Update dev dependencies:
credo,styler, andusage_rules.
[0.3.1] - 07.03.2026
Fixed
- Redirect cookies are now stored against the actual response host, so cookie jars behave correctly across host-changing redirects.
- CI again tests the minimum advertised Elixir version (
~> 1.19).
Changed
- Releases are now tagged automatically when a version bump lands on
main, and the release flow is documented inRELEASE.md.
[0.3.0] - 24.02.2026
Added
:local_addressoption for outbound source IP binding (IPv4/IPv6 tuples and strings).- Local address is included in the client cache key to prevent IP leakage through connection pooling.
[0.2.0] - 23.02.2026
Changed
- Upgraded NIF version to 2.17.
Fixed
- Release workflow now creates GitHub releases on
workflow_dispatchruns. - Release tarball naming aligned with rustler_precompiled expectations.
[0.1.0] - 20.02.2026
Added
- Req adapter with
CloakedReq.attach/2andCloakedReq.impersonate/2. - Browser emulation wiring and structured response/error mapping.
- Cookie jar support (
CloakedReq.CookieJar) with PSL-based domain validation. - Client pooling with TLS session resumption and HTTP keep-alive.
- Configurable
max_body_sizeoption (default 10 MB). - Explicit
:insecure_skip_verifyoption (defaultfalse) for constrained external test environments.