github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/service/api/server/resolver.go (about) 1 package server 2 3 import ( 4 "net/http" 5 6 "github.com/tickoalcantara12/micro/v3/service/api/resolver" 7 "github.com/tickoalcantara12/micro/v3/service/registry" 8 ) 9 10 // default resolver for legacy purposes 11 // it uses proxy routing to resolve names 12 // /foo becomes namespace.foo 13 // /v1/foo becomes namespace.v1.foo 14 type apiResolver struct { 15 opts resolver.Options 16 } 17 18 func (r *apiResolver) Resolve(req *http.Request, opts ...resolver.ResolveOption) (*resolver.Endpoint, error) { 19 options := resolver.NewResolveOptions(opts...) 20 21 var name, method string 22 23 switch r.opts.Handler { 24 // internal handlers 25 case "meta", "api", "rpc", "micro": 26 name, method = apiRoute(req.URL.Path) 27 default: 28 method = req.Method 29 name = proxyRoute(req.URL.Path) 30 } 31 32 // append the service prefix, e.g. foo.api 33 if len(r.opts.ServicePrefix) > 0 { 34 name = r.opts.ServicePrefix + "." + 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 *apiResolver) String() string { 55 return "micro" 56 } 57 58 // NewResolver creates a new micro resolver 59 func NewResolver(opts ...resolver.Option) resolver.Resolver { 60 return &apiResolver{ 61 opts: resolver.NewOptions(opts...), 62 } 63 }