diff --git a/grpc/main.go b/grpc/main.go new file mode 100644 index 0000000..1fc6fd7 --- /dev/null +++ b/grpc/main.go @@ -0,0 +1,36 @@ +package grpc + +import ( + "crypto/tls" + "fmt" + "net/url" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +// NewGrpcConnection parses a GRPC endpoint and creates a connection to it +func NewGrpcConnection(endpoint string) (*grpc.ClientConn, error) { + grpcUrl, err := url.Parse(endpoint) + if err != nil { + return nil, err + } + + var secureOpt grpc.DialOption + switch grpcUrl.Scheme { + case "http": + secureOpt = grpc.WithInsecure() + case "https": + creds := credentials.NewTLS(&tls.Config{}) + secureOpt = grpc.WithTransportCredentials(creds) + default: + return nil, fmt.Errorf("unknown grpc url scheme: %s", grpcUrl.Scheme) + } + + grpcConn, err := grpc.Dial(grpcUrl.Host, secureOpt) + if err != nil { + return nil, err + } + + return grpcConn, nil +}