mirror of
https://github.com/smallnest/rpcx.git
synced 2025-11-01 11:52:42 +08:00
add PreCall and PostCall plugins of server
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user