91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package micro
 | |
| 
 | |
| import (
 | |
| 	"path"
 | |
| 	"regexp"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	proxyRe   = regexp.MustCompile("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$")
 | |
| 	versionRe = regexp.MustCompilePOSIX("^v[0-9]+$")
 | |
| )
 | |
| 
 | |
| // Translates /foo/bar/zool into api service go.micro.api.foo method Bar.Zool
 | |
| // Translates /foo/bar into api service go.micro.api.foo method Foo.Bar
 | |
| func apiRoute(p string) (string, string) {
 | |
| 	p = path.Clean(p)
 | |
| 	p = strings.TrimPrefix(p, "/")
 | |
| 	parts := strings.Split(p, "/")
 | |
| 
 | |
| 	// If we've got two or less parts
 | |
| 	// Use first part as service
 | |
| 	// Use all parts as method
 | |
| 	if len(parts) <= 2 {
 | |
| 		name := parts[0]
 | |
| 		return name, methodName(parts)
 | |
| 	}
 | |
| 
 | |
| 	// Treat /v[0-9]+ as versioning where we have 3 parts
 | |
| 	// /v1/foo/bar => service: v1.foo method: Foo.bar
 | |
| 	if len(parts) == 3 && versionRe.Match([]byte(parts[0])) {
 | |
| 		name := strings.Join(parts[:len(parts)-1], ".")
 | |
| 		return name, methodName(parts[len(parts)-2:])
 | |
| 	}
 | |
| 
 | |
| 	// Service is everything minus last two parts
 | |
| 	// Method is the last two parts
 | |
| 	name := strings.Join(parts[:len(parts)-2], ".")
 | |
| 	return name, methodName(parts[len(parts)-2:])
 | |
| }
 | |
| 
 | |
| func proxyRoute(p string) string {
 | |
| 	parts := strings.Split(p, "/")
 | |
| 	if len(parts) < 2 {
 | |
| 		return ""
 | |
| 	}
 | |
| 
 | |
| 	var service string
 | |
| 	var alias string
 | |
| 
 | |
| 	// /[service]/methods
 | |
| 	if len(parts) > 2 {
 | |
| 		// /v1/[service]
 | |
| 		if versionRe.MatchString(parts[1]) {
 | |
| 			service = parts[1] + "." + parts[2]
 | |
| 			alias = parts[2]
 | |
| 		} else {
 | |
| 			service = parts[1]
 | |
| 			alias = parts[1]
 | |
| 		}
 | |
| 		// /[service]
 | |
| 	} else {
 | |
| 		service = parts[1]
 | |
| 		alias = parts[1]
 | |
| 	}
 | |
| 
 | |
| 	// check service name is valid
 | |
| 	if !proxyRe.MatchString(alias) {
 | |
| 		return ""
 | |
| 	}
 | |
| 
 | |
| 	return service
 | |
| }
 | |
| 
 | |
| func methodName(parts []string) string {
 | |
| 	for i, part := range parts {
 | |
| 		parts[i] = toCamel(part)
 | |
| 	}
 | |
| 
 | |
| 	return strings.Join(parts, ".")
 | |
| }
 | |
| 
 | |
| func toCamel(s string) string {
 | |
| 	words := strings.Split(s, "-")
 | |
| 	var out string
 | |
| 	for _, word := range words {
 | |
| 		out += strings.Title(word)
 | |
| 	}
 | |
| 	return out
 | |
| }
 |