@@ -3,10 +3,12 @@ package wsproxy
3
3
import (
4
4
"bufio"
5
5
"bytes"
6
+ "errors"
6
7
"io"
7
8
"net"
8
9
"net/http"
9
10
"strings"
11
+ "sync"
10
12
"time"
11
13
12
14
"github.com/gorilla/websocket"
@@ -170,24 +172,25 @@ func (p *Proxy) proxy(w http.ResponseWriter, r *http.Request) {
170
172
p .timeWait = timeWait
171
173
}
172
174
173
- conn , err := upgrade .Upgrade (w , r , responseHeader )
175
+ conn1 , err := upgrade .Upgrade (w , r , responseHeader )
174
176
if err != nil {
175
177
log .Warn ().Err (err ).Msg ("error upgrading websocket" )
176
178
return
177
179
}
178
- defer conn .Close ()
180
+ defer conn1 .Close ()
179
181
180
182
ctx , cancelFn := context .WithCancel (context .Background ())
181
183
defer cancelFn ()
182
184
185
+ conn := WsConn {Conn : conn1 , mu : & sync.Mutex {}}
183
186
conn .SetReadLimit (maxMessageSize )
184
187
conn .SetPingHandler (func (text string ) error {
185
188
logutil .HandlerErr (conn .SetReadDeadline (time .Now ().Add (p .timeWait )))
186
189
187
190
log .Info ().Str ("text" , text ).Msg ("websocket received ping frame" )
188
191
// 不设置 write deadline
189
192
err := conn .WriteControl (websocket .PongMessage , []byte (text ), time.Time {})
190
- if err == websocket .ErrCloseSent {
193
+ if errors . Is ( err , websocket .ErrCloseSent ) {
191
194
return nil
192
195
} else if _ , ok := err .(net.Error ); ok {
193
196
return nil
@@ -354,3 +357,32 @@ func (w *inMemoryResponseWriter) CloseNotify() <-chan bool {
354
357
return w .closed
355
358
}
356
359
func (w * inMemoryResponseWriter ) Flush () {}
360
+
361
+ type WsConn struct {
362
+ * websocket.Conn
363
+ mu * sync.Mutex
364
+ }
365
+
366
+ func (ws WsConn ) WritePreparedMessage (pm * websocket.PreparedMessage ) error {
367
+ ws .mu .Lock ()
368
+ defer ws .mu .Unlock ()
369
+ return ws .Conn .WritePreparedMessage (pm )
370
+ }
371
+
372
+ func (ws WsConn ) WriteJSON (v interface {}) error {
373
+ ws .mu .Lock ()
374
+ defer ws .mu .Unlock ()
375
+ return ws .Conn .WriteJSON (v )
376
+ }
377
+
378
+ func (ws WsConn ) WriteControl (messageType int , data []byte , deadline time.Time ) error {
379
+ ws .mu .Lock ()
380
+ defer ws .mu .Unlock ()
381
+ return ws .Conn .WriteControl (messageType , data , deadline )
382
+ }
383
+
384
+ func (ws WsConn ) WriteMessage (messageType int , data []byte ) error {
385
+ ws .mu .Lock ()
386
+ defer ws .mu .Unlock ()
387
+ return ws .Conn .WriteMessage (messageType , data )
388
+ }
0 commit comments