provide HandlerEndpoints
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
parent
4341600c01
commit
eea8ae605b
50
http.go
50
http.go
@ -235,6 +235,56 @@ func (h *httpServer) NewHandler(handler interface{}, opts ...server.HandlerOptio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metadata, ok := options.Context.Value(handlerEndpointsKey{}).([]EndpointMetadata)
|
||||||
|
if !ok {
|
||||||
|
return hdlr
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, md := range metadata {
|
||||||
|
hn := md.Name
|
||||||
|
var method reflect.Method
|
||||||
|
mname := hn[strings.Index(hn, ".")+1:]
|
||||||
|
for m := 0; m < tp.NumMethod(); m++ {
|
||||||
|
mn := tp.Method(m)
|
||||||
|
if mn.Name != mname {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
method = mn
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if method.Name == "" && h.opts.Logger.V(logger.ErrorLevel) {
|
||||||
|
h.opts.Logger.Errorf(h.opts.Context, "nil method for %s", mname)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
mtype, err := prepareEndpoint(method)
|
||||||
|
if err != nil && h.opts.Logger.V(logger.ErrorLevel) {
|
||||||
|
h.opts.Logger.Errorf(h.opts.Context, "%v", err)
|
||||||
|
continue
|
||||||
|
} else if mtype == nil {
|
||||||
|
h.opts.Logger.Errorf(h.opts.Context, "nil mtype for %s", mname)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
rcvr := reflect.ValueOf(handler)
|
||||||
|
name := reflect.Indirect(rcvr).Type().Name()
|
||||||
|
|
||||||
|
pth := &patHandler{mtype: mtype, name: name, rcvr: rcvr}
|
||||||
|
hdlr.name = name
|
||||||
|
|
||||||
|
if err := hdlr.handlers.Insert([]string{md.Method}, md.Path, pth); err != nil {
|
||||||
|
h.opts.Logger.Errorf(h.opts.Context, "cant add handler for %s %s", md.Method, md.Path)
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.registerRPC {
|
||||||
|
h.opts.Logger.Infof(h.opts.Context, "register rpc handler for http.MethodPost %s /%s", hn, hn)
|
||||||
|
if err := hdlr.handlers.Insert([]string{http.MethodPost}, "/"+hn, pth); err != nil {
|
||||||
|
h.opts.Logger.Errorf(h.opts.Context, "cant add rpc handler for http.MethodPost %s /%s", hn, hn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return hdlr
|
return hdlr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
14
options.go
14
options.go
@ -133,10 +133,18 @@ func RegisterRPCHandler(b bool) server.Option {
|
|||||||
return server.SetOption(registerRPCHandlerKey{}, b)
|
return server.SetOption(registerRPCHandlerKey{}, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
type handlerMetadataKey struct{}
|
type handlerEndpointsKey struct{}
|
||||||
|
|
||||||
func HandlerMetadata(md map[string]map[string]map[string]string) server.HandlerOption {
|
type EndpointMetadata struct {
|
||||||
return server.SetHandlerOption(handlerMetadataKey{}, md)
|
Name string
|
||||||
|
Path string
|
||||||
|
Method string
|
||||||
|
Body string
|
||||||
|
Stream bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func HandlerEndpoints(md []EndpointMetadata) server.HandlerOption {
|
||||||
|
return server.SetHandlerOption(handlerEndpointsKey{}, md)
|
||||||
}
|
}
|
||||||
|
|
||||||
type handlerOptions struct {
|
type handlerOptions struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user