Skip to content

Detach WebTransport Server sessions from ordinary H3 intake - #4

Open
xenorune wants to merge 8 commits into
runewarp/webtransport-clientfrom
runewarp/webtransport
Open

xenorune wants to merge 8 commits into
runewarp/webtransport-clientfrom
runewarp/webtransport

Conversation

@xenorune

@xenorune xenorune commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

What

Complete the detached WebTransport Server API while ordinary HTTP/3 requests and GOAWAY continue. Add bounded session admission, independent stream opening and routing, 22 Quinn integration tests, a tested request budget in the example, and the complete patch inventory.

Why

runewarp/runewarp #255 needs Server-opened bidirectional streams on an existing H3 connection. This ports the #251 prototype into the fork, following the #253 branch structure and #254 carrier decision. The PR is stacked on runewarp/webtransport-client; Runewarp integration and application policy remain outside this change.

Review fixes let applications evict silent classifiers during deadline handling or shutdown, restore ordinary incomplete-request errors before WT identification, correct stale ownership documentation, and bound resolver task creation in the example.

How

server::new returns an ordinary request driver and a cloneable Acceptor. Admission validates negotiation, draft and request shape, reserves capacity across response writes, and rejects invalid or over-cap requests with 400/429. A session-specific opener carries the full CONNECT ID and shared terminal state. Each open future has independent backend pending state.

Bounded classifiers route exact session IDs and skip leading unknown H3 frames incrementally. evict_pending_streams() drops all currently pending classifiers, releases their request tracking and frees slots, buffers and wakers. Unclassified ordinary/unknown streams use H3_REQUEST_REJECTED; identified WT streams retain WT_SESSION_GONE. Applications own prefix and whole-connection deadlines. GOAWAY semantics remain unchanged. EOF before identifying WT uses H3_REQUEST_INCOMPLETE, including empty ordinary requests without WT enabled.

The example reserves one of 32 per-connection handler permits before spawning and rejects excess requests without blocking the driver or spawning permit waiters. A task set reaps and aborts tracked handlers. Its Quinn regression verifies saturation, independent WT echo progress, permit recovery, ordinary response recovery and connection-loss cleanup. CONNECT close/drain processing remains bounded, validates through peer FIN and resets on cancelled writes. Unsupported detached WT uni streams are rejected, and core uni headers consume buffered varints without waiting for another read.

The supported Runewarp profile remains Draft07. Detached uni dispatch, session datagram routing, subprotocol negotiation and full modern flow control remain deferred. PATCHES.md records source commits, review fixes, backend requirements and deliberate deferrals for overlapping security PRs hyperium#366, hyperium#377 and hyperium#378. Encoded-frame/parser risks and Quinn's deferred pending-read STOP_SENDING code limitation remain documented. Manifests, crate names, lockfile, earlier layers and the mirror are unchanged.

Validation: default and all-feature workspace suites each pass 343 tests; the example admission regression separately passes. Formatting, strict library and changed-test/example Clippy, strict WebTransport rustdoc, the ordinary example exchange and native h3spec pass. H3spec runs 43 cases with the five existing exclusions. All-target Clippy matches the same 16 baseline warnings by message and primary location.

Claude Opus 5.5 reviewed c06ae457b578cc95717501909ba46ea737642b6d with no blockers and four findings. All four are addressed in post-review commits through df27106fb243baaf867d11441d11cf671ec9da7e; no second independent review is claimed. The parent owns CI and the final hyperium#255 report.

🤖 Written by @dtcristo's agent (GPT-6.1-Sol, Claude Opus 5.5)

dtcristo and others added 8 commits October 25, 2026 02:01
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants