{"record":{"id":"c605d80ac10dd641","repo":"grpc/grpc-go","slug":"extproc-parsegrpcserviceconfig-not-implemented","errorCode":null,"errorMessage":"extproc: ParseGRPCServiceConfig not implemented","messagePattern":"extproc: ParseGRPCServiceConfig not implemented","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/httpfilter/extproc/internal/internal.go","lineNumber":43,"sourceCode":"\n\tv3corepb \"github.com/envoyproxy/go-control-plane/envoy/config/core/v3\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/internal/xds/xdsclient/xdsresource\"\n)\n\nvar (\n\t// RegisterForTesting registers the external processor HTTP Filter for testing\n\t// purposes.\n\tRegisterForTesting func()\n\n\t// UnregisterForTesting unregisters the external processor HTTP Filter for\n\t// testing purposes.\n\tUnregisterForTesting func()\n\n\t// ParseGRPCServiceConfig parses the gRPC service configuration from the given\n\t// protobuf message.\n\tParseGRPCServiceConfig = func(*v3corepb.GrpcService) (xdsresource.GRPCServiceConfig, error) {\n\t\treturn xdsresource.GRPCServiceConfig{}, fmt.Errorf(\"extproc: ParseGRPCServiceConfig not implemented\")\n\t}\n\n\t// CreateExtProcChannel creates a gRPC client channel to the external\n\t// processing server.\n\tCreateExtProcChannel = func(xdsresource.GRPCServiceConfig) (grpc.ClientConnInterface, func() error, error) {\n\t\treturn nil, nil, fmt.Errorf(\"extproc: dialing external processor server not implemented\")\n\t}\n\n\t// TimeNowFunc returns the current time.Time, and can be overridden for\n\t// testing purposes.\n\tTimeNowFunc func() time.Time\n\n\t// TimeSinceFunc returns the time elapsed, and can be overridden for testing\n\t// purposes.\n\tTimeSinceFunc func(t time.Time) time.Duration\n)\n","sourceCodeStart":25,"sourceCodeEnd":60,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/httpfilter/extproc/internal/internal.go#L25-L60","documentation":"internal.ParseGRPCServiceConfig is a package-level function variable whose default implementation returns 'not implemented' (internal.go:42). It is an internal override point meant to be assigned by the production wiring of the extproc filter. If you reach this code path without that override being installed, the extproc gRPC-service-config parsing is unavailable.","triggerScenarios":"The extproc filter attempts to parse a GrpcService config from xDS while internal.ParseGRPCServiceConfig still points at the default stub (no production assignment has run).","commonSituations":"Using extproc in a build/test context that does not import the package that wires the real implementation; calling extproc internals directly in a unit test; extproc feature not yet linked into the binary.","solutions":["Ensure the production extproc wiring package (the one that assigns internal.ParseGRPCServiceConfig) is imported/blank-imported by your binary.","Do not construct extproc filters from a context that skips the standard xDS bootstrap that registers the real implementation.","If this is a test, inject a test override that returns a valid GRPCServiceConfig."],"exampleFix":"// before: extproc used without the wiring package imported -> ParseGRPCServiceConfig returns not implemented\n\n// after: blank-import the package that installs the real override\nimport _ \"google.golang.org/grpc/xds/httpfilter/extproc\" // or the wiring entry point in your build","handlingStrategy":"validation","validationCode":"// Verify the override is wired before using extproc\nif internal.ParseGRPCServiceConfig == nil || fmt.Sprint(internal.ParseGRPCServiceConfig) == \"\" {\n    // ensure the wiring package is imported\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Blank-import the extproc wiring package in every binary that uses extproc via xDS.","In tests, override internal.ParseGRPCServiceConfig with a fake rather than relying on the stub.","Fail fast at startup if extproc is configured but the override is the default stub."],"tags":["extproc","grpc","xds","not-implemented","go"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}