1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-08-18 20:10:54 +00:00

Merge pull request #279 from riking/revert-deadline

HOTFIX: Revert use of SetReadDeadline()
This commit is contained in:
Mike 2017-11-13 16:55:06 -05:00 committed by GitHub
commit 0d3d8b5868
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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
}