{"record":{"id":"46a73da842ae7445","repo":"grpc/grpc-go","slug":"router-unexpected-config-override-specified-v","errorCode":null,"errorMessage":"router: unexpected config override specified: %v","messagePattern":"router: unexpected config override specified: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/httpfilter/router/router.go","lineNumber":70,"sourceCode":"\t// The gRPC router filter does not currently use any fields from the\n\t// config.  Verify type only.\n\tif cfg == nil {\n\t\treturn nil, fmt.Errorf(\"router: nil configuration message provided\")\n\t}\n\tm, ok := cfg.(*anypb.Any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"router: error parsing config %v: unknown type %T\", cfg, cfg)\n\t}\n\tmsg := new(pb.Router)\n\tif err := m.UnmarshalTo(msg); err != nil {\n\t\treturn nil, fmt.Errorf(\"router: error parsing config %v: %v\", cfg, err)\n\t}\n\treturn config{}, nil\n}\n\nfunc (builder) ParseFilterConfigOverride(override proto.Message) (httpfilter.FilterConfig, error) {\n\tif override != nil {\n\t\treturn nil, fmt.Errorf(\"router: unexpected config override specified: %v\", override)\n\t}\n\treturn config{}, nil\n}\n\nfunc (builder) IsTerminal() bool {\n\treturn true\n}\n\nfunc (builder) BuildClientFilter(httpfilter.ClientFilterOptions) httpfilter.ClientFilter {\n\treturn filter{}\n}\n\nfunc (builder) BuildServerFilter() httpfilter.ServerFilter {\n\treturn filter{}\n}\n\nvar _ httpfilter.ClientFilterBuilder = builder{}\nvar _ httpfilter.ServerFilterBuilder = builder{}","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/httpfilter/router/router.go#L52-L88","documentation":"The gRPC router filter does not support per-route overrides. ParseFilterConfigOverride rejects any non-nil override message outright.","triggerScenarios":"A RouteConfiguration typed_per_filter_config entry names the router filter with any override value.","commonSituations":"Copy-pasting Envoy config that sets a router override into a gRPC xDS setup; templating that adds per-route config to every filter uniformly.","solutions":["Remove the typed_per_filter_config entry for the router filter from the RouteConfiguration.","If you need per-route behavior, apply overrides to a filter that supports them (e.g. RBAC), not the router."],"exampleFix":"// before (RDS route fragment)\n// typed_per_filter_config:\n//   envoy.filters.http.router:\n//     - name: envoy.filters.http.router\n//       typed_config: { ... }\n//\n// after: delete the router entry entirely","handlingStrategy":"validation","validationCode":"func ensureNoRouterOverride(route *routepb.Route) error {\n\tfor name := range getTypedPerFilterConfig(route) {\n\t\tif name == \"envoy.filters.http.router\" {\n\t\t\treturn fmt.Errorf(\"router filter must not have a per-route override\")\n\t\t}\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never add typed_per_filter_config for the router filter.","Lint RDS resources to reject router overrides before serving."],"tags":["router","xds","grpc","per-route","config-validation"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}