From 2a120e5565d0d0a19acbac5d01a9df54fc6a582e Mon Sep 17 00:00:00 2001 From: Paul Bellamy Date: Mon, 18 May 2015 12:28:17 +0100 Subject: [PATCH] refactor proxy rawStream handler --- proxy/client.go | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/proxy/client.go b/proxy/client.go index 1decfe8d..ac52cd49 100644 --- a/proxy/client.go +++ b/proxy/client.go @@ -104,31 +104,26 @@ func doRawStream(w http.ResponseWriter, resp *http.Response, client *httputil.Cl return } - end := make(chan bool) - go func() { - defer close(end) - if _, err := io.Copy(up, downBuf); err != nil { - Warning.Print(err) - } - err = up.(interface { - CloseWrite() error - }).CloseWrite() - if err != nil { - Debug.Printf("Error Closing upstream: %s", err) - } - }() + upDone := make(chan struct{}) + downDone := make(chan struct{}) + go copyStream(down, io.MultiReader(rem, up), upDone) + go copyStream(up, downBuf, downDone) + <-upDone + <-downDone +} - if _, err := io.Copy(down, io.MultiReader(rem, up)); err != nil { +func copyStream(dst io.Writer, src io.Reader, done chan struct{}) { + defer close(done) + if _, err := io.Copy(dst, src); err != nil { Warning.Print(err) } - err = down.(interface { + if c, ok := dst.(interface { CloseWrite() error - }).CloseWrite() - if err != nil { - Debug.Printf("Error Closing downstream: %s", err) + }); ok { + if err := c.CloseWrite(); err != nil { + Warning.Printf("Error closing connection: %s", err) + } } - - <-end } func doChunkedResponse(w http.ResponseWriter, resp *http.Response, client *httputil.ClientConn) {