|
|
@@ -3,6 +3,7 @@ package outbound
|
|
|
import (
|
|
|
"context"
|
|
|
"net"
|
|
|
+ "os"
|
|
|
"runtime"
|
|
|
"time"
|
|
|
|
|
|
@@ -136,22 +137,25 @@ func CopyEarlyConn(ctx context.Context, conn net.Conn, serverConn net.Conn) erro
|
|
|
_payload := buf.StackNew()
|
|
|
payload := common.Dup(_payload)
|
|
|
err := conn.SetReadDeadline(time.Now().Add(C.ReadPayloadTimeout))
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- _, err = payload.ReadOnceFrom(conn)
|
|
|
- if err != nil && !E.IsTimeout(err) {
|
|
|
- return E.Cause(err, "read payload")
|
|
|
- }
|
|
|
- err = conn.SetReadDeadline(time.Time{})
|
|
|
- if err != nil {
|
|
|
- payload.Release()
|
|
|
- return err
|
|
|
+ if err != os.ErrInvalid {
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = payload.ReadOnceFrom(conn)
|
|
|
+ if err != nil && !E.IsTimeout(err) {
|
|
|
+ return E.Cause(err, "read payload")
|
|
|
+ }
|
|
|
+ err = conn.SetReadDeadline(time.Time{})
|
|
|
+ if err != nil {
|
|
|
+ payload.Release()
|
|
|
+ return err
|
|
|
+ }
|
|
|
}
|
|
|
_, err = serverConn.Write(payload.Bytes())
|
|
|
if err != nil {
|
|
|
return N.HandshakeFailure(conn, err)
|
|
|
}
|
|
|
runtime.KeepAlive(_payload)
|
|
|
+ payload.Release()
|
|
|
return bufio.CopyConn(ctx, conn, serverConn)
|
|
|
}
|