{"record":{"id":"d735803f50196e5b","repo":"grpc/grpc-go","slug":"external-processor-sent-an-immediate-response-but","errorCode":null,"errorMessage":"external processor sent an immediate response but immediate responses are disabled in configuration","messagePattern":"external processor sent an immediate response but immediate responses are disabled in configuration","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/xds/httpfilter/extproc/ext_proc.go","lineNumber":1571,"sourceCode":"\t// external processor.\n\toutgoingMD, _ := metadata.FromOutgoingContext(ctx)\n\tif outgoingMD == nil {\n\t\toutgoingMD = metadata.MD{}\n\t}\n\tif err = cs.applyMutations(header.GetResponse().GetHeaderMutation(), outgoingMD); err != nil {\n\t\tcs.handleHeaderError(err, newStream, opts)\n\t\treturn false\n\t}\n\tdataplaneCtx := metadata.NewOutgoingContext(ctx, outgoingMD)\n\tif err = cs.createDataplaneStream(dataplaneCtx, newStream, opts); err != nil {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (cs *clientStream) handleImmediateResponse(imm *v3procservicepb.ImmediateResponse, newStream func(context.Context, ...grpc.CallOption) (grpc.ClientStream, error), opts []grpc.CallOption) {\n\tif cs.config.disableImmediateResponse {\n\t\terr := fmt.Errorf(\"external processor sent an immediate response but immediate responses are disabled in configuration\")\n\t\tif cs.dataplaneStream == nil {\n\t\t\tcs.handleHeaderError(err, newStream, opts)\n\t\t} else {\n\t\t\tcs.failProcStream(err)\n\t\t}\n\t\treturn\n\t}\n\n\tstatusCode := codes.Internal\n\tif imm.GetGrpcStatus() != nil {\n\t\tstatusCode = codes.Code(imm.GetGrpcStatus().GetStatus())\n\t\tif statusCode > codes.Code(16) {\n\t\t\tstatusCode = codes.Unknown\n\t\t}\n\t}\n\terr := status.Error(statusCode, imm.GetDetails())\n\n\tif cs.trailerSent.Load() {","sourceCodeStart":1553,"sourceCodeEnd":1589,"githubUrl":"https://github.com/grpc/grpc-go/blob/03255a9237b6eb32710f6bc4f2de9a675b99fe36/internal/xds/httpfilter/extproc/ext_proc.go#L1553-L1589","documentation":"The extproc filter can be configured to disable immediate responses (disableImmediateResponse). If the server then sends a ProcessingResponse with an ImmediateResponse set, the filter cannot honor it and treats it as an error (ext_proc.go:1570), failing or bypassing the stream.","triggerScenarios":"xDS extproc config sets disable_immediate_response = true, and the external processor sends a ProcessingResponse whose immediate_response field is populated.","commonSituations":"Operator enabled disable_immediate_response for safety/forward-compat while the deployed server still emits immediate responses; mismatch between the negotiated contract and server behavior; copy-pasted filter config from another environment.","solutions":["Align configuration and server behavior: either set disable_immediate_response=false in the extproc filter config, or stop the server from sending ImmediateResponse messages.","Roll the extproc server to a version that respects the negotiated 'no immediate responses' contract.","While migrating, set failure_mode_allow=true to avoid failing RPCs."],"exampleFix":"// before: config disables immediate responses, server sends one\nfilterConfig.DisableImmediateResponse = true\n// server: stream.Send(&procservicepb.ProcessingResponse{Response: &procservicepb.ProcessingResponse_ImmediateResponse{...}})\n\n// after: allow immediate responses, or have the server avoid them\nfilterConfig.DisableImmediateResponse = false","handlingStrategy":"validation","validationCode":"// Before enabling the filter, ensure config and server agree on immediate responses\nif serverMaySendImmediateResponse {\n    filterConfig.DisableImmediateResponse = false\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep disable_immediate_response consistent with the deployed extproc server's behavior.","Set failure_mode_allow during migration periods.","Document the contract in your filter config so operators don't flip the flag blindly."],"tags":["extproc","grpc","xds","config","protocol","go"],"analyzedSha":"03255a9237b6eb32710f6bc4f2de9a675b99fe36","analyzedAt":"2026-08-07T00:29:34.215Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}