Skip to content

Commit 482debd

Browse files
authored
fix: barry quick commit, 2025-02-11 10:28:02 (#60)
1 parent eca7b56 commit 482debd

File tree

1 file changed

+35
-3
lines changed

1 file changed

+35
-3
lines changed

pkg/wsproxy/websocket_proxy.go

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ package wsproxy
33
import (
44
"bufio"
55
"bytes"
6+
"errors"
67
"io"
78
"net"
89
"net/http"
910
"strings"
11+
"sync"
1012
"time"
1113

1214
"github.com/gorilla/websocket"
@@ -170,24 +172,25 @@ func (p *Proxy) proxy(w http.ResponseWriter, r *http.Request) {
170172
p.timeWait = timeWait
171173
}
172174

173-
conn, err := upgrade.Upgrade(w, r, responseHeader)
175+
conn1, err := upgrade.Upgrade(w, r, responseHeader)
174176
if err != nil {
175177
log.Warn().Err(err).Msg("error upgrading websocket")
176178
return
177179
}
178-
defer conn.Close()
180+
defer conn1.Close()
179181

180182
ctx, cancelFn := context.WithCancel(context.Background())
181183
defer cancelFn()
182184

185+
conn := WsConn{Conn: conn1, mu: &sync.Mutex{}}
183186
conn.SetReadLimit(maxMessageSize)
184187
conn.SetPingHandler(func(text string) error {
185188
logutil.HandlerErr(conn.SetReadDeadline(time.Now().Add(p.timeWait)))
186189

187190
log.Info().Str("text", text).Msg("websocket received ping frame")
188191
// 不设置 write deadline
189192
err := conn.WriteControl(websocket.PongMessage, []byte(text), time.Time{})
190-
if err == websocket.ErrCloseSent {
193+
if errors.Is(err, websocket.ErrCloseSent) {
191194
return nil
192195
} else if _, ok := err.(net.Error); ok {
193196
return nil
@@ -354,3 +357,32 @@ func (w *inMemoryResponseWriter) CloseNotify() <-chan bool {
354357
return w.closed
355358
}
356359
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

Comments
 (0)