{"record":{"id":"1eebc6c63f261c27","repo":"grpc/grpc-go","slug":"extproc-failed-to-unmarshal-override-v-v","errorCode":null,"errorMessage":"extproc: failed to unmarshal override %v: %v","messagePattern":"extproc: failed to unmarshal override (.+?): (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/httpfilter/extproc/ext_proc.go","lineNumber":180,"sourceCode":"\t\tdisableImmediateResponse: msg.GetDisableImmediateResponse(),\n\t\tobservabilityMode:        msg.GetObservabilityMode(),\n\t\tfailureModeAllow:         msg.GetFailureModeAllow(),\n\t\tserver:                   server,\n\t\tmutationRules:            mutationRules,\n\t\tallowedHeaders:           allowedHeaders,\n\t\tdisallowedHeaders:        disallowedHeaders,\n\t\tdeferredCloseTimeout:     deferredCloseTimeout,\n\t}, nil\n}\n\nfunc (builder) ParseFilterConfigOverride(ov proto.Message) (httpfilter.FilterConfig, error) {\n\tm, ok := ov.(*anypb.Any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"extproc: error parsing override %v: unknown type %T, want *anypb.Any\", ov, ov)\n\t}\n\tmsg := new(v3procfilterpb.ExtProcPerRoute)\n\tif err := m.UnmarshalTo(msg); err != nil {\n\t\treturn nil, fmt.Errorf(\"extproc: failed to unmarshal override %v: %v\", ov, err)\n\t}\n\toverride := msg.GetOverrides()\n\n\tvar processingModesOpt optional.Optional[processingModes]\n\tif pm := override.GetProcessingMode(); pm != nil {\n\t\tif err := validateBodyProcessingMode(pm); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tprocessingModesOpt = optional.New(processingModesFromProto(pm))\n\t}\n\n\tvar serverOpt optional.Optional[xdsresource.GRPCServiceConfig]\n\tif override.GetGrpcService() != nil {\n\t\tserver, err := iextproc.ParseGRPCServiceConfig(override.GetGrpcService())\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"extproc: failed to parse grpc_service: %v\", err)\n\t\t}\n\t\tserverOpt = optional.New(server)","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/httpfilter/extproc/ext_proc.go#L162-L198","documentation":"Raised by ParseFilterConfigOverride when the *anypb.Any decodes fine as a wrapper but UnmarshalTo into v3procfilterpb.ExtProcPerRoute fails. The bytes inside the Any either do not match the ExtProcPerRoute schema or carry a mismatched/incompatible type URL, so the per-route override is rejected.","triggerScenarios":"LDS typed_per_filter_config carries an Any whose @type is not type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute, or whose payload is corrupt/truncated, or that was serialized with an incompatible proto version of ExtProcPerRoute.","commonSituations":"Control plane and client use different versions of go-control-plane so the ExtProcPerRoute field layout differs. A typo in the @type URL. A per-route config meant for a different filter (e.g. router, rbac) accidentally attached under the extproc key.","solutions":["Confirm the Any's type_url equals type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute and matches the client's go-control-plane module version.","Re-serialize the override with the exact ExtProcPerRoute proto the client was built against and redeploy the LDS resource.","If a different filter's override was attached by mistake, move it under the correct per-filter key in the RouteAction.typed_per_filter_config map."],"exampleFix":"// before: control plane emits an override under the wrong @type\n{\"@type\":\"type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ProcessingMode\", ...}\n\n// after\n{\"@type\":\"type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute\", \"overrides\":{...}}","handlingStrategy":"validation","validationCode":"// Verify type URL + round-trip before relying on the override.\nfunc validateOverrideAny(a *anypb.Any) error {\n    want := \"type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute\"\n    if a.GetTypeUrl() != want {\n        return fmt.Errorf(\"wrong type_url %q, want %q\", a.GetTypeUrl(), want)\n    }\n    m := new(v3procfilterpb.ExtProcPerRoute)\n    return a.UnmarshalTo(m)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep the control plane and client on the same go-control-plane module version.","Use the exact @type URL for ExtProcPerRoute in every LDS resource."],"tags":["extproc","xds","config-parsing","protobuf","version-mismatch"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}