fix #241, 令shadowTls不自动关闭假连接

This commit is contained in:
e1732a364fed
2000-01-01 00:00:00 +00:00
parent f8fa461e6d
commit dbf066e3b9
5 changed files with 51 additions and 6 deletions

View File

@@ -329,7 +329,11 @@ func handleNewIncomeConnection(inServer proxy.Server, defaultClientForThis proxy
)
}
wrappedConn.Close()
//see #241
if !errors.Is(err, netLayer.ErrDoNotClose) {
wrappedConn.Close()
}
return
}

View File

@@ -27,7 +27,8 @@ import (
)
var (
ErrTimeout = errors.New("timeout")
ErrTimeout = errors.New("timeout")
ErrDoNotClose = errors.New("do not close")
)
// c.SetDeadline(time.Time{})

View File

@@ -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

View File

@@ -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")
}

View File

@@ -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