From 52f16e11a8e7eef2aeba85d08302027e7514a594 Mon Sep 17 00:00:00 2001 From: SALLEYRON Julien Date: Tue, 2 Jan 2018 12:30:05 +0100 Subject: [PATCH] Use gorilla readMessage and writeMessage instead of just an io.Copy --- glide.lock | 2 +- vendor/github.com/vulcand/oxy/forward/fwd.go | 31 ++++++++++++------- .../github.com/vulcand/oxy/utils/netutils.go | 2 +- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/glide.lock b/glide.lock index 4a095a11c..3b5cfe7cd 100644 --- a/glide.lock +++ b/glide.lock @@ -481,7 +481,7 @@ imports: - name: github.com/urfave/negroni version: 490e6a555d47ca891a89a150d0c1ef3922dfffe9 - name: github.com/vulcand/oxy - version: 7e9763c4dc71b9758379da3581e6495c145caaab + version: bf0e6bab094f7b909a8d94ba9d7b74aaf7cc3025 repo: https://github.com/containous/oxy.git vcs: git subpackages: diff --git a/vendor/github.com/vulcand/oxy/forward/fwd.go b/vendor/github.com/vulcand/oxy/forward/fwd.go index e6aba940a..6ec424246 100644 --- a/vendor/github.com/vulcand/oxy/forward/fwd.go +++ b/vendor/github.com/vulcand/oxy/forward/fwd.go @@ -315,22 +315,29 @@ func (f *websocketForwarder) serveHTTP(w http.ResponseWriter, req *http.Request, defer targetConn.Close() errc := make(chan error, 2) - replicate := func(dst io.Writer, src io.Reader) { - _, err := io.Copy(dst, src) + + replicateWebsocketConn := func(dst, src *websocket.Conn, dstName, srcName string) { + var err error + for { + msgType, msg, err := src.ReadMessage() + if err != nil { + ctx.log.Errorf("vulcand/oxy/forward/websocket: Error when copying from %s to %s using ReadMessage: %v", srcName, dstName, err) + break + } + err = dst.WriteMessage(msgType, msg) + if err != nil { + ctx.log.Errorf("vulcand/oxy/forward/websocket: Error when copying from %s to %s using WriteMessage: %v", srcName, dstName, err) + break + } else { + ctx.log.Infof("vulcand/oxy/forward/websocket: Copying from %s to %s completed without error.", srcName, dstName) + } + } errc <- err } - go replicate(targetConn.UnderlyingConn(), underlyingConn.UnderlyingConn()) + go replicateWebsocketConn(underlyingConn, targetConn, "client", "backend") + go replicateWebsocketConn(targetConn, underlyingConn, "backend", "client") - // Try to read the first message - t, msg, err := targetConn.ReadMessage() - if err != nil { - ctx.log.Errorf("Couldn't read first message : %v", err) - } else { - underlyingConn.WriteMessage(t, msg) - } - - go replicate(underlyingConn.UnderlyingConn(), targetConn.UnderlyingConn()) <-errc } diff --git a/vendor/github.com/vulcand/oxy/utils/netutils.go b/vendor/github.com/vulcand/oxy/utils/netutils.go index 236ffdd34..6ae10395b 100644 --- a/vendor/github.com/vulcand/oxy/utils/netutils.go +++ b/vendor/github.com/vulcand/oxy/utils/netutils.go @@ -132,7 +132,7 @@ func RemoveHeaders(headers http.Header, names ...string) { } // Parse the MIME media type value of a header. -func GetHeaderMediaType(headers http.Header, name string) (string, error) { +func GetHeaderMediaType(headers http.Header, name string) (string, error) { mediatype, _, err := mime.ParseMediaType(headers.Get(name)) return mediatype, err }