add PreCall and PostCall plugins of server

This commit is contained in:
smallnest
2020-05-12 20:28:15 +08:00
parent 60ffe5d5ba
commit 691cb10a34
2 changed files with 50 additions and 0 deletions

View File

@@ -26,6 +26,8 @@ type PluginContainer interface {
DoPostReadRequest(ctx context.Context, r *protocol.Message, e error) error DoPostReadRequest(ctx context.Context, r *protocol.Message, e error) error
DoPreHandleRequest(ctx context.Context, req *protocol.Message) error DoPreHandleRequest(ctx context.Context, req *protocol.Message) error
DoPreCall(ctx context.Context, args interface{}) (interface{}, error)
DoPostCall(ctx context.Context, args, reply interface{}) (interface{}, error)
DoPreWriteResponse(context.Context, *protocol.Message, *protocol.Message) error DoPreWriteResponse(context.Context, *protocol.Message, *protocol.Message) error
DoPostWriteResponse(context.Context, *protocol.Message, *protocol.Message, error) error DoPostWriteResponse(context.Context, *protocol.Message, *protocol.Message, error) error
@@ -77,6 +79,14 @@ type (
PreHandleRequest(ctx context.Context, r *protocol.Message) error PreHandleRequest(ctx context.Context, r *protocol.Message) error
} }
PreCallPlugin interface {
PreCall(ctx context.Context, args interface{}) (interface{}, error)
}
PostCallPlugin interface {
PostCall(ctx context.Context, args, reply interface{}) (interface{}, error)
}
//PreWriteResponsePlugin represents . //PreWriteResponsePlugin represents .
PreWriteResponsePlugin interface { PreWriteResponsePlugin interface {
PreWriteResponse(context.Context, *protocol.Message, *protocol.Message) error PreWriteResponse(context.Context, *protocol.Message, *protocol.Message) error
@@ -253,6 +263,36 @@ func (p *pluginContainer) DoPreHandleRequest(ctx context.Context, r *protocol.Me
return nil return nil
} }
// DoPreCall invokes PreCallPlugin plugin.
func (p *pluginContainer) DoPreCall(ctx context.Context, args interface{}) (interface{}, error) {
var err error
for i := range p.plugins {
if plugin, ok := p.plugins[i].(PreCallPlugin); ok {
args, err = plugin.PreCall(ctx, args)
if err != nil {
return args, err
}
}
}
return args, err
}
// DoPostCall invokes PostCallPlugin plugin.
func (p *pluginContainer) DoPostCall(ctx context.Context, args, reply interface{}) (interface{}, error) {
var err error
for i := range p.plugins {
if plugin, ok := p.plugins[i].(PostCallPlugin); ok {
reply, err = plugin.PostCall(ctx, args, reply)
if err != nil {
return reply, err
}
}
}
return reply, err
}
// DoPreWriteResponse invokes PreWriteResponse plugin. // DoPreWriteResponse invokes PreWriteResponse plugin.
func (p *pluginContainer) DoPreWriteResponse(ctx context.Context, req *protocol.Message, res *protocol.Message) error { func (p *pluginContainer) DoPreWriteResponse(ctx context.Context, req *protocol.Message, res *protocol.Message) error {
for i := range p.plugins { for i := range p.plugins {

View File

@@ -529,12 +529,22 @@ func (s *Server) handleRequest(ctx context.Context, req *protocol.Message) (res
replyv := argsReplyPools.Get(mtype.ReplyType) replyv := argsReplyPools.Get(mtype.ReplyType)
argv, err = s.Plugins.DoPreCall(ctx, argv)
if err != nil {
argsReplyPools.Put(mtype.ReplyType, replyv)
return handleError(res, err)
}
if mtype.ArgType.Kind() != reflect.Ptr { if mtype.ArgType.Kind() != reflect.Ptr {
err = service.call(ctx, mtype, reflect.ValueOf(argv).Elem(), reflect.ValueOf(replyv)) err = service.call(ctx, mtype, reflect.ValueOf(argv).Elem(), reflect.ValueOf(replyv))
} else { } else {
err = service.call(ctx, mtype, reflect.ValueOf(argv), reflect.ValueOf(replyv)) err = service.call(ctx, mtype, reflect.ValueOf(argv), reflect.ValueOf(replyv))
} }
if err == nil {
replyv, err = s.Plugins.DoPostCall(ctx, argv, replyv)
}
argsReplyPools.Put(mtype.ArgType, argv) argsReplyPools.Put(mtype.ArgType, argv)
if err != nil { if err != nil {
argsReplyPools.Put(mtype.ReplyType, replyv) argsReplyPools.Put(mtype.ReplyType, replyv)