|
|
@@ -5,6 +5,7 @@ package outbound
|
|
|
import (
|
|
|
"context"
|
|
|
"syscall"
|
|
|
+ "time"
|
|
|
|
|
|
"github.com/xtls/xray-core/common"
|
|
|
"github.com/xtls/xray-core/common/buf"
|
|
|
@@ -217,20 +218,26 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|
|
serverWriter = xudp.NewPacketWriter(serverWriter, target)
|
|
|
}
|
|
|
userUUID := account.ID.Bytes()
|
|
|
- multiBuffer, err1 := clientReader.ReadMultiBuffer()
|
|
|
- if err1 != nil {
|
|
|
- return err1 // ...
|
|
|
- }
|
|
|
- if requestAddons.Flow == vless.XRV {
|
|
|
- encoding.XtlsFilterTls(multiBuffer, &numberOfPacketToFilter, &enableXtls, &isTLS12orAbove, &isTLS, &cipher, &remainingServerHello, ctx)
|
|
|
- if isTLS {
|
|
|
- for i, b := range multiBuffer {
|
|
|
- multiBuffer[i] = encoding.XtlsPadding(b, 0x00, &userUUID, ctx)
|
|
|
+ timeoutReader, ok := clientReader.(buf.TimeoutReader)
|
|
|
+ if ok {
|
|
|
+ multiBuffer, err1 := timeoutReader.ReadMultiBufferTimeout(time.Millisecond*500)
|
|
|
+ if err1 == nil {
|
|
|
+ if requestAddons.Flow == vless.XRV {
|
|
|
+ encoding.XtlsFilterTls(multiBuffer, &numberOfPacketToFilter, &enableXtls, &isTLS12orAbove, &isTLS, &cipher, &remainingServerHello, ctx)
|
|
|
+ if isTLS {
|
|
|
+ for i, b := range multiBuffer {
|
|
|
+ multiBuffer[i] = encoding.XtlsPadding(b, 0x00, &userUUID, ctx)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if err := serverWriter.WriteMultiBuffer(multiBuffer); err != nil {
|
|
|
+ return err // ...
|
|
|
}
|
|
|
+ } else if err1 != buf.ErrReadTimeout {
|
|
|
+ return err1
|
|
|
}
|
|
|
- }
|
|
|
- if err := serverWriter.WriteMultiBuffer(multiBuffer); err != nil {
|
|
|
- return err // ...
|
|
|
+ } else {
|
|
|
+ newError("Reader is not timeout reader, will send out vless header separately from first payload").AtDebug().WriteToLog(session.ExportIDToError(ctx))
|
|
|
}
|
|
|
// Flush; bufferWriter.WriteMultiBufer now is bufferWriter.writer.WriteMultiBuffer
|
|
|
if err := bufferWriter.SetBuffered(false); err != nil {
|