mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
Try fix
This commit is contained in:
@@ -115,12 +115,7 @@ func Copy(reader Reader, writer Writer, options ...CopyOption) error {
|
|||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
option(&handler)
|
option(&handler)
|
||||||
}
|
}
|
||||||
var err error
|
err := copyInternal(reader, writer, &handler)
|
||||||
if sReader, ok := reader.(*SingleReader); ok && false {
|
|
||||||
err = copyV(sReader, writer, &handler)
|
|
||||||
} else {
|
|
||||||
err = copyInternal(reader, writer, &handler)
|
|
||||||
}
|
|
||||||
if err != nil && errors.Cause(err) != io.EOF {
|
if err != nil && errors.Cause(err) != io.EOF {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -141,7 +136,31 @@ func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error
|
|||||||
return writer.WriteMultiBuffer(mb)
|
return writer.WriteMultiBuffer(mb)
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyV(r *SingleReader, w Writer, handler *copyHandler) error {
|
func TryCopyV(reader Reader, writer Writer, options ...CopyOption) error {
|
||||||
|
var doCopyV bool
|
||||||
|
if tr, ok := reader.(*TimeoutWrapperReader); ok {
|
||||||
|
if _, ok := tr.Reader.(*SingleReader); ok {
|
||||||
|
doCopyV = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, ok := reader.(*SingleReader); ok {
|
||||||
|
doCopyV = true
|
||||||
|
}
|
||||||
|
if !doCopyV {
|
||||||
|
return Copy(reader, writer, options...)
|
||||||
|
}
|
||||||
|
var handler copyHandler
|
||||||
|
for _, option := range options {
|
||||||
|
option(&handler)
|
||||||
|
}
|
||||||
|
err := copyVInternal(reader, writer, &handler)
|
||||||
|
if err != nil && errors.Cause(err) != io.EOF {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyVInternal(r Reader, w Writer, handler *copyHandler) error {
|
||||||
// channel buffer size is maxBuffer/maxPerPacketLen (ignore the case of many small packets)
|
// channel buffer size is maxBuffer/maxPerPacketLen (ignore the case of many small packets)
|
||||||
// default buffer size:
|
// default buffer size:
|
||||||
// 0 in ARM MIPS MIPSLE
|
// 0 in ARM MIPS MIPSLE
|
||||||
@@ -162,23 +181,25 @@ func copyV(r *SingleReader, w Writer, handler *copyHandler) error {
|
|||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
defer close(cache)
|
defer close(cache)
|
||||||
for {
|
for {
|
||||||
b, err := r.readBuffer()
|
mb, err := r.ReadMultiBuffer()
|
||||||
if err == nil {
|
for _, b := range mb {
|
||||||
select {
|
if err == nil {
|
||||||
case cache <- b:
|
select {
|
||||||
// must be write error
|
case cache <- b:
|
||||||
case <-stopRead:
|
// must be write error
|
||||||
b.Release()
|
case <-stopRead:
|
||||||
|
b.Release()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
rErr = err
|
||||||
|
select {
|
||||||
|
case cache <- b:
|
||||||
|
case <-stopRead:
|
||||||
|
b.Release()
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
rErr = err
|
|
||||||
select {
|
|
||||||
case cache <- b:
|
|
||||||
case <-stopRead:
|
|
||||||
b.Release()
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -394,7 +394,7 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, dialer inte
|
|||||||
err = encoding.XtlsRead(serverReader, clientWriter, timer, conn, trafficState, false, ctx)
|
err = encoding.XtlsRead(serverReader, clientWriter, timer, conn, trafficState, false, ctx)
|
||||||
} else {
|
} else {
|
||||||
// from serverReader.ReadMultiBuffer to clientWriter.WriteMultiBuffer
|
// from serverReader.ReadMultiBuffer to clientWriter.WriteMultiBuffer
|
||||||
err = buf.Copy(serverReader, clientWriter, buf.UpdateActivity(timer))
|
err = buf.TryCopyV(serverReader, clientWriter, buf.UpdateActivity(timer))
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user