|
2 | 2 | package websocketproxy |
3 | 3 |
|
4 | 4 | import ( |
| 5 | + "fmt" |
5 | 6 | "log" |
6 | 7 | "net" |
7 | 8 | "net/http" |
@@ -160,29 +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 | | - } else { |
178 | | - log.Printf("websocketproxy: copying from %s to %s completed without error.", srcName, dstName) |
179 | 184 | } |
180 | 185 | } |
181 | | - errc <- err |
182 | 186 | } |
183 | 187 |
|
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" |
186 | 197 |
|
187 | | - <-errc |
| 198 | + } |
| 199 | + if e, ok := err.(*websocket.CloseError); !ok || e.Code == websocket.CloseAbnormalClosure { |
| 200 | + log.Printf(message, err) |
| 201 | + } |
188 | 202 | } |
0 commit comments