Skip to content

Commit

Permalink
update websocket lib, fix race on close (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
ccbrown committed Jan 5, 2021
1 parent 0ad8e9e commit 362fccd
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
2 changes: 1 addition & 1 deletion go.mod
Expand Up @@ -3,7 +3,7 @@ module github.com/ccbrown/api-fu
go 1.12

require (
github.com/gorilla/websocket v1.4.0
github.com/gorilla/websocket v1.4.2
github.com/json-iterator/go v1.1.7
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
github.com/pkg/errors v0.8.1
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Expand Up @@ -7,6 +7,8 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
Expand Down
22 changes: 18 additions & 4 deletions graphqlws/connection.go
Expand Up @@ -244,14 +244,28 @@ func (c *Connection) writeLoop() {
for {
var msg *websocket.PreparedMessage
select {
case outgoing, ok := <-c.outgoing:
if !ok {
return
}
case outgoing := <-c.outgoing:
msg = outgoing
case <-keepAliveTicker.C:
msg = keepAlivePreparedMessage
case msg := <-c.closeMessage:
// make sure we send any outgoing messages before closing (e.g. to make sure we send
// back the error after a bad init)
for done := false; !done; {
select {
case msg := <-c.outgoing:
c.conn.SetWriteDeadline(time.Now().Add(time.Second))
if err := c.conn.WritePreparedMessage(msg); err != nil {
if !websocket.IsCloseError(err, websocket.CloseAbnormalClosure, websocket.CloseGoingAway) && err != websocket.ErrCloseSent {
c.Logger.Error(errors.Wrap(err, "websocket write error"))
}
done = true
}
default:
done = true
}
}

// initiate the close handshake
if err := c.conn.WriteMessage(websocket.CloseMessage, msg); err != nil {
c.Logger.Error(errors.Wrap(err, "websocket control write error"))
Expand Down

0 comments on commit 362fccd

Please sign in to comment.