github.com/annwntech/go-micro/v2@v2.9.5/resolver/api/api.go (about) 1 // Package resolver provides a micro rpc resolver which prefixes a namespace 2 package api 3 4 import ( 5 "net/http" 6 7 "github.com/annwntech/go-micro/v2/api/resolver" 8 "github.com/annwntech/go-micro/v2/registry" 9 ) 10 11 // default resolver for legacy purposes 12 // it uses proxy routing to resolve names 13 // /foo becomes namespace.foo 14 // /v1/foo becomes namespace.v1.foo 15 type Resolver struct { 16 Options resolver.Options 17 } 18 19 func (r *Resolver) Resolve(req *http.Request, opts ...resolver.ResolveOption) (*resolver.Endpoint, error) { 20 // parse options 21 options := resolver.NewResolveOptions(opts...) 22 var name, method string 23 24 switch r.Options.Handler { 25 // internal handlers 26 case "meta", "api", "rpc", "micro": 27 name, method = apiRoute(req.URL.Path) 28 default: 29 method = req.Method 30 name = proxyRoute(req.URL.Path) 31 } 32 // append the service prefix, e.g. foo.api 33 if len(r.Options.ServicePrefix) > 0 { 34 name = r.Options.ServicePrefix + "." + "service." + name 35 } 36 37 // check for the namespace in the request header, this can be set by the client or injected 38 // by the auth wrapper if an auth token was provided. The headr takes priority over any domain 39 // passed as a default 40 domain := options.Domain 41 if dom := req.Header.Get("Micro-Namespace"); len(dom) > 0 && dom != domain { 42 domain = dom 43 } else if len(domain) == 0 { 44 domain = registry.DefaultDomain 45 } 46 47 return &resolver.Endpoint{ 48 Name: name, 49 Domain: domain, 50 Method: method, 51 }, nil 52 } 53 54 func (r *Resolver) String() string { 55 return "micro" 56 } 57 58 // NewResolver creates a new micro resolver 59 func NewResolver(opts ...resolver.Option) resolver.Resolver { 60 return &Resolver{ 61 Options: resolver.NewOptions(opts...), 62 } 63 }