{"record":{"id":"d36a7fe168131931","repo":"amir20/dozzle","slug":"registry-returned-s-for-s","errorCode":null,"errorMessage":"registry returned %s for %s","messagePattern":"registry returned (.+?) for (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/imagecheck/registry.go","lineNumber":111,"sourceCode":"\t}\n\tdefer resp.Body.Close()\n\n\tlog.Debug().\n\t\tStr(\"repository\", ref.Repository).\n\t\tInt(\"status\", resp.StatusCode).\n\t\tStr(\"contentType\", resp.Header.Get(\"Content-Type\")).\n\t\tMsg(\"image update check: manifest response\")\n\n\tswitch resp.StatusCode {\n\tcase http.StatusOK:\n\tcase http.StatusUnauthorized, http.StatusForbidden:\n\t\treturn \"\", ErrAuthRequired\n\tcase http.StatusNotFound:\n\t\treturn \"\", ErrNotFound\n\tcase http.StatusTooManyRequests:\n\t\treturn \"\", ErrRateLimited\n\tdefault:\n\t\treturn \"\", fmt.Errorf(\"registry returned %s for %s\", resp.Status, ref.Repository)\n\t}\n\n\tdigest := resp.Header.Get(\"Docker-Content-Digest\")\n\tif digest == \"\" {\n\t\treturn \"\", fmt.Errorf(\"registry omitted Docker-Content-Digest for %s\", ref.Repository)\n\t}\n\n\tlog.Debug().Str(\"repository\", ref.Repository).Str(\"digest\", digest).Msg(\"image update check: registry digest\")\n\n\treturn digest, nil\n}\n\nfunc (r *Registry) head(ctx context.Context, ref Reference, token string) (*http.Response, error) {\n\treq, err := http.NewRequestWithContext(ctx, http.MethodHead, ref.manifestURL(), nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Accept\", acceptManifests)","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/amir20/dozzle/blob/d9463cbe21874e44ab79db6fa63e746ca7d22928/internal/imagecheck/registry.go#L93-L129","documentation":"Digest queries the registry's manifests endpoint and switches on the response status. Known cases (401, 404, 429) map to sentinel errors; any other non-success status (5xx, 403 with unusual body, unexpected codes) produces this generic error containing the raw status line and repository.","triggerScenarios":"The registry HTTP response status is not one of the handled codes, e.g. 500 from Docker Hub, 503 from a mirror under load, or 403 from a proxy that rejects the request in an unexpected way.","commonSituations":"Docker Hub transient outages (5xx), corporate proxies intercepting registry traffic, self-hosted registries (Harbor, GitLab) misconfigured and returning unusual status codes, or a mirror returning 451/502.","solutions":["Read resp.Status in the error to see the exact code and retry later for 5xx","Check the registry/mirror health and logs","If behind a proxy, verify it forwards registry auth headers and does not rewrite responses","Add retry with backoff for transient 5xx statuses","Consider handling the new status code explicitly in registry.go if it recurs"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"d, err := client.Digest(ref)\nif err != nil {\n    switch {\n    case errors.Is(err, imagecheck.ErrAuthRequired),\n         errors.Is(err, imagecheck.ErrNotFound),\n         errors.Is(err, imagecheck.ErrRateLimited):\n        return handleSentinel(err)\n    default: // includes \"registry returned ...\"\n        return retryWithBackoff(func() error { _, err = client.Digest(ref); return err })\n    }\n}","preventionTips":["Retry 5xx responses with exponential backoff","Monitor registry uptime, especially when relying on mirrors","Keep an explicit mapping for recurring status codes in registry.go"],"tags":["registry","http","digest","image-update"],"backgroundTag":"http-error-response","analyzedSha":"d9463cbe21874e44ab79db6fa63e746ca7d22928","analyzedAt":"2026-09-07T10:08:55.855Z","contentChangedAt":"2026-09-07T10:08:55.855Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}