{"record":{"id":"398edb3a52fe43d8","repo":"jdx/mise","slug":"fetching-manifest-url-failed","errorCode":null,"errorMessage":"fetching {manifest_url} failed: {}","messagePattern":"fetching (.+?) failed: (.+?)","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/oci/registry.rs","lineNumber":812,"sourceCode":"                .get(&manifest_url)\n                .header(\"Accept\", index_accept.join(\", \"));\n            if let Some(a) = auth {\n                rb = rb.header(\"Authorization\", a);\n            }\n            Ok(rb)\n        })\n        .await\n        .wrap_err_with(|| format!(\"fetching {manifest_url}\"))?;\n    match resp.status() {\n        StatusCode::OK => {}\n        // No previous image under this ref (404), or the ref exists but the\n        // registry won't serve it as a single manifest with our Accept\n        // headers — both are just \"no cache\".\n        StatusCode::NOT_FOUND => return Ok(None),\n        // An auth failure here (private repo we can't read) is also a cache\n        // miss rather than a push-stopping error.\n        StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => return Ok(None),\n        s => bail!(\"fetching {manifest_url} failed: {}\", s.as_u16()),\n    }\n    let mut body: serde_json::Value = resp.json().await?;\n    // An index (multi-arch, e.g. a tag maintained with --update-index):\n    // descend into the entry for the build platform so its layers remain\n    // reusable.\n    if body.get(\"manifests\").map(|m| m.is_array()).unwrap_or(false) {\n        // Match the same canonical identity `upsert_platform_manifest` uses,\n        // so descent and upsert agree on which entry represents this host's\n        // platform (arch/os normalized, arm64 variant filled). The host has\n        // no variant / os.version.\n        let host =\n            platform_identity_parts(std::env::consts::ARCH, std::env::consts::OS, None, None);\n        let digest = body\n            .get(\"manifests\")\n            .and_then(|m| m.as_array())\n            .and_then(|entries| {\n                entries.iter().find(|e| {\n                    let p = e.get(\"platform\");","sourceCodeStart":794,"sourceCodeEnd":830,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/oci/registry.rs#L794-L830","documentation":"Thrown by `fetch_remote_image` when probing a previously pushed manifest in the registry returns a non-success status other than 404 (treated as cache miss) or 401/403 (treated as unreadable private repo / cache miss). Any other failing status aborts the push/pull flow.","triggerScenarios":"HEAD/GET of the remote manifest URL during `fetch_remote_image` returning e.g. 429 rate limit, 500 registry error, or 405 method not allowed from a non-compliant registry.","commonSituations":"Docker Hub rate limiting (429) during CI; a registry that doesn't implement HEAD on manifests; transient registry backend errors (5xx); misconfigured reverse proxy in front of a self-hosted registry.","solutions":["Retry after a delay if the status was 429/5xx (rate limit or transient registry error).","Authenticate to raise registry rate limits.","For 405, check the registry's OCI dist-spec compliance or use a compliant registry version.","Inspect proxy/load-balancer configuration for self-hosted registries."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"match fetch_remote_image(tag) {\n    Err(e) if e.to_string().contains(\"429\") || e.to_string().contains(\"50\") => backoff_retry(),\n    Err(e) => return Err(e),\n    ok => ok,\n}","preventionTips":["Authenticate to avoid Docker Hub 429 rate limits.","Avoid treating probe failures as fatal — the code already treats 404/401/403 as cache miss; only unexpected statuses bubble up.","For self-hosted registries, verify HEAD-on-manifest support (dist-spec compliance) before enabling cache checks."],"tags":["network","http","oci","registry","rate-limit"],"backgroundTag":"http-error-response","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}