diff --git a/transport/internet/grpc/config.go b/transport/internet/grpc/config.go index 4be47ec2..d87722a4 100644 --- a/transport/internet/grpc/config.go +++ b/transport/internet/grpc/config.go @@ -1,6 +1,8 @@ package grpc import ( + "net/url" + "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/transport/internet" ) @@ -12,3 +14,7 @@ func init() { return new(Config) })) } + +func (c *Config) getNormalizedName() string { + return url.PathEscape(c.ServiceName) +} diff --git a/transport/internet/grpc/dial.go b/transport/internet/grpc/dial.go index 8ec79ea4..e1e21b07 100644 --- a/transport/internet/grpc/dial.go +++ b/transport/internet/grpc/dial.go @@ -55,14 +55,14 @@ func dialgRPC(ctx context.Context, dest net.Destination, streamSettings *interne client := encoding.NewGRPCServiceClient(conn) if grpcSettings.MultiMode { newError("using gRPC multi mode").AtDebug().WriteToLog() - grpcService, err := client.(encoding.GRPCServiceClientX).TunMultiCustomName(ctx, grpcSettings.ServiceName) + grpcService, err := client.(encoding.GRPCServiceClientX).TunMultiCustomName(ctx, grpcSettings.getNormalizedName()) if err != nil { return nil, newError("Cannot dial gRPC").Base(err) } return encoding.NewMultiHunkConn(grpcService, nil), nil } - grpcService, err := client.(encoding.GRPCServiceClientX).TunCustomName(ctx, grpcSettings.ServiceName) + grpcService, err := client.(encoding.GRPCServiceClientX).TunCustomName(ctx, grpcSettings.getNormalizedName()) if err != nil { return nil, newError("Cannot dial gRPC").Base(err) } diff --git a/transport/internet/grpc/encoding/customSeviceName.go b/transport/internet/grpc/encoding/customSeviceName.go index d37d61f8..aa098835 100644 --- a/transport/internet/grpc/encoding/customSeviceName.go +++ b/transport/internet/grpc/encoding/customSeviceName.go @@ -39,7 +39,7 @@ func (c *gRPCServiceClient) TunCustomName(ctx context.Context, name string, opts } func (c *gRPCServiceClient) TunMultiCustomName(ctx context.Context, name string, opts ...grpc.CallOption) (GRPCService_TunMultiClient, error) { - stream, err := c.cc.NewStream(ctx, &ServerDesc(name).Streams[0], "/"+name+"/TunMulti", opts...) + stream, err := c.cc.NewStream(ctx, &ServerDesc(name).Streams[1], "/"+name+"/TunMulti", opts...) if err != nil { return nil, err } diff --git a/transport/internet/grpc/hub.go b/transport/internet/grpc/hub.go index 3ca87837..a2a5ce40 100644 --- a/transport/internet/grpc/hub.go +++ b/transport/internet/grpc/hub.go @@ -123,7 +123,7 @@ func Listen(ctx context.Context, address net.Address, port net.Port, settings *i } } - encoding.RegisterGRPCServiceServerX(s, listener, grpcSettings.ServiceName) + encoding.RegisterGRPCServiceServerX(s, listener, grpcSettings.getNormalizedName()) if err = s.Serve(streamListener); err != nil { newError("Listener for gRPC ended").Base(err).WriteToLog()