From c01c61fc6bd97c87426cc0b76af659b619c3d38e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B2=B3?= Date: Fri, 12 Apr 2019 17:40:27 +0800 Subject: [PATCH] http trunk bug --- lib/conn/conn.go | 14 ++++++++++++++ server/proxy/http.go | 24 ++++++++---------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/conn/conn.go b/lib/conn/conn.go index 53bbc65..7b6e729 100755 --- a/lib/conn/conn.go +++ b/lib/conn/conn.go @@ -384,3 +384,17 @@ func GetConn(conn net.Conn, cpt, snappy bool, rt *rate.Rate, isServer bool) (io. } return rate.NewRateConn(conn, rt) } + +type LenConn struct { + conn io.Writer + Len int +} + +func NewLenConn(conn io.Writer) *LenConn { + return &LenConn{conn: conn} +} +func (c *LenConn) Write(p []byte) (n int, err error) { + n, err = c.conn.Write(p) + c.Len += n + return +} diff --git a/server/proxy/http.go b/server/proxy/http.go index 3e16e4c..f8e0a24 100644 --- a/server/proxy/http.go +++ b/server/proxy/http.go @@ -172,16 +172,12 @@ func (s *httpServer) httpHandle(c *conn.Conn, r *http.Request) { host.Flow.Add(0, int64(len(b))) s.cache.Add(filepath.Join(host.Host, r.URL.Path), b) } else { - b, err := httputil.DumpResponse(resp, false) - if err != nil { + lenConn := conn.NewLenConn(c) + if err := resp.Write(lenConn); err != nil { + logs.Error(err) return } - c.Write(b) - if bodyLen, err := common.CopyBuffer(c, resp.Body); err != nil { - return - } else { - host.Flow.Add(0, int64(len(b))+bodyLen) - } + host.Flow.Add(0, int64(lenConn.Len)) } } } @@ -234,18 +230,14 @@ func (s *httpServer) httpHandle(c *conn.Conn, r *http.Request) { readReq = true //change the host and header and set proxy setting common.ChangeHostAndHeader(r, host.HostChange, host.HeaderChange, c.Conn.RemoteAddr().String()) - b, err := httputil.DumpRequest(r, false) - if err != nil { - break - } logs.Trace("%s request, method %s, host %s, url %s, remote address %s, target %s", r.URL.Scheme, r.Method, r.Host, r.URL.Path, c.RemoteAddr().String(), lk.Host) //write - connClient.Write(b) - if bodyLen, err := common.CopyBuffer(connClient, r.Body); err != nil { + lenConn := conn.NewLenConn(connClient) + if err := r.Write(lenConn); err != nil { + logs.Error(err) break - } else { - host.Flow.Add(int64(len(b))+bodyLen, 0) } + host.Flow.Add(int64(lenConn.Len), 0) reqCh <- r } end: