Dynamic Namespace
This commit is contained in:
parent
27eb7db1c2
commit
4ff959ef50
@ -58,7 +58,7 @@ func testHttp(t *testing.T, path, service, ns string) {
|
|||||||
router.WithHandler("http"),
|
router.WithHandler("http"),
|
||||||
router.WithRegistry(r),
|
router.WithRegistry(r),
|
||||||
router.WithResolver(vpath.NewResolver(
|
router.WithResolver(vpath.NewResolver(
|
||||||
resolver.WithNamespace(ns),
|
resolver.WithNamespace(resolver.StaticNamespace(ns)),
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -1,11 +1,22 @@
|
|||||||
package resolver
|
package resolver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/micro/go-micro/v2/auth"
|
||||||
|
)
|
||||||
|
|
||||||
// NewOptions returns new initialised options
|
// NewOptions returns new initialised options
|
||||||
func NewOptions(opts ...Option) Options {
|
func NewOptions(opts ...Option) Options {
|
||||||
var options Options
|
var options Options
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
o(&options)
|
o(&options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.Namespace == nil {
|
||||||
|
options.Namespace = StaticNamespace(auth.DefaultNamespace)
|
||||||
|
}
|
||||||
|
|
||||||
return options
|
return options
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -16,8 +27,8 @@ func WithHandler(h string) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithNamespace sets the namespace being used
|
// WithNamespace sets the function which determines the namespace for a request
|
||||||
func WithNamespace(n string) Option {
|
func WithNamespace(n func(*http.Request) string) Option {
|
||||||
return func(o *Options) {
|
return func(o *Options) {
|
||||||
o.Namespace = n
|
o.Namespace = n
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,10 @@ func (r *Resolver) Resolve(req *http.Request) (*resolver.Endpoint, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
parts := strings.Split(req.URL.Path[1:], "/")
|
parts := strings.Split(req.URL.Path[1:], "/")
|
||||||
|
ns := r.opts.Namespace(req)
|
||||||
|
|
||||||
return &resolver.Endpoint{
|
return &resolver.Endpoint{
|
||||||
Name: r.opts.Namespace + "." + parts[0],
|
Name: ns + "." + parts[0],
|
||||||
Host: req.Host,
|
Host: req.Host,
|
||||||
Method: req.Method,
|
Method: req.Method,
|
||||||
Path: req.URL.Path,
|
Path: req.URL.Path,
|
||||||
|
@ -31,7 +31,14 @@ type Endpoint struct {
|
|||||||
|
|
||||||
type Options struct {
|
type Options struct {
|
||||||
Handler string
|
Handler string
|
||||||
Namespace string
|
Namespace func(*http.Request) string
|
||||||
}
|
}
|
||||||
|
|
||||||
type Option func(o *Options)
|
type Option func(o *Options)
|
||||||
|
|
||||||
|
// StaticNamespace returns the same namespace for each request
|
||||||
|
func StaticNamespace(ns string) func(*http.Request) string {
|
||||||
|
return func(*http.Request) string {
|
||||||
|
return ns
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -33,7 +33,7 @@ func (r *Resolver) Resolve(req *http.Request) (*resolver.Endpoint, error) {
|
|||||||
parts := strings.Split(req.URL.Path[1:], "/")
|
parts := strings.Split(req.URL.Path[1:], "/")
|
||||||
if len(parts) == 1 {
|
if len(parts) == 1 {
|
||||||
return &resolver.Endpoint{
|
return &resolver.Endpoint{
|
||||||
Name: addNamespace(r.opts.Namespace, parts...),
|
Name: r.withNamespace(req, parts...),
|
||||||
Host: req.Host,
|
Host: req.Host,
|
||||||
Method: req.Method,
|
Method: req.Method,
|
||||||
Path: req.URL.Path,
|
Path: req.URL.Path,
|
||||||
@ -43,7 +43,7 @@ func (r *Resolver) Resolve(req *http.Request) (*resolver.Endpoint, error) {
|
|||||||
// /v1/foo
|
// /v1/foo
|
||||||
if re.MatchString(parts[0]) {
|
if re.MatchString(parts[0]) {
|
||||||
return &resolver.Endpoint{
|
return &resolver.Endpoint{
|
||||||
Name: addNamespace(r.opts.Namespace, parts[0:2]...),
|
Name: r.withNamespace(req, parts[0:2]...),
|
||||||
Host: req.Host,
|
Host: req.Host,
|
||||||
Method: req.Method,
|
Method: req.Method,
|
||||||
Path: req.URL.Path,
|
Path: req.URL.Path,
|
||||||
@ -51,7 +51,7 @@ func (r *Resolver) Resolve(req *http.Request) (*resolver.Endpoint, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &resolver.Endpoint{
|
return &resolver.Endpoint{
|
||||||
Name: addNamespace(r.opts.Namespace, parts[0]),
|
Name: r.withNamespace(req, parts[0]),
|
||||||
Host: req.Host,
|
Host: req.Host,
|
||||||
Method: req.Method,
|
Method: req.Method,
|
||||||
Path: req.URL.Path,
|
Path: req.URL.Path,
|
||||||
@ -62,9 +62,11 @@ func (r *Resolver) String() string {
|
|||||||
return "path"
|
return "path"
|
||||||
}
|
}
|
||||||
|
|
||||||
func addNamespace(ns string, parts ...string) string {
|
func (r *Resolver) withNamespace(req *http.Request, parts ...string) string {
|
||||||
|
ns := r.opts.Namespace(req)
|
||||||
if len(ns) == 0 {
|
if len(ns) == 0 {
|
||||||
return strings.Join(parts, ".")
|
return strings.Join(parts, ".")
|
||||||
}
|
}
|
||||||
|
|
||||||
return strings.Join(append([]string{ns}, parts...), ".")
|
return strings.Join(append([]string{ns}, parts...), ".")
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user