Skip to content

Commit 255803e

Browse files
committed
improved error handling
1 parent 14d189e commit 255803e

File tree

1 file changed

+26
-12
lines changed

1 file changed

+26
-12
lines changed

websocketproxy.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package websocketproxy
33

44
import (
5+
"fmt"
56
"log"
67
"net"
78
"net/http"
@@ -160,29 +161,42 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
160161
}
161162
defer connPub.Close()
162163

163-
errc := make(chan error, 2)
164-
165-
replicateWebsocketConn := func(dst, src *websocket.Conn, dstName, srcName string) {
166-
var err error
164+
errClient := make(chan error, 1)
165+
errBackend := make(chan error, 1)
166+
replicateWebsocketConn := func(dst, src *websocket.Conn, errc chan error) {
167167
for {
168168
msgType, msg, err := src.ReadMessage()
169169
if err != nil {
170-
log.Printf("websocketproxy: error when copying from %s to %s using ReadMessage: %v", srcName, dstName, err)
170+
m := websocket.FormatCloseMessage(websocket.CloseNormalClosure, fmt.Sprintf("%v", err))
171+
if e, ok := err.(*websocket.CloseError); ok {
172+
if e.Code != websocket.CloseNoStatusReceived {
173+
m = websocket.FormatCloseMessage(e.Code, e.Text)
174+
}
175+
}
176+
errc <- err
177+
dst.WriteMessage(websocket.CloseMessage, m)
171178
break
172179
}
173180
err = dst.WriteMessage(msgType, msg)
174181
if err != nil {
175-
log.Printf("websocketproxy: error when copying from %s to %s using WriteMessage: %v", srcName, dstName, err)
182+
errc <- err
176183
break
177-
} else {
178-
log.Printf("websocketproxy: copying from %s to %s completed without error.", srcName, dstName)
179184
}
180185
}
181-
errc <- err
182186
}
183187

184-
go replicateWebsocketConn(connPub, connBackend, "client", "backend")
185-
go replicateWebsocketConn(connBackend, connPub, "backend", "client")
188+
go replicateWebsocketConn(connPub, connBackend, errClient)
189+
go replicateWebsocketConn(connBackend, connPub, errBackend)
190+
191+
var message string
192+
select {
193+
case err = <-errClient:
194+
message = "websocketproxy: Error when copying from backend to client: %v"
195+
case err = <-errBackend:
196+
message = "websocketproxy: Error when copying from client to backend: %v"
186197

187-
<-errc
198+
}
199+
if e, ok := err.(*websocket.CloseError); !ok || e.Code == websocket.CloseAbnormalClosure {
200+
log.Printf(message, err)
201+
}
188202
}

0 commit comments

Comments
 (0)