mirror of
				https://github.com/smallnest/rpcx.git
				synced 2025-11-01 03:42:38 +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
	 smallnest
					smallnest