Carry RequestHeaders through navigation, Fetch/XHR, workers, redirects and auth,
with explicit Unicode and ByteString conversions at protocol and WebIDL boundaries.
Share the raw curl header list with WebSocket transport and decode binary response
headers without UTF-8 replacement. Keep header memory charging concrete.
Cover opaque values, UTF-8 overrides, duplicates, redirect/auth continuation and
WebSocket handshakes with byte-level regression tests.
Write proxy header values directly into the native request and delete the
unused CONNECT string and append_proxy_connect_header helper. Native
request configuration already validates these fields before connecting.
Move rejection coverage to the native configuration entry point, covering
CR, LF and NUL in User-Agent and Proxy-Authorization. Check User-Agent on
the actual CONNECT request while retaining proxy credential isolation and
WSS tunnel coverage.
Validation: 96 package tests passed all 3 iterations; cargo fmt --all,
strict workspace/all-targets/all-features Clippy and full nextest passed
(17322 passed, 13 skipped).
Dropping the last connection handle can close its command channel before
task cancellation is observed. The synthetic loop could then publish an
unsolicited abnormal Close after the client had gone away.
Exit silently when command producers disappear, matching the native
session. Keep explicit client close, peer close and failure events intact.
Add a deterministic regression for channel closure before task abortion;
it reproduced the extra Close(1006) before this fix.
Validation: original lifecycle test and deterministic regression passed
all 50 stress iterations; 96 package tests passed all 3 iterations.
Formatting, strict workspace/all-targets/all-features Clippy and full
nextest passed (17322 passed, 13 skipped).
Remove FrameProgress and message_kind from the browser assembler. Use
libcurl's validated chunk metadata and normalized continuation types,
checking frame and message memory limits before buffering each new frame.
Keep payload assembly, UTF-8 and Close content validation in the browser
layer.
Document the native Chunk contract and cover 31 invalid framing cases,
chunk boundaries, continuation types, empty frames and interleaved control
frames through the real transport. Strengthen browser regressions for
partial-message failure, UTF-8, Close contents and exact size limits.
Verify that a declared final frame which exceeds the message budget fails
while the bytes received are still within that budget, without waiting
for the rest of the frame payload.
Validation: cargo fmt --all; strict workspace/all-targets/all-features
Clippy; full nextest (17321 passed, 13 skipped). The 564 related tests
passed all 3 stress iterations; the strengthened message-budget boundary
test passed all 10 iterations.
Replace unused data/control send queues, admission semaphores and public
receipts with send_frame(). The browser session owns scheduling; a single
pending frame preserves partial writes and completes independently of
receive backpressure.
Reject overlapping submissions and retain submitted frames if their
waiting futures are dropped. Cover slot reuse, cancellation, transport
failure, partial writes and sends with a full receive queue.
Update curl-rust to 608f08d, which bounds native receive prefetch and fixes
the browser receive-backpressure regression exposed during validation.
Validation: cargo fmt --all; strict workspace/all-targets/all-features
Clippy; full nextest (17318 passed, 13 skipped). The unchanged browser
receive-backpressure test passed 40 stress iterations, and 561 related
tests passed all 3 stress iterations.
Publish one SendCompleted per outgoing message, including empty messages.
Use it for browser byte accounting, stream write settlement and CDP records,
preserving the selected Page task's microtask completion boundary.
Remember writes rejected by native admission before peer Close delivery so
WebSocketStream.closed rejects with the actual close information. Cover that
ordering deterministically and preserve the interrupted write's error identity.
Validation: cargo fmt --all; cargo clippy --workspace --all-targets
--all-features -- -D warnings; cargo nextest run --no-fail-fast. The two close
regressions also pass 30 stress iterations, and all 242 WebSocket-related tests
pass three iterations.