mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-06-27 21:05:53 +00:00
Handle errors in UnmarshalClientMessage
This commit is contained in:
parent
bd1051b4c1
commit
0744019555
1 changed files with 27 additions and 8 deletions
|
@ -249,11 +249,21 @@ func HTTPHandleRootURL(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
}
|
||||
|
||||
type fatalDecodeError string
|
||||
|
||||
func (e fatalDecodeError) Error() string {
|
||||
return string(e)
|
||||
}
|
||||
|
||||
func (e fatalDecodeError) IsFatal() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// ErrProtocolGeneric is sent in a ErrorCommand Reply.
|
||||
var ErrProtocolGeneric error = errors.New("FFZ Socket protocol error.")
|
||||
var ErrProtocolGeneric error = fatalDecodeError("FFZ Socket protocol error.")
|
||||
|
||||
// ErrProtocolNegativeMsgID is sent in a ErrorCommand Reply when a negative MessageID is received.
|
||||
var ErrProtocolNegativeMsgID error = errors.New("FFZ Socket protocol error: negative or zero message ID.")
|
||||
var ErrProtocolNegativeMsgID error = fatalDecodeError("FFZ Socket protocol error: negative or zero message ID.")
|
||||
|
||||
// ErrExpectedSingleString is sent in a ErrorCommand Reply when the Arguments are of the wrong type.
|
||||
var ErrExpectedSingleString = errors.New("Error: Expected single string as arguments.")
|
||||
|
@ -344,7 +354,7 @@ func RunSocketConnection(conn *websocket.Conn) {
|
|||
})
|
||||
|
||||
// All set up, now enter the work loop
|
||||
go runSocketReader(conn, _errorChan, _clientChan, stoppedChan)
|
||||
go runSocketReader(conn, &client, _errorChan, _clientChan)
|
||||
closeReason := runSocketWriter(conn, &client, _errorChan, _clientChan, _serverMessageChan)
|
||||
|
||||
// Exit
|
||||
|
@ -376,12 +386,14 @@ func RunSocketConnection(conn *websocket.Conn) {
|
|||
}
|
||||
}
|
||||
|
||||
func runSocketReader(conn *websocket.Conn, errorChan chan<- error, clientChan chan<- ClientMessage, stoppedChan <-chan struct{}) {
|
||||
func runSocketReader(conn *websocket.Conn, client *ClientInfo, errorChan chan<- error, clientChan chan<- ClientMessage) {
|
||||
var msg ClientMessage
|
||||
var messageType int
|
||||
var packet []byte
|
||||
var err error
|
||||
|
||||
stoppedChan := client.MsgChannelIsDone
|
||||
|
||||
defer close(errorChan)
|
||||
defer close(clientChan)
|
||||
|
||||
|
@ -395,8 +407,15 @@ func runSocketReader(conn *websocket.Conn, errorChan chan<- error, clientChan ch
|
|||
break
|
||||
}
|
||||
|
||||
UnmarshalClientMessage(packet, messageType, &msg)
|
||||
if msg.MessageID == 0 {
|
||||
msg = ClientMessage{}
|
||||
msgErr := UnmarshalClientMessage(packet, messageType, &msg)
|
||||
if _, ok := msgErr.(interface{IsFatal() bool}); ok {
|
||||
errorChan <- msgErr
|
||||
continue
|
||||
} else if msgErr != nil {
|
||||
client.Send(msg.Reply(ErrorCommand, msgErr.Error()))
|
||||
continue
|
||||
} else if msg.MessageID == 0 {
|
||||
continue
|
||||
}
|
||||
select {
|
||||
|
@ -514,11 +533,11 @@ func UnmarshalClientMessage(data []byte, _ int, v interface{}) (err error) {
|
|||
// Message ID
|
||||
spaceIdx = strings.IndexRune(dataStr, ' ')
|
||||
if spaceIdx == -1 {
|
||||
return ErrProtocolGeneric
|
||||
return ErrProtocolGeneric // fatal error
|
||||
}
|
||||
messageID, err := strconv.Atoi(dataStr[:spaceIdx])
|
||||
if messageID < -1 || messageID == 0 {
|
||||
return ErrProtocolNegativeMsgID
|
||||
return ErrProtocolNegativeMsgID // fatal error
|
||||
}
|
||||
|
||||
out.MessageID = messageID
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue