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  }