EpicGames/lore · error

Missing Public QUIC config

Error message

Missing Public QUIC config

What it means

The public QUIC endpoint handler reads `settings.server.quic` and fails with this error when the option is None. The QUIC server cannot bind or configure its handler timeout without this config, so startup of the public QUIC endpoint aborts.

Solutions

  1. Add the `[server.quic]` section (including handler_timeout_seconds if desired) to the settings file.
  2. Remove the public QUIC endpoint from the configured endpoints list if QUIC is not wanted.
  3. Diff the config against the version's example/template config to find the missing section.

Example fix

// before
endpoints = ["quic"]  // no [server.quic]
// after
[server.quic]
bind = "0.0.0.0:4433"
handler_timeout_seconds = 30
Defensive patterns

Strategy: validation

Validate before calling

// Rust: ensure every enabled endpoint has its config section
for ep in &settings.server.endpoints {
    if ep == "quic" && settings.server.quic.is_none() {
        return Err(anyhow!("endpoint 'quic' enabled but [server.quic] is missing"));
    }
}

Prevention

When it happens

Trigger: Configuring the server to launch the public QUIC endpoint (the endpoint list includes QUIC) while `server.quic` is absent from the settings, so `ok_or(anyhow!("Missing Public QUIC config"))` fires.

Common situations: Enabling a QUIC endpoint in the endpoints list but forgetting the matching `[server.quic]` section; copying a partial config between environments; removing the quic section during a config cleanup while QUIC remains enabled.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of EpicGames/lore@074eb0b0d1 (2026-09-13). Data as JSON: /api/errors/9360aba5f01d999b. Report an issue: GitHub.

Appendix: source

Thrown at lore-server/src/server.rs:2018

    // verify_client_certs flag is intentionally false in every shipped
    // config and is not validated here.
    if !is_maintenance
        && let Some(quic_settings) = settings.server.quic.as_ref()
        && quic_settings.enabled
    {
        lore_spawn!(endpoints, {
            let immutable_store = immutable_store.clone();
            let mutable_store = mutable_store.clone();
            let settings = settings.clone();
            let jwt_verifier = jwt_verifier.clone();
            let repository_authorizer = repository_authorizer.clone();
            let user_agent_filter = user_agent_filter.clone();
            let shutdown_rx = _shutdown_rx.clone();

            let quic_settings = settings
                .server
                .quic
                .ok_or(anyhow!("Missing Public QUIC config"))?;
            let request_handler_timeout = quic_settings
                .handler_timeout_seconds
                .map(Duration::from_secs);

            /// With the 8 streams a connection opens this amounts to 4000 commands being
            /// processed in parallel per connection.
            const DEFAULT_STREAM_MESSAGE_LIMIT: usize = 500;
            let process_limit = quic_settings
                .stream_message_limit
                .unwrap_or(DEFAULT_STREAM_MESSAGE_LIMIT);
            let limits = AdmissionLimits {
                process_limit,
                inflight_limit: connection_inflight_limit(&quic_settings, process_limit),
                handler_timeout: request_handler_timeout,
                permit_timeout: quic_settings.permit_timeout_ms.map(Duration::from_millis),
            };

            let local_immutable_store = local_store().unwrap_or_else(|| {

View on GitHub (pinned to 074eb0b0d1)