|
2 | 2 | package websocketproxy
|
3 | 3 |
|
4 | 4 | import (
|
| 5 | + "fmt" |
5 | 6 | "log"
|
6 | 7 | "net"
|
7 | 8 | "net/http"
|
@@ -160,27 +161,42 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
160 | 161 | }
|
161 | 162 | defer connPub.Close()
|
162 | 163 |
|
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) { |
167 | 167 | for {
|
168 | 168 | msgType, msg, err := src.ReadMessage()
|
169 | 169 | 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) |
171 | 178 | break
|
172 | 179 | }
|
173 | 180 | err = dst.WriteMessage(msgType, msg)
|
174 | 181 | if err != nil {
|
175 |
| - log.Printf("websocketproxy: error when copying from %s to %s using WriteMessage: %v", srcName, dstName, err) |
| 182 | + errc <- err |
176 | 183 | break
|
177 | 184 | }
|
178 | 185 | }
|
179 |
| - errc <- err |
180 | 186 | }
|
181 | 187 |
|
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" |
184 | 197 |
|
185 |
| - <-errc |
| 198 | + } |
| 199 | + if e, ok := err.(*websocket.CloseError); !ok || e.Code == websocket.CloseAbnormalClosure { |
| 200 | + log.Printf(message, err) |
| 201 | + } |
186 | 202 | }
|
0 commit comments