mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-08-19 04:20:54 +00:00
Merge pull request #279 from riking/revert-deadline
HOTFIX: Revert use of SetReadDeadline()
This commit is contained in:
commit
0d3d8b5868
1 changed files with 14 additions and 41 deletions
|
@ -440,24 +440,7 @@ func runSocketReader(conn *websocket.Conn, client *ClientInfo, errorChan chan<-
|
|||
defer close(errorChan)
|
||||
defer close(clientChan)
|
||||
|
||||
for {
|
||||
conn.SetReadDeadline(time.Now().Add(1 * time.Minute))
|
||||
messageType, packet, err = conn.ReadMessage()
|
||||
// handle ReadDeadline by sending a ping
|
||||
// writer loop handles repeated ping timeouts
|
||||
if tmErr, ok := err.(interface {
|
||||
Timeout() bool
|
||||
}); ok && tmErr.Timeout() {
|
||||
select {
|
||||
case <-stoppedChan:
|
||||
return
|
||||
case clientChan <- ClientMessage{Command: "__readTimeout"}:
|
||||
}
|
||||
continue // re-set deadline and wait for pong packet
|
||||
}
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
for ; err == nil; messageType, packet, err = conn.ReadMessage() {
|
||||
if messageType == websocket.BinaryMessage {
|
||||
err = &CloseGotBinaryMessage
|
||||
break
|
||||
|
@ -480,24 +463,23 @@ func runSocketReader(conn *websocket.Conn, client *ClientInfo, errorChan chan<-
|
|||
} else if msg.MessageID == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
select {
|
||||
case clientChan <- msg:
|
||||
case <-stoppedChan:
|
||||
return
|
||||
case clientChan <- msg:
|
||||
}
|
||||
}
|
||||
|
||||
select {
|
||||
case <-stoppedChan:
|
||||
case errorChan <- err:
|
||||
case <-stoppedChan:
|
||||
}
|
||||
// exit goroutine
|
||||
}
|
||||
|
||||
var pingPayload = []byte("PING")
|
||||
|
||||
func runSocketWriter(conn *websocket.Conn, client *ClientInfo, errorChan <-chan error, clientChan <-chan ClientMessage, serverMessageChan <-chan ClientMessage) websocket.CloseError {
|
||||
pingTicker := time.NewTicker(1 * time.Minute)
|
||||
defer pingTicker.Stop()
|
||||
lastPacket := time.Now()
|
||||
|
||||
for {
|
||||
|
@ -518,29 +500,12 @@ func runSocketWriter(conn *websocket.Conn, client *ClientInfo, errorChan <-chan
|
|||
}
|
||||
|
||||
case msg := <-clientChan:
|
||||
if msg.Command == "__readTimeout" {
|
||||
// generated on 60 seconds without a message
|
||||
now := time.Now()
|
||||
if lastPacket.Add(5 * time.Minute).Before(now) {
|
||||
return CloseTimedOut
|
||||
}
|
||||
conn.WriteControl(
|
||||
websocket.PingMessage,
|
||||
pingPayload,
|
||||
getDeadline(),
|
||||
)
|
||||
continue
|
||||
}
|
||||
|
||||
if !client.HelloOK && msg.Command != HelloCommand {
|
||||
return CloseFirstMessageNotHello
|
||||
}
|
||||
lastPacket = time.Now()
|
||||
|
||||
if msg.Command == "__ping" {
|
||||
// generated for PONG packets
|
||||
// want to branch AFTER lastPacket is set
|
||||
continue
|
||||
continue // generated by server, not by client
|
||||
}
|
||||
|
||||
for _, char := range msg.Command {
|
||||
|
@ -560,6 +525,14 @@ func runSocketWriter(conn *websocket.Conn, client *ClientInfo, errorChan <-chan
|
|||
}
|
||||
SendMessage(conn, msg)
|
||||
|
||||
case <-pingTicker.C:
|
||||
now := time.Now()
|
||||
if lastPacket.Add(5 * time.Minute).Before(now) {
|
||||
return CloseTimedOut
|
||||
} else if lastPacket.Add(1 * time.Minute).Before(now) {
|
||||
conn.WriteControl(websocket.PingMessage, []byte(strconv.FormatInt(time.Now().Unix(), 10)), getDeadline())
|
||||
}
|
||||
|
||||
case <-StopAcceptingConnectionsCh:
|
||||
return CloseGoingAway
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue