diff --git a/cmd/grpcurl/grpcurl.go b/cmd/grpcurl/grpcurl.go index 80f87bf..eb02e27 100644 --- a/cmd/grpcurl/grpcurl.go +++ b/cmd/grpcurl/grpcurl.go @@ -483,12 +483,12 @@ func main() { if *maxMsgSz > 0 { opts = append(opts, grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(*maxMsgSz))) } - network := "tcp" - if isUnixSocket != nil && isUnixSocket() { - network = "unix" - if *authority == "" { - *authority = "localhost" - } + if isUnixSocket != nil && isUnixSocket() && !strings.HasPrefix(target, "unix://") { + // prepend unix:// to the address if it's not already there + // this is to maintain backwards compatibility because the custom dialer is replaced by + // the default dialer in grpc-go. + // https://github.com/fullstorydev/grpcurl/pull/480 + target = "unix://" + target } var creds credentials.TransportCredentials if *plaintext { @@ -556,7 +556,7 @@ func main() { blockingDialTiming := dialTiming.Child("BlockingDial") defer blockingDialTiming.Done() - cc, err := grpcurl.BlockingDial(ctx, network, target, creds, opts...) + cc, err := grpcurl.BlockingDial(ctx, "", target, creds, opts...) if err != nil { fail(err, "Failed to dial target host %q", target) } diff --git a/grpcurl.go b/grpcurl.go index 9c8b08b..7cdd7ae 100644 --- a/grpcurl.go +++ b/grpcurl.go @@ -645,6 +645,34 @@ func BlockingDial(ctx context.Context, network, address string, creds credential writeResult: writeResult, } + switch network { + case "": + // no-op, use address as-is + case "tcp": + if strings.HasPrefix(address, "unix://") { + return nil, fmt.Errorf("tcp network type cannot use unix address %s", address) + } + case "unix": + if !strings.HasPrefix(address, "unix://") { + // prepend unix:// to the address if it's not already there + // this is to maintain backwards compatibility because the custom dialer is replaced by + // the default dialer in grpc-go. + // https://github.com/fullstorydev/grpcurl/pull/480 + address = "unix://" + address + } + default: + // custom dialer for other networks + dialer := func(ctx context.Context, address string) (net.Conn, error) { + conn, err := (&net.Dialer{}).DialContext(ctx, network, address) + if err != nil { + // capture the error so we can provide a better message + writeResult(err) + } + return conn, err + } + opts = append([]grpc.DialOption{grpc.WithContextDialer(dialer)}, opts...) + } + // Even with grpc.FailOnNonTempDialError, this call will usually timeout in // the face of TLS handshake errors. So we can't rely on grpc.WithBlock() to // know when we're done. So we run it in a goroutine and then use result