From 354563dac6198333bc52c5e5c091822aded6a6b9 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Fri, 30 Aug 2019 22:01:05 +0300 Subject: [PATCH 1/3] draft fix --- proxy.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/proxy.go b/proxy.go index 833e9999d..0994e2be5 100644 --- a/proxy.go +++ b/proxy.go @@ -420,9 +420,11 @@ func (p *Proxy) handle(ctx *Context, conn net.Conn, brw *bufio.ReadWriter) error return nil } res.ContentLength = -1 + /* if err := res.Write(brw); err != nil { log.Errorf("martian: got error while writing response back to client: %v", err) } + */ if err := brw.Flush(); err != nil { log.Errorf("martian: got error while flushing response back to client: %v", err) } @@ -571,17 +573,19 @@ func (p *Proxy) connect(req *http.Request) (*http.Response, net.Conn, error) { return nil, nil, err } pbw := bufio.NewWriter(conn) - pbr := bufio.NewReader(conn) + //pbr := bufio.NewReader(conn) req.Write(pbw) pbw.Flush() + /* res, err := http.ReadResponse(pbr, req) if err != nil { return nil, nil, err } + */ - return res, conn, nil + return proxyutil.NewResponse(200, nil, req), conn, nil } log.Debugf("martian: CONNECT to host directly: %s", req.URL.Host) From 39a7261d87be3f6fd45f18b8cb88c7541e4a6b70 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Sat, 31 Aug 2019 00:52:46 +0300 Subject: [PATCH 2/3] More proper fix --- proxy.go | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/proxy.go b/proxy.go index 0994e2be5..0cdc0c476 100644 --- a/proxy.go +++ b/proxy.go @@ -420,11 +420,11 @@ func (p *Proxy) handle(ctx *Context, conn net.Conn, brw *bufio.ReadWriter) error return nil } res.ContentLength = -1 - /* - if err := res.Write(brw); err != nil { - log.Errorf("martian: got error while writing response back to client: %v", err) + if p.proxyURL == nil { + if err := res.Write(brw); err != nil { + log.Errorf("martian: got error while writing response back to client: %v", err) + } } - */ if err := brw.Flush(); err != nil { log.Errorf("martian: got error while flushing response back to client: %v", err) } @@ -444,7 +444,19 @@ func (p *Proxy) handle(ctx *Context, conn net.Conn, brw *bufio.ReadWriter) error donec := make(chan bool, 2) go copySync(cbw, brw, donec) - go copySync(brw, cbr, donec) + if p.proxyURL == nil { + go copySync(brw, cbr, donec) + } else { + r, w := io.Pipe() + go func() { + defer w.Close() + if err := res.Write(w); err != nil { + log.Errorf("martian: got error while writing response back to client: %v", err) + } + }() + + go copySync(brw, r, donec) + } log.Debugf("martian: established CONNECT tunnel, proxying traffic") <-donec @@ -573,19 +585,17 @@ func (p *Proxy) connect(req *http.Request) (*http.Response, net.Conn, error) { return nil, nil, err } pbw := bufio.NewWriter(conn) - //pbr := bufio.NewReader(conn) + pbr := bufio.NewReader(conn) req.Write(pbw) pbw.Flush() - /* res, err := http.ReadResponse(pbr, req) if err != nil { return nil, nil, err } - */ - return proxyutil.NewResponse(200, nil, req), conn, nil + return res, conn, nil } log.Debugf("martian: CONNECT to host directly: %s", req.URL.Host) From 7a220d3b231934d4109fe028960e8791cf79ccb4 Mon Sep 17 00:00:00 2001 From: Savely Krasovsky Date: Sat, 31 Aug 2019 02:01:47 +0300 Subject: [PATCH 3/3] Proper flushing --- proxy.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/proxy.go b/proxy.go index 0cdc0c476..b7a4d5903 100644 --- a/proxy.go +++ b/proxy.go @@ -424,9 +424,9 @@ func (p *Proxy) handle(ctx *Context, conn net.Conn, brw *bufio.ReadWriter) error if err := res.Write(brw); err != nil { log.Errorf("martian: got error while writing response back to client: %v", err) } - } - if err := brw.Flush(); err != nil { - log.Errorf("martian: got error while flushing response back to client: %v", err) + if err := brw.Flush(); err != nil { + log.Errorf("martian: got error while flushing response back to client: %v", err) + } } cbw := bufio.NewWriter(cconn) @@ -453,6 +453,9 @@ func (p *Proxy) handle(ctx *Context, conn net.Conn, brw *bufio.ReadWriter) error if err := res.Write(w); err != nil { log.Errorf("martian: got error while writing response back to client: %v", err) } + if err := brw.Flush(); err != nil { + log.Errorf("martian: got error while flushing response back to client: %v", err) + } }() go copySync(brw, r, donec)