|
2 | 2 | package websocketproxy |
3 | 3 |
|
4 | 4 | import ( |
5 | | - "io" |
6 | 5 | "log" |
7 | 6 | "net" |
8 | 7 | "net/http" |
@@ -162,13 +161,28 @@ func (w *WebsocketProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) { |
162 | 161 | defer connPub.Close() |
163 | 162 |
|
164 | 163 | errc := make(chan error, 2) |
165 | | - cp := func(dst io.Writer, src io.Reader) { |
166 | | - _, err := io.Copy(dst, src) |
| 164 | + |
| 165 | + replicateWebsocketConn := func(dst, src *websocket.Conn, dstName, srcName string) { |
| 166 | + var err error |
| 167 | + for { |
| 168 | + msgType, msg, err := src.ReadMessage() |
| 169 | + if err != nil { |
| 170 | + log.Printf("websocketproxy: error when copying from %s to %s using ReadMessage: %v", srcName, dstName, err) |
| 171 | + break |
| 172 | + } |
| 173 | + err = dst.WriteMessage(msgType, msg) |
| 174 | + if err != nil { |
| 175 | + log.Printf("websocketproxy: error when copying from %s to %s using WriteMessage: %v", srcName, dstName, err) |
| 176 | + break |
| 177 | + } else { |
| 178 | + log.Printf("websocketproxy: copying from %s to %s completed without error.", srcName, dstName) |
| 179 | + } |
| 180 | + } |
167 | 181 | errc <- err |
168 | 182 | } |
169 | 183 |
|
170 | | - // Start our proxy now, everything is ready... |
171 | | - go cp(connBackend.UnderlyingConn(), connPub.UnderlyingConn()) |
172 | | - go cp(connPub.UnderlyingConn(), connBackend.UnderlyingConn()) |
| 184 | + go replicateWebsocketConn(connPub, connBackend, "client", "backend") |
| 185 | + go replicateWebsocketConn(connBackend, connPub, "backend", "client") |
| 186 | + |
173 | 187 | <-errc |
174 | 188 | } |
0 commit comments