mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-11-04 11:22:10 +08:00
feat 新增消息拦截过滤上下文的复制功能
This commit is contained in:
parent
f1229be04c
commit
62b76f06c8
@ -4,11 +4,31 @@ import (
|
|||||||
rpcChat "Open_IM/internal/rpc/msg"
|
rpcChat "Open_IM/internal/rpc/msg"
|
||||||
"Open_IM/pkg/common/constant"
|
"Open_IM/pkg/common/constant"
|
||||||
pbChat "Open_IM/pkg/proto/chat"
|
pbChat "Open_IM/pkg/proto/chat"
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func MockBeforeSendFilter1(ctx *rpcChat.SendContext, pb *pbChat.SendMsgReq) (*pbChat.SendMsgResp, bool, error) {
|
func MockBeforeSendFilter1(ctx *rpcChat.SendContext, pb *pbChat.SendMsgReq) (*pbChat.SendMsgResp, bool, error) {
|
||||||
|
|
||||||
|
cp := ctx.Copy()
|
||||||
|
|
||||||
|
// 假设这里我们发起一次rpc,超时时间 1s
|
||||||
|
sc, cancel := context.WithTimeout(cp, time.Second*1)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
sc.Value("ss") // 无意义,只是为了不报错
|
||||||
|
|
||||||
|
// callRpc(sc,pb)
|
||||||
|
|
||||||
|
// other logic
|
||||||
|
// doOther()
|
||||||
|
|
||||||
|
// 模拟处理时间
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
|
||||||
|
// mock 将一些需要的数据放入ctx,供后续其他拦截过滤器使用
|
||||||
ctxKey := "test_key"
|
ctxKey := "test_key"
|
||||||
v := true
|
v := true
|
||||||
// fmt.Printf("MockBeforeSendFilter1:%s set value to ctx,value is :%v\n", ctxKey, v)
|
// fmt.Printf("MockBeforeSendFilter1:%s set value to ctx,value is :%v\n", ctxKey, v)
|
||||||
@ -19,13 +39,14 @@ func MockBeforeSendFilter1(ctx *rpcChat.SendContext, pb *pbChat.SendMsgReq) (*pb
|
|||||||
|
|
||||||
// MockBeforeSendFilter is a mock handle that handles custom logic before send msg.
|
// MockBeforeSendFilter is a mock handle that handles custom logic before send msg.
|
||||||
func MockBeforeSendFilter2(ctx *rpcChat.SendContext, pb *pbChat.SendMsgReq) (*pbChat.SendMsgResp, bool, error) {
|
func MockBeforeSendFilter2(ctx *rpcChat.SendContext, pb *pbChat.SendMsgReq) (*pbChat.SendMsgResp, bool, error) {
|
||||||
|
// 取出放进去的测试数据
|
||||||
ctxKey := "test_key"
|
ctxKey := "test_key"
|
||||||
v, ok := ctx.Value(ctxKey).(bool)
|
v, ok := ctx.Value(ctxKey).(bool)
|
||||||
if ok {
|
if ok {
|
||||||
fmt.Printf("MockBeforeSendFilter2:%s selected from ctx,value is :%v\n", ctxKey, v)
|
fmt.Printf("MockBeforeSendFilter2:%s selected from ctx,value is :%v\n", ctxKey, v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// fmt.Printf("MockBeforeSendHandler trigger,contentType:%d\n", pb.MsgData.GetContentType())
|
fmt.Printf("MockBeforeSendFilter2 trigger,contentType:%d\n", pb.MsgData.GetContentType())
|
||||||
if pb.MsgData.ContentType == constant.Text {
|
if pb.MsgData.ContentType == constant.Text {
|
||||||
msg := string(pb.MsgData.Content)
|
msg := string(pb.MsgData.Content)
|
||||||
// fmt.Printf("text msg:%s\n", msg)
|
// fmt.Printf("text msg:%s\n", msg)
|
||||||
|
|||||||
@ -95,6 +95,19 @@ func (c *SendContext) WithValue(key, val interface{}) {
|
|||||||
c.SetCtx(ctx)
|
c.SetCtx(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy returns a copy of the current context that can be safely used outside the request's scope.
|
||||||
|
// This has to be used when the context has to be passed to a goroutine or wrapped by WithTimeout etc.
|
||||||
|
func (c *SendContext) Copy() *SendContext {
|
||||||
|
cp := SendContext{
|
||||||
|
ctx: c.ctx,
|
||||||
|
rpc: c.rpc,
|
||||||
|
beforeFilters: c.beforeFilters,
|
||||||
|
afterSenders: c.afterSenders,
|
||||||
|
}
|
||||||
|
|
||||||
|
return &cp
|
||||||
|
}
|
||||||
|
|
||||||
/************************************/
|
/************************************/
|
||||||
/***** context *****/
|
/***** context *****/
|
||||||
/************************************/
|
/************************************/
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user