mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-09-16 10:06:54 +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.
|
// 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.
|
// 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.
|
// 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.")
|
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
|
// 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)
|
closeReason := runSocketWriter(conn, &client, _errorChan, _clientChan, _serverMessageChan)
|
||||||
|
|
||||||
// Exit
|
// 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 msg ClientMessage
|
||||||
var messageType int
|
var messageType int
|
||||||
var packet []byte
|
var packet []byte
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
stoppedChan := client.MsgChannelIsDone
|
||||||
|
|
||||||
defer close(errorChan)
|
defer close(errorChan)
|
||||||
defer close(clientChan)
|
defer close(clientChan)
|
||||||
|
|
||||||
|
@ -395,8 +407,15 @@ func runSocketReader(conn *websocket.Conn, errorChan chan<- error, clientChan ch
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
UnmarshalClientMessage(packet, messageType, &msg)
|
msg = ClientMessage{}
|
||||||
if msg.MessageID == 0 {
|
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
|
continue
|
||||||
}
|
}
|
||||||
select {
|
select {
|
||||||
|
@ -514,11 +533,11 @@ func UnmarshalClientMessage(data []byte, _ int, v interface{}) (err error) {
|
||||||
// Message ID
|
// Message ID
|
||||||
spaceIdx = strings.IndexRune(dataStr, ' ')
|
spaceIdx = strings.IndexRune(dataStr, ' ')
|
||||||
if spaceIdx == -1 {
|
if spaceIdx == -1 {
|
||||||
return ErrProtocolGeneric
|
return ErrProtocolGeneric // fatal error
|
||||||
}
|
}
|
||||||
messageID, err := strconv.Atoi(dataStr[:spaceIdx])
|
messageID, err := strconv.Atoi(dataStr[:spaceIdx])
|
||||||
if messageID < -1 || messageID == 0 {
|
if messageID < -1 || messageID == 0 {
|
||||||
return ErrProtocolNegativeMsgID
|
return ErrProtocolNegativeMsgID // fatal error
|
||||||
}
|
}
|
||||||
|
|
||||||
out.MessageID = messageID
|
out.MessageID = messageID
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue