diff --git a/glide.lock b/glide.lock index de833ca2e..02202d874 100644 --- a/glide.lock +++ b/glide.lock @@ -1,5 +1,5 @@ -hash: e59e8244152a823cd3633fb09cdd583c4e5be78d7b50fb7047ba6b6a9ed5e8ec -updated: 2017-05-19T23:30:19.890844996+02:00 +hash: 6e206389bc4f381387be8b5f0cc5a41224329752654ddb3c2a805adde0333217 +updated: 2017-06-17T14:30:19.890844996+02:00 imports: - name: cloud.google.com/go version: 2e6a95edb1071d750f6d7db777bf66cd2997af6c @@ -409,7 +409,7 @@ imports: - name: github.com/vdemeester/docker-events version: be74d4929ec1ad118df54349fda4b0cba60f849b - name: github.com/vulcand/oxy - version: f88530866c561d24a6b5aac49f76d6351b788b9f + version: ad5bdb606fa9c64db267f0e43d63834908bdb05e repo: https://github.com/containous/oxy.git vcs: git subpackages: diff --git a/glide.yaml b/glide.yaml index 5bb9e7aff..face98d36 100644 --- a/glide.yaml +++ b/glide.yaml @@ -8,7 +8,7 @@ import: - package: github.com/cenk/backoff - package: github.com/containous/flaeg - package: github.com/vulcand/oxy - version: f88530866c561d24a6b5aac49f76d6351b788b9f + version: ad5bdb606fa9c64db267f0e43d63834908bdb05e 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 4b358e425..1e0cc74e6 100644 --- a/vendor/github.com/vulcand/oxy/forward/fwd.go +++ b/vendor/github.com/vulcand/oxy/forward/fwd.go @@ -4,6 +4,7 @@ package forward import ( + "bufio" "crypto/tls" "io" "net" @@ -290,14 +291,26 @@ func (f *websocketForwarder) serveHTTP(w http.ResponseWriter, req *http.Request, ctx.errHandler.ServeHTTP(w, req, err) return } - errc := make(chan error, 2) - replicate := func(dst io.Writer, src io.Reader) { - _, err := io.Copy(dst, src) - errc <- err + + br := bufio.NewReader(targetConn) + resp, err := http.ReadResponse(br, req) + resp.Write(underlyingConn) + defer resp.Body.Close() + + // We connect the conn only if the switching protocol has not failed + if resp.StatusCode == http.StatusSwitchingProtocols { + ctx.log.Infof("Switching protocol success") + errc := make(chan error, 2) + replicate := func(dst io.Writer, src io.Reader) { + _, err := io.Copy(dst, src) + errc <- err + } + go replicate(targetConn, underlyingConn) + go replicate(underlyingConn, targetConn) + <-errc + } else { + ctx.log.Infof("Switching protocol failed") } - go replicate(targetConn, underlyingConn) - go replicate(underlyingConn, targetConn) - <-errc } // copyRequest makes a copy of the specified request.