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  }