{"record":{"id":"6dadf6a586a396e8","repo":"grpc/grpc-go","slug":"filter-missing-name-field","errorCode":null,"errorMessage":"filter missing name field","messagePattern":"filter missing name field","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/xdsclient/xdsresource/unmarshal_lds.go","lineNumber":219,"sourceCode":"\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"filter override %q: %v\", name, err)\n\t\t}\n\t\tif httpFilter == nil {\n\t\t\t// Optional configs are ignored.\n\t\t\tcontinue\n\t\t}\n\t\tm[name] = config\n\t}\n\treturn m, nil\n}\n\nfunc processHTTPFilters(filters []*v3httppb.HttpFilter, server bool) ([]HTTPFilter, error) {\n\tret := make([]HTTPFilter, 0, len(filters))\n\tseenNames := make(map[string]bool, len(filters))\n\tfor _, filter := range filters {\n\t\tname := filter.GetName()\n\t\tif name == \"\" {\n\t\t\treturn nil, errors.New(\"filter missing name field\")\n\t\t}\n\t\tif seenNames[name] {\n\t\t\treturn nil, fmt.Errorf(\"duplicate filter name %q\", name)\n\t\t}\n\t\tseenNames[name] = true\n\n\t\thttpFilter, config, err := validateHTTPFilterConfig(filter.GetTypedConfig(), true, filter.GetIsOptional())\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif httpFilter == nil {\n\t\t\t// Optional configs are ignored.\n\t\t\tcontinue\n\t\t}\n\t\tif server {\n\t\t\tif _, ok := httpFilter.(httpfilter.ServerFilterBuilder); !ok {\n\t\t\t\tif filter.GetIsOptional() {\n\t\t\t\t\tcontinue","sourceCodeStart":201,"sourceCodeEnd":237,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/xdsclient/xdsresource/unmarshal_lds.go#L201-L237","documentation":"Returned by processHTTPFilters (unmarshal_lds.go:218-219) when an HTTP filter in an LDS listener has an empty name. Every HTTP filter in the chain must be uniquely named (used for per-filter config overrides and ordering), so a blank name is rejected before any further validation. A duplicate-name check follows immediately after.","triggerScenarios":"An LDS listener configuration lists an HttpFilter whose name field is unset/empty. processHTTPFilters iterates the filters, reads filter.GetName(), and on \"\" returns this error, NACKing the listener.","commonSituations":"Control-plane templating that left a filter unnamed; a copy-paste that dropped the name; a test fixture with an incomplete filter definition.","solutions":["Give every HTTP filter in the LDS config a unique non-empty name.","If generating the listener config, assert each filter has a name before publishing.","Audit the listener resource for empty-name filters and remove or name them."],"exampleFix":"// before\n//   http_filters: [ { typed_config: {...} } ]   // no name\n// after\n//   http_filters: [ { name: \"rbac-filter\", typed_config: {...} } ]","handlingStrategy":"validation","validationCode":"func httpFiltersAllNamed(filters []*v3httppb.HttpFilter) error {\n    seen := map[string]bool{}\n    for _, f := range filters {\n        if f.GetName() == \"\" {\n            return errors.New(\"HTTP filter missing name\")\n        }\n        if seen[f.GetName()] {\n            return fmt.Errorf(\"duplicate HTTP filter name %q\", f.GetName())\n        }\n        seen[f.GetName()] = true\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Name every HTTP filter uniquely in LDS configs.","Lint listener configs for empty/duplicate filter names before publishing.","Use stable, descriptive filter names for easier per-filter overrides."],"tags":["xds","lds","http-filter","config","validation"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}