From 1e796ea75fea128208220010f2536bd8203d43c8 Mon Sep 17 00:00:00 2001 From: Mikhail Katychev Date: Tue, 29 Sep 2020 17:35:17 -0500 Subject: [PATCH] propagate reflection status error --- cmd/grpcurl/grpcurl.go | 6 +++++- invoke.go | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cmd/grpcurl/grpcurl.go b/cmd/grpcurl/grpcurl.go index aa1d040..58d177f 100644 --- a/cmd/grpcurl/grpcurl.go +++ b/cmd/grpcurl/grpcurl.go @@ -695,7 +695,11 @@ func main() { err = grpcurl.InvokeRPC(ctx, descSource, cc, symbol, append(addlHeaders, rpcHeaders...), h, rf.Next) if err != nil { - fail(err, "Error invoking method %q", symbol) + if errStatus, ok := status.FromError(err); ok { + h.Status = errStatus + } else { + fail(err, "Error invoking method %q", symbol) + } } reqSuffix := "" respSuffix := "" diff --git a/invoke.go b/invoke.go index d2f16cb..13fb219 100644 --- a/invoke.go +++ b/invoke.go @@ -93,11 +93,16 @@ func InvokeRPC(ctx context.Context, source DescriptorSource, ch grpcdynamic.Chan if svc == "" || mth == "" { return fmt.Errorf("given method name %q is not in expected format: 'service/method' or 'service.method'", methodName) } + dsc, err := source.FindSymbol(svc) if err != nil { if isNotFoundError(err) { return fmt.Errorf("target server does not expose service %q", svc) } + // return the error unstringified if it is a gRPC status.Status error + if _, ok := status.FromError(err); ok { + return err + } return fmt.Errorf("failed to query for service descriptor %q: %v", svc, err) } sd, ok := dsc.(*desc.ServiceDescriptor)