feat: server.Server 新增 RegConnectionPacketPreprocessEvent 函数用于对数据包进行预处理操作
This commit is contained in:
parent
e0f43c5bfb
commit
b3e4bb6166
|
@ -24,22 +24,24 @@ type ConnectionOpenedAfterEventHandle func(srv *Server, conn *Conn)
|
||||||
type ConnectionWritePacketBeforeEventHandle func(srv *Server, conn *Conn, packet Packet) Packet
|
type ConnectionWritePacketBeforeEventHandle func(srv *Server, conn *Conn, packet Packet) Packet
|
||||||
type ShuntChannelCreatedEventHandle func(srv *Server, guid int64)
|
type ShuntChannelCreatedEventHandle func(srv *Server, guid int64)
|
||||||
type ShuntChannelClosedEventHandle func(srv *Server, guid int64)
|
type ShuntChannelClosedEventHandle func(srv *Server, guid int64)
|
||||||
|
type ConnectionPacketPreprocessEventHandle func(srv *Server, conn *Conn, packet []byte, abort func(), usePacket func(newPacket []byte))
|
||||||
|
|
||||||
type event struct {
|
type event struct {
|
||||||
*Server
|
*Server
|
||||||
startBeforeEventHandles []StartBeforeEventHandle
|
startBeforeEventHandles []StartBeforeEventHandle
|
||||||
startFinishEventHandles []StartFinishEventHandle
|
startFinishEventHandles []StartFinishEventHandle
|
||||||
stopEventHandles []StopEventHandle
|
stopEventHandles []StopEventHandle
|
||||||
connectionReceivePacketEventHandles []ConnectionReceivePacketEventHandle
|
connectionReceivePacketEventHandles []ConnectionReceivePacketEventHandle
|
||||||
connectionOpenedEventHandles []ConnectionOpenedEventHandle
|
connectionOpenedEventHandles []ConnectionOpenedEventHandle
|
||||||
connectionClosedEventHandles []ConnectionClosedEventHandle
|
connectionClosedEventHandles []ConnectionClosedEventHandle
|
||||||
receiveCrossPacketEventHandles []ReceiveCrossPacketEventHandle
|
receiveCrossPacketEventHandles []ReceiveCrossPacketEventHandle
|
||||||
messageErrorEventHandles []MessageErrorEventHandle
|
messageErrorEventHandles []MessageErrorEventHandle
|
||||||
messageLowExecEventHandles []MessageLowExecEventHandle
|
messageLowExecEventHandles []MessageLowExecEventHandle
|
||||||
connectionOpenedAfterEventHandles []ConnectionOpenedAfterEventHandle
|
connectionOpenedAfterEventHandles []ConnectionOpenedAfterEventHandle
|
||||||
connectionWritePacketBeforeHandles []ConnectionWritePacketBeforeEventHandle
|
connectionWritePacketBeforeHandles []ConnectionWritePacketBeforeEventHandle
|
||||||
shuntChannelCreatedEventHandles []ShuntChannelCreatedEventHandle
|
shuntChannelCreatedEventHandles []ShuntChannelCreatedEventHandle
|
||||||
shuntChannelClosedEventHandles []ShuntChannelClosedEventHandle
|
shuntChannelClosedEventHandles []ShuntChannelClosedEventHandle
|
||||||
|
connectionPacketPreprocessEventHandles []ConnectionPacketPreprocessEventHandle
|
||||||
|
|
||||||
consoleCommandEventHandles map[string][]ConsoleCommandEventHandle
|
consoleCommandEventHandles map[string][]ConsoleCommandEventHandle
|
||||||
consoleCommandEventHandleInitOnce sync.Once
|
consoleCommandEventHandleInitOnce sync.Once
|
||||||
|
@ -283,6 +285,33 @@ func (slf *event) OnShuntChannelClosedEvent(guid int64) {
|
||||||
}, "ShuntChannelCloseEvent")
|
}, "ShuntChannelCloseEvent")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegConnectionPacketPreprocessEvent 在接收到数据包后将立刻执行被注册的事件处理函数
|
||||||
|
// - 预处理函数可以用于对数据包进行预处理,如解密、解压缩等
|
||||||
|
// - 在调用 abort() 后,将不会再调用后续的预处理函数,也不会调用 OnConnectionReceivePacketEvent 函数
|
||||||
|
// - 在调用 usePacket() 后,将使用新的数据包,而不会使用原始数据包,同时阻止后续的预处理函数的调用
|
||||||
|
//
|
||||||
|
// 场景:
|
||||||
|
// - 数据包格式校验
|
||||||
|
// - 数据包分包等情况处理
|
||||||
|
func (slf *event) RegConnectionPacketPreprocessEvent(handle ConnectionPacketPreprocessEventHandle) {
|
||||||
|
slf.connectionPacketPreprocessEventHandles = append(slf.connectionPacketPreprocessEventHandles, handle)
|
||||||
|
log.Info("Server", log.String("RegEvent", runtimes.CurrentRunningFuncName()), log.String("handle", reflect.TypeOf(handle).String()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *event) OnConnectionPacketPreprocessEvent(conn *Conn, packet []byte, usePacket func(newPacket []byte)) bool {
|
||||||
|
if len(slf.connectionPacketPreprocessEventHandles) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var abort = false
|
||||||
|
for _, handle := range slf.connectionPacketPreprocessEventHandles {
|
||||||
|
handle(slf.Server, conn, packet, func() { abort = true }, usePacket)
|
||||||
|
if abort {
|
||||||
|
return abort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return abort
|
||||||
|
}
|
||||||
|
|
||||||
func (slf *event) check() {
|
func (slf *event) check() {
|
||||||
switch slf.network {
|
switch slf.network {
|
||||||
case NetworkHttp, NetworkGRPC:
|
case NetworkHttp, NetworkGRPC:
|
||||||
|
|
|
@ -573,9 +573,12 @@ func (slf *Server) dispatchMessage(msg *Message) {
|
||||||
var attrs = msg.attrs
|
var attrs = msg.attrs
|
||||||
switch msg.t {
|
switch msg.t {
|
||||||
case MessageTypePacket:
|
case MessageTypePacket:
|
||||||
|
var conn = attrs[0].(*Conn)
|
||||||
var packet = attrs[1].([]byte)
|
var packet = attrs[1].([]byte)
|
||||||
var wst = int(packet[len(packet)-1])
|
var wst = int(packet[len(packet)-1])
|
||||||
slf.OnConnectionReceivePacketEvent(attrs[0].(*Conn), Packet{Data: packet[:len(packet)-1], WebsocketType: wst})
|
if !slf.OnConnectionPacketPreprocessEvent(conn, packet, func(newPacket []byte) { packet = newPacket }) {
|
||||||
|
slf.OnConnectionReceivePacketEvent(conn, Packet{Data: packet[:len(packet)-1], WebsocketType: wst})
|
||||||
|
}
|
||||||
case MessageTypeError:
|
case MessageTypeError:
|
||||||
err, action := attrs[0].(error), attrs[1].(MessageErrorAction)
|
err, action := attrs[0].(error), attrs[1].(MessageErrorAction)
|
||||||
switch action {
|
switch action {
|
||||||
|
|
Loading…
Reference in New Issue