mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-09-26 21:01:46 +08:00
fix #241, 令shadowTls不自动关闭假连接
This commit is contained in:
6
main.go
6
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
|
||||
}
|
||||
|
||||
|
@@ -27,7 +27,8 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
ErrTimeout = errors.New("timeout")
|
||||
ErrTimeout = errors.New("timeout")
|
||||
ErrDoNotClose = errors.New("do not close")
|
||||
)
|
||||
|
||||
// c.SetDeadline(time.Time{})
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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")
|
||||
|
||||
}
|
||||
|
35
utils/io.go
35
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
|
||||
|
Reference in New Issue
Block a user