From fae0d3a8d0665a17da31ce0489a18be65aea8a17 Mon Sep 17 00:00:00 2001 From: gospider <2216403312@qq.com> Date: Wed, 11 Jun 2025 20:03:51 +0800 Subject: [PATCH] sync --- body.go | 2 +- compressConn.go | 28 +++++++++++++++++++++------- dial.go | 2 +- http.go | 8 ++++---- response.go | 4 ++-- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/body.go b/body.go index 4f02f7a..ec121c2 100644 --- a/body.go +++ b/body.go @@ -110,7 +110,7 @@ func formWrite(writer *multipart.Writer, key string, val any) (err error) { case string: _, err = wp.Write(tools.StringToBytes(content)) case io.Reader: - _, err = io.Copy(wp, content) + _, err = tools.Copy(wp, content) default: con, err := gson.Encode(content) if err != nil { diff --git a/compressConn.go b/compressConn.go index 23db399..83a8c30 100644 --- a/compressConn.go +++ b/compressConn.go @@ -12,10 +12,11 @@ import ( ) type CompressionConn struct { - conn net.Conn - w io.WriteCloser - r io.ReadCloser - f interface{ Flush() error } + conn net.Conn + oneFunc func() + w io.WriteCloser + r io.ReadCloser + f interface{ Flush() error } } type Compression interface { OpenReader(r io.Reader) (io.ReadCloser, error) @@ -93,7 +94,7 @@ func NewCompression(decode string, leval CompressionLevel) (Compression, error) if n != 1 { return nil, errors.New("invalid response") } - return flate.NewWriter(w, flate.BestCompression) + return flate.NewWriter(w, flate.DefaultCompression) }, } default: @@ -111,7 +112,16 @@ func NewCompressionConn(conn net.Conn, arch Compression) (net.Conn, error) { if err != nil { return nil, err } - ccon := &CompressionConn{conn: conn, r: r, w: w} + + ccon := &CompressionConn{ + conn: conn, + r: r, + w: w, + // oneFunc: sync.OnceFunc(func() { + // defer recover() + // w.Close() + // }), + } if f, ok := w.(interface{ Flush() error }); ok { ccon.f = f } @@ -132,7 +142,11 @@ func (obj *CompressionConn) Write(b []byte) (n int, err error) { return } func (obj *CompressionConn) Close() error { - return obj.conn.Close() + err := obj.conn.Close() + if obj.oneFunc != nil { + obj.oneFunc() + } + return err } func (obj *CompressionConn) LocalAddr() net.Addr { return obj.conn.LocalAddr() diff --git a/dial.go b/dial.go index e1c5e3d..b970aff 100644 --- a/dial.go +++ b/dial.go @@ -392,7 +392,7 @@ func (obj *Dialer) verifyUDPSocks5(ctx *Response, conn net.Conn, proxyAddr Addre udpCtx, cnl := context.WithCancel(context.TODO()) wrapConn = NewUDPConn(udpCtx, wrapConn, &net.UDPAddr{IP: proxyAddress.IP, Port: proxyAddress.Port}, remoteAddr) go func() { - io.Copy(io.Discard, conn) + tools.Copy(io.Discard, conn) cnl() }() return diff --git a/http.go b/http.go index 7b48c7c..4fba730 100644 --- a/http.go +++ b/http.go @@ -52,7 +52,7 @@ func NewClientConn(con net.Conn, closeFunc func(error)) *clientConn { w: bufio.NewWriter(con), } go func() { - _, err := io.Copy(writer, con) + _, err := tools.Copy(writer, con) writer.CloseWithError(err) c.CloseWithError(err) }() @@ -83,7 +83,7 @@ func (obj *clientConn) send(req *http.Request, orderHeaders []interface { obj.readWriteCtx.readCnl(readErr) }() if res.Body != nil { - _, readErr = io.Copy(pw, rawBody) + _, readErr = tools.Copy(pw, rawBody) } if readErr != nil && readErr != io.EOF && readErr != io.ErrUnexpectedEOF { err = tools.WrapError(readErr, "failed to read response body") @@ -255,14 +255,14 @@ func (obj *clientConn) httpWrite(req *http.Request, rawHeaders http.Header, orde } if chunked { chunkedWriter := newChunkedWriter(obj.w) - if _, err = io.Copy(chunkedWriter, req.Body); err != nil { + if _, err = tools.Copy(chunkedWriter, req.Body); err != nil { return } if err = chunkedWriter.Close(); err != nil { return } } else { - if _, err = io.Copy(obj.w, req.Body); err != nil { + if _, err = tools.Copy(obj.w, req.Body); err != nil { return } } diff --git a/response.go b/response.go index 47a635d..74917b7 100644 --- a/response.go +++ b/response.go @@ -329,12 +329,12 @@ func (obj *Response) ReadBody() (err error) { go func() { defer close(done) if obj.option.Bar && obj.ContentLength() > 0 { - _, readErr = io.Copy(&barBody{ + _, readErr = tools.Copy(&barBody{ bar: bar.NewClient(obj.response.ContentLength), body: bBody, }, obj.Body()) } else { - _, readErr = io.Copy(bBody, obj.Body()) + _, readErr = tools.Copy(bBody, obj.Body()) } if readErr == io.ErrUnexpectedEOF { readErr = nil