{"record":{"id":"010cee6ae05ac3f8","repo":"dagger/dagger","slug":"failed-to-base64-decode-s-w","errorCode":null,"errorMessage":"failed to base64-decode %s: %w","messagePattern":"failed to base64-decode (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/opts.go","lineNumber":217,"sourceCode":"type clientMetadataCtxKey struct{}\n\nfunc ContextWithClientMetadata(ctx context.Context, clientMetadata *ClientMetadata) context.Context {\n\treturn context.WithValue(ctx, clientMetadataCtxKey{}, clientMetadata)\n}\n\nfunc ClientMetadataFromContext(ctx context.Context) (*ClientMetadata, error) {\n\tmd, ok := ctx.Value(clientMetadataCtxKey{}).(*ClientMetadata)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"failed to get client metadata from context\")\n\t}\n\n\treturn md, nil\n}\n\nfunc ClientMetadataFromHTTPHeaders(h http.Header) (*ClientMetadata, error) {\n\tbs, err := base64.StdEncoding.DecodeString(h.Get(ClientMetadataMetaKey))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to base64-decode %s: %w\", ClientMetadataMetaKey, err)\n\t}\n\n\tm := &ClientMetadata{}\n\tif err := json.Unmarshal(bs, m); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to JSON-unmarshal %s: %w\", ClientMetadataMetaKey, err)\n\t}\n\n\tif m.ClientVersion == \"\" {\n\t\t// fallback for old clients that don't send a client version!\n\t\tm.ClientVersion = m.Labels[\"dagger.io/client.version\"]\n\t}\n\tif err := m.normalizeWorkspaceModuleLoading(); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn m, nil\n}\n","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/engine/opts.go#L199-L235","documentation":"ClientMetadataFromHTTPHeaders returns this when the value of the ClientMetadataMetaKey header is not valid standard base64. The client encodes its JSON metadata as base64 in a header; a malformed or missing encoding cannot be decoded.","triggerScenarios":"ServeHTTP / nestedClientMetadataForRequest receive a request whose metadata header is not base64 (corrupted by a proxy, sent as raw JSON, or truncated).","commonSituations":"Reverse proxies or gateways mangling header values; custom clients writing raw JSON instead of base64; older tooling sending a legacy header format.","solutions":["Ensure the client sets the header with base64.StdEncoding.EncodeToString(jsonBytes)","Bypass or reconfigure proxies that rewrite/drop the metadata header","Capture the outgoing request and inspect the header value for corruption or truncation","Upgrade the dagger CLI so it uses the current header encoding"],"exampleFix":"// before\nreq.Header.Set(engine.ClientMetadataMetaKey, string(jsonBytes)) // raw JSON\n// after\nreq.Header.Set(engine.ClientMetadataMetaKey, base64.StdEncoding.EncodeToString(jsonBytes))","handlingStrategy":"validation","validationCode":"v := h.Get(engine.ClientMetadataMetaKey)\nif v == \"\" {\n    return fmt.Errorf(\"missing %s header\", engine.ClientMetadataMetaKey)\n}\nif _, err := base64.StdEncoding.DecodeString(v); err != nil {\n    return fmt.Errorf(\"malformed metadata header: %w\", err)\n}","typeGuard":"func validBase64(s string) bool {\n    _, err := base64.StdEncoding.DecodeString(s)\n    return err == nil\n}","tryCatchPattern":"md, err := engine.ClientMetadataFromHTTPHeaders(h)\nif err != nil {\n    http.Error(w, \"invalid client metadata header\", http.StatusBadRequest)\n    return\n}","preventionTips":["Encode the header with base64.StdEncoding.EncodeToString of the JSON payload","Use ClientMetadataAppendToHTTPHeaders instead of manual header construction","Check intermediary proxies for header rewriting/truncation","Log the offending header (value length, not contents) when debugging"],"tags":["http","base64","metadata"],"backgroundTag":"invalid-header-encoding","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}