gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/api/resolver/micro/route.go (about) 1 package micro 2 3 import ( 4 "path" 5 "regexp" 6 "strings" 7 ) 8 9 var ( 10 proxyRe = regexp.MustCompile("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$") 11 versionRe = regexp.MustCompilePOSIX("^v[0-9]+$") 12 ) 13 14 // Translates /foo/bar/zool into api service go.micro.api.foo method Bar.Zool 15 // Translates /foo/bar into api service go.micro.api.foo method Foo.Bar 16 func apiRoute(p string) (string, string) { 17 p = path.Clean(p) 18 p = strings.TrimPrefix(p, "/") 19 parts := strings.Split(p, "/") 20 21 // If we've got two or less parts 22 // Use first part as service 23 // Use all parts as method 24 if len(parts) <= 2 { 25 name := parts[0] 26 return name, methodName(parts) 27 } 28 29 // Treat /v[0-9]+ as versioning where we have 3 parts 30 // /v1/foo/bar => service: v1.foo method: Foo.bar 31 if len(parts) == 3 && versionRe.Match([]byte(parts[0])) { 32 name := strings.Join(parts[:len(parts)-1], ".") 33 return name, methodName(parts[len(parts)-2:]) 34 } 35 36 // Service is everything minus last two parts 37 // Method is the last two parts 38 name := strings.Join(parts[:len(parts)-2], ".") 39 return name, methodName(parts[len(parts)-2:]) 40 } 41 42 func proxyRoute(p string) string { 43 parts := strings.Split(p, "/") 44 if len(parts) < 2 { 45 return "" 46 } 47 48 var service string 49 var alias string 50 51 // /[service]/methods 52 if len(parts) > 2 { 53 // /v1/[service] 54 if versionRe.MatchString(parts[1]) { 55 service = parts[1] + "." + parts[2] 56 alias = parts[2] 57 } else { 58 service = parts[1] 59 alias = parts[1] 60 } 61 // /[service] 62 } else { 63 service = parts[1] 64 alias = parts[1] 65 } 66 67 // check service name is valid 68 if !proxyRe.MatchString(alias) { 69 return "" 70 } 71 72 return service 73 } 74 75 func methodName(parts []string) string { 76 for i, part := range parts { 77 parts[i] = toCamel(part) 78 } 79 80 return strings.Join(parts, ".") 81 } 82 83 func toCamel(s string) string { 84 words := strings.Split(s, "-") 85 var out string 86 for _, word := range words { 87 out += strings.Title(word) 88 } 89 return out 90 }