@@ -13,8 +13,8 @@ import (
1313 "time"
1414
1515 "github.com/desertbit/timer"
16- "github.com/gorilla/websocket"
1716 "golang.org/x/net/http2"
17+ "nhooyr.io/websocket"
1818)
1919
2020type webSocketResponseWriter struct {
@@ -24,40 +24,34 @@ type webSocketResponseWriter struct {
2424 flushedHeaders http.Header
2525 timeOutInterval time.Duration
2626 timer * timer.Timer
27+ context context.Context
2728}
2829
29- func newWebSocketResponseWriter (wsConn * websocket.Conn ) * webSocketResponseWriter {
30+ func newWebSocketResponseWriter (ctx context. Context , wsConn * websocket.Conn ) * webSocketResponseWriter {
3031 return & webSocketResponseWriter {
3132 writtenHeaders : false ,
3233 headers : make (http.Header ),
3334 flushedHeaders : make (http.Header ),
3435 wsConn : wsConn ,
36+ context : ctx ,
3537 }
3638}
3739
3840func (w * webSocketResponseWriter ) enablePing (timeOutInterval time.Duration ) {
3941 w .timeOutInterval = timeOutInterval
4042 w .timer = timer .NewTimer (w .timeOutInterval )
41- dispose := make (chan bool )
42- w .wsConn .SetCloseHandler (func (code int , text string ) error {
43- close (dispose )
44- return nil
45- })
46- go w .ping (dispose )
43+ go w .ping ()
4744}
4845
49- func (w * webSocketResponseWriter ) ping (dispose chan bool ) {
50- if dispose == nil {
51- return
52- }
46+ func (w * webSocketResponseWriter ) ping () {
5347 defer w .timer .Stop ()
5448 for {
5549 select {
56- case <- dispose :
50+ case <- w . context . Done () :
5751 return
5852 case <- w .timer .C :
5953 w .timer .Reset (w .timeOutInterval )
60- w .wsConn .WriteMessage ( websocket . PingMessage , [] byte {} )
54+ w .wsConn .Ping ( w . context )
6155 }
6256 }
6357}
@@ -73,16 +67,16 @@ func (w *webSocketResponseWriter) Write(b []byte) (int, error) {
7367 if w .timeOutInterval > time .Second && w .timer != nil {
7468 w .timer .Reset (w .timeOutInterval )
7569 }
76- return len (b ), w .wsConn .WriteMessage ( websocket .BinaryMessage , b )
70+ return len (b ), w .wsConn .Write ( w . context , websocket .MessageBinary , b )
7771}
7872
7973func (w * webSocketResponseWriter ) writeHeaderFrame (headers http.Header ) {
8074 headerBuffer := new (bytes.Buffer )
8175 headers .Write (headerBuffer )
8276 headerGrpcDataHeader := []byte {1 << 7 , 0 , 0 , 0 , 0 } // MSB=1 indicates this is a header data frame.
8377 binary .BigEndian .PutUint32 (headerGrpcDataHeader [1 :5 ], uint32 (headerBuffer .Len ()))
84- w .wsConn .WriteMessage ( websocket .BinaryMessage , headerGrpcDataHeader )
85- w .wsConn .WriteMessage ( websocket .BinaryMessage , headerBuffer .Bytes ())
78+ w .wsConn .Write ( w . context , websocket .MessageBinary , headerGrpcDataHeader )
79+ w .wsConn .Write ( w . context , websocket .MessageBinary , headerBuffer .Bytes ())
8680}
8781
8882func (w * webSocketResponseWriter ) copyFlushedHeaders () {
@@ -127,12 +121,13 @@ type webSocketWrappedReader struct {
127121 respWriter * webSocketResponseWriter
128122 remainingBuffer []byte
129123 remainingError error
124+ context context.Context
130125 cancel context.CancelFunc
131126}
132127
133128func (w * webSocketWrappedReader ) Close () error {
134129 w .respWriter .FlushTrailers ()
135- return w .wsConn .Close ()
130+ return w .wsConn .Close (websocket . StatusNormalClosure , "request body closed" )
136131}
137132
138133// First byte of a binary WebSocket frame is used for control flow:
@@ -167,15 +162,15 @@ func (w *webSocketWrappedReader) Read(p []byte) (int, error) {
167162 }
168163
169164 // Read a whole frame from the WebSocket connection
170- messageType , framePayload , err := w .wsConn .ReadMessage ( )
171- if err == io .EOF || messageType == - 1 {
165+ messageType , framePayload , err := w .wsConn .Read ( w . context )
166+ if err == io .EOF || messageType == 0 {
172167 // The client has closed the connection. Indicate to the response writer that it should close
173168 w .cancel ()
174169 return 0 , io .EOF
175170 }
176171
177172 // Only Binary frames are valid
178- if messageType != websocket .BinaryMessage {
173+ if messageType != websocket .MessageBinary {
179174 return 0 , errors .New ("websocket frame was not a binary frame" )
180175 }
181176
@@ -211,12 +206,13 @@ func (w *webSocketWrappedReader) Read(p []byte) (int, error) {
211206 return len (p ), nil
212207}
213208
214- func newWebsocketWrappedReader (wsConn * websocket.Conn , respWriter * webSocketResponseWriter , cancel context.CancelFunc ) * webSocketWrappedReader {
209+ func newWebsocketWrappedReader (ctx context. Context , wsConn * websocket.Conn , respWriter * webSocketResponseWriter , cancel context.CancelFunc ) * webSocketWrappedReader {
215210 return & webSocketWrappedReader {
216211 wsConn : wsConn ,
217212 respWriter : respWriter ,
218213 remainingBuffer : nil ,
219214 remainingError : nil ,
215+ context : ctx ,
220216 cancel : cancel ,
221217 }
222218}
0 commit comments