Skip to content

Commit 944ae4a

Browse files
authored
Merge pull request #17 from ttjiaa/improved-error-handling
Improved error handling
2 parents b8568f3 + 255803e commit 944ae4a

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

websocketproxy.go

Lines changed: 26 additions & 10 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,27 +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
177184
}
178185
}
179-
errc <- err
180186
}
181187

182-
go replicateWebsocketConn(connPub, connBackend, "client", "backend")
183-
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"
184197

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

0 commit comments

Comments
 (0)