diff --git a/main.go b/main.go index 33c3bd6..03aeb99 100644 --- a/main.go +++ b/main.go @@ -329,7 +329,11 @@ func handleNewIncomeConnection(inServer proxy.Server, defaultClientForThis proxy ) } - wrappedConn.Close() + //see #241 + if !errors.Is(err, netLayer.ErrDoNotClose) { + wrappedConn.Close() + + } return } diff --git a/netLayer/netlayer.go b/netLayer/netlayer.go index 8e7fc39..4c0fcbb 100644 --- a/netLayer/netlayer.go +++ b/netLayer/netlayer.go @@ -27,7 +27,8 @@ import ( ) var ( - ErrTimeout = errors.New("timeout") + ErrTimeout = errors.New("timeout") + ErrDoNotClose = errors.New("do not close") ) // c.SetDeadline(time.Time{}) diff --git a/tlsLayer/shadow.go b/tlsLayer/shadow.go index 556101a..9932305 100644 --- a/tlsLayer/shadow.go +++ b/tlsLayer/shadow.go @@ -98,7 +98,9 @@ func shadowTls2(servername string, clientConn net.Conn, password string) (result } hashW := utils.NewHashWriter(clientConn, []byte(password)) - go io.Copy(hashW, fakeConn) + + go io.Copy(hashW, fakeConn) //write real server response back to client + var firstPayload *bytes.Buffer firstPayload, err = shadowCopyHandshakeClientToFake(fakeConn, clientConn, hashW) @@ -123,8 +125,9 @@ func shadowTls2(servername string, clientConn net.Conn, password string) (result } hashW.StopHashing() - go io.Copy(fakeConn, clientConn) - return nil, errors.New("not real shadowTlsClient, fallback") + go io.Copy(fakeConn, clientConn) //write client request to real server + + return nil, utils.ErrInErr{ErrDetail: netLayer.ErrDoNotClose, ErrDesc: "not real shadowTlsClient, fallback"} } return nil, err diff --git a/utils/error.go b/utils/error.go index 95c60e9..630fef8 100644 --- a/utils/error.go +++ b/utils/error.go @@ -165,7 +165,9 @@ func (e Errs) String() string { for _, err := range e.List { sb.WriteString(strconv.Itoa(err.Index)) sb.WriteString(", ") - sb.WriteString(err.E.Error()) + if err.E != nil { + sb.WriteString(err.E.Error()) + } sb.WriteString("\n") } diff --git a/utils/io.go b/utils/io.go index 7d4d133..589532a 100644 --- a/utils/io.go +++ b/utils/io.go @@ -42,6 +42,41 @@ func ClassicCopy(w io.Writer, r io.Reader) (written int64, err error) { return } +// 同ClassicCopy,但给出更详细的err +func ClassicCopy_detailErr(w io.Writer, r io.Reader) (written int64, err error) { + bs := GetPacket() + defer PutPacket(bs) + for { + + nr, er := r.Read(bs) + if nr > 0 { + nw, ew := w.Write(bs[0:nr]) + + if nw < 0 || nr < nw { + nw = 0 + if ew == nil { + ew = ErrInvalidWrite + } + } + written += int64(nw) + if ew != nil { + err = ErrInErr{ErrDetail: Errs{[]ErrsItem{{Index: 1, E: ErrInErr{ErrDetail: ew, Data: []int{nr, nw}}}, {Index: 2, E: er}}}, ErrDesc: "ew"} + break + } + if nr != nw { + err = io.ErrShortWrite + break + } + } + if er != nil { + + err = ErrInErr{ErrDetail: er, ErrDesc: "er"} + break + } + } + return +} + // 一种简单的读写组合, 在ws包中被用到. type RW struct { io.Reader