|
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