cloudflare/quiche · error
Unable to create HTTP/3 connection, check the server's uni…
Error message
Unable to create HTTP/3 connection, check the server's uni stream limit and window size
What it means
When establishing the client's HTTP/3 layer, connect_to h3::Connection::with_streams is unwrapped with this message. The H3 handshake allocates control/QPACK encoder/decoder uni streams, which fails if the server's advertised uni stream limit or flow-control window is too small to open them.
Solutions
- Raise the server's uni stream limit (e.g. Config::set_max_streams_uni to >= 3) and window sizes (set_stream_window_uni / set_max_data)
- Check the server's quiche::Config for restrictive transport parameters
- Capture a qlog of the handshake to confirm the advertised limits
- If you control neither endpoint, use a server with standard HTTP/3 defaults
Example fix
// before (server config) config.set_max_streams_uni(2); // not enough for control + QPACK streams // after (server config) config.set_max_streams_uni(8); config.set_stream_window_uni(16_384);
Defensive patterns
Strategy: validation
Validate before calling
// on the server side, before accepting clients: config.set_max_streams_uni(8); // h3 needs control + QPACK encoder/decoder streams config.set_stream_window_uni(16_384); config.set_max_data(1_048_576);
Try / catch
let h3_conn = h3::Connection::with_streams(...)
.map_err(|e| anyhow!("Unable to create HTTP/3 connection: {e} \
(check server's uni stream limit and window size)"))?; Prevention
- Ensure the server advertises at least 3 uni streams (control + QPACK pair)
- Keep transport-parameter defaults unless you fully understand H3 requirements
- Capture a qlog of the failed handshake to inspect advertised limits
When it happens
Trigger: Server transport parameters set max_streams_uni (or window sizes) too low, so h3::Connection creation in apps/src/common.rs:852 fails while building the Http3Conn client.
Common situations: Custom/minimal quiche-server configs with reduced stream limits or windows; misconfigured intermediates; clients talking to servers with unusually restrictive transport parameters.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- Expected stream_send on stream
- Expected stream_send on stream
- Expected stream_send on stream
- value is too large for varint
- The provided buffer is too large
AI-assisted analysis of cloudflare/quiche@9f96daa2c2 (2026-09-08).
Data as JSON: /api/errors/40f260d7f8c913ef.
Report an issue: GitHub.
Appendix: source
Thrown at apps/src/common.rs:852
priority,
response_hdrs: Vec::new(),
response_body: Vec::new(),
response_body_max: dump_json.unwrap_or_default(),
stream_id: None,
response_writer: None,
});
}
}
let h_conn = Http3Conn {
h3_conn: quiche::h3::Connection::with_transport(
conn,
&make_h3_config(
max_field_section_size,
qpack_max_table_capacity,
qpack_blocked_streams,
),
).expect("Unable to create HTTP/3 connection, check the server's uni stream limit and window size"),
reqs_hdrs_sent: 0,
reqs_complete: 0,
largest_processed_request: 0,
reqs,
body: body.as_ref().map(|b| b.to_vec()),
sent_body_bytes: HashMap::new(),
dump_json: dump_json.is_some(),
dgram_sender,
output_sink,
};
Box::new(h_conn)
}
pub fn with_conn(
conn: &mut quiche::Connection, max_field_section_size: Option<u64>,
qpack_max_table_capacity: Option<u64>,
qpack_blocked_streams: Option<u64>,View on GitHub (pinned to 9f96daa2c2)