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

  1. Configure the client to offer the server's supported ALPN protocols (see stream_handler_factory.supported_protocols())
  2. Check that server-side TLS config advertises the factory's ALPNs (server_config with alpn_protocols)
  3. 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

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


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)