EpicGames/lore · error · anyhow::Error
No protocol found on request
Error message
No protocol found on request
What it means
Thrown by get_protocol when the TLS handshake data for an accepted QUIC connection exists but carries no negotiated ALPN protocol (the protocol field is None). Since this server requires every connection to identify its service via ALPN, a client that connected without offering (or agreeing on) any ALPN identifier is rejected here during handle_conn processing.
Solutions
- Configure the client to offer the server's supported ALPN protocols (see stream_handler_factory.supported_protocols())
- Check that server-side TLS config advertises the factory's ALPNs (server_config with alpn_protocols)
- Verify client quic/tls library sends ALPN in the ClientHello
Example fix
// client, before let mut client = quinn::ClientConfig::new(crypto); // after let mut transport = quinn::TransportConfig::default(); let mut client = quinn::ClientConfig::new(crypto); client.alpn_protocols = vec![b"lore/1".to_vec()];
Defensive patterns
Strategy: validation
Validate before calling
// client side: ensure ALPN offered before connecting assert!(!client_config.alpn_protocols.is_empty(), "client must offer at least one ALPN");
Try / catch
match get_protocol(&connection) {
Err(e) if e.to_string().contains("No protocol found") => {
warn!("client offered no ALPN; rejecting");
return Ok(());
}
r => r?,
} Prevention
- Document required ALPNs for clients and validate in client SDKs
- Keep server and client ALPN lists in sync across releases
- Test connectivity with a client that has ALPN disabled to confirm graceful handling
When it happens
Trigger: A client connects without offering any ALPN identifiers, or offers none that the server advertised, so no protocol is selected during the handshake.
Common situations: Raw QUIC clients (e.g. test scripts, curl --http3 with ALPN disabled) connecting without setting ALPN; server and client ALPN lists disjoint so negotiation yields nothing; misconfigured client TLS settings.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- No alpns provided
- No handshake data
- Failed to decode protocol
- Received connection for unsupported protocol
- Missing QUIC certificate config
AI-assisted analysis of EpicGames/lore@074eb0b0d1 (2026-09-13).
Data as JSON: /api/errors/4575bf3a91a223fe.
Report an issue: GitHub.
Appendix: source
Thrown at lore-server/src/quic/quinn/quinn_server.rs:262
)
);
}
Ok(())
}
fn get_protocol(connection: &quinn::Connection) -> Result<String, anyhow::Error> {
let handshake_data = connection
.handshake_data()
.and_then(|h| h.downcast::<HandshakeData>().ok())
.ok_or(anyhow!("No handshake data"))?;
handshake_data
.protocol
.map(String::from_utf8)
.transpose()
.map_err(|e| anyhow!("Failed to decode protocol: {e:?}"))?
.ok_or(anyhow!("No protocol found on request"))
}
#[tracing::instrument(
name = "urc-quic",
skip_all,
fields(connection_id, protocol, correlation_id, repository_id)
)]
async fn handle_conn(
conn: quinn::Incoming,
monitor: TaskMonitor,
connection_metrics_interval: Duration,
stream_handler_factory: Arc<Box<dyn StreamHandlerFactory>>,
) -> anyhow::Result<()> {
let connection = conn.await?;
let protocol = get_protocol(&connection)?;
let connection_id = connection.stable_id();View on GitHub (pinned to 074eb0b0d1)