github.com/xmplusdev/xray-core@v1.8.10/transport/internet/grpc/config.go (about) 1 package grpc 2 3 import ( 4 "net/url" 5 "strings" 6 7 "github.com/xmplusdev/xray-core/common" 8 "github.com/xmplusdev/xray-core/transport/internet" 9 ) 10 11 const protocolName = "grpc" 12 13 func init() { 14 common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { 15 return new(Config) 16 })) 17 } 18 19 func (c *Config) getServiceName() string { 20 // Normal old school config 21 if !strings.HasPrefix(c.ServiceName, "/") { 22 return url.PathEscape(c.ServiceName) 23 } 24 25 // Otherwise new custom paths 26 lastIndex := strings.LastIndex(c.ServiceName, "/") 27 if lastIndex < 1 { 28 lastIndex = 1 29 } 30 rawServiceName := c.ServiceName[1:lastIndex] // trim from first to last '/' 31 serviceNameParts := strings.Split(rawServiceName, "/") 32 for i := range serviceNameParts { 33 serviceNameParts[i] = url.PathEscape(serviceNameParts[i]) 34 } 35 return strings.Join(serviceNameParts, "/") 36 } 37 38 func (c *Config) getTunStreamName() string { 39 // Normal old school config 40 if !strings.HasPrefix(c.ServiceName, "/") { 41 return "Tun" 42 } 43 // Otherwise new custom paths 44 endingPath := c.ServiceName[strings.LastIndex(c.ServiceName, "/")+1:] // from the last '/' to end of string 45 return url.PathEscape(strings.Split(endingPath, "|")[0]) 46 } 47 48 func (c *Config) getTunMultiStreamName() string { 49 // Normal old school config 50 if !strings.HasPrefix(c.ServiceName, "/") { 51 return "TunMulti" 52 } 53 // Otherwise new custom paths 54 endingPath := c.ServiceName[strings.LastIndex(c.ServiceName, "/")+1:] // from the last '/' to end of string 55 streamNames := strings.Split(endingPath, "|") 56 if len(streamNames) == 1 { // client side. Service name is the full path to multi tun 57 return url.PathEscape(streamNames[0]) 58 } else { // server side. The second part is the path to multi tun 59 return url.PathEscape(streamNames[1]) 60 } 61 }