This commit is contained in:
风扇滑翔翼
2025-12-23 11:36:25 +00:00
committed by GitHub
parent ea5a53ce6d
commit 7dc1c4fc5b
2 changed files with 14 additions and 15 deletions

View File

@@ -115,7 +115,12 @@ func Copy(reader Reader, writer Writer, options ...CopyOption) error {
for _, option := range options { for _, option := range options {
option(&handler) option(&handler)
} }
err := copyInternal(reader, writer, &handler) var err error
if shouldUseCopyV(reader, writer) {
err = copyVInternal(reader, 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
} }
@@ -136,7 +141,12 @@ func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error
return writer.WriteMultiBuffer(mb) return writer.WriteMultiBuffer(mb)
} }
func TryCopyV(reader Reader, writer Writer, options ...CopyOption) error { func shouldUseCopyV(reader Reader, writer Writer) bool {
// if writer is not support writeV, directly return false
if _, ok := writer.(*BufferToBytesWriter); !ok {
return false
}
// try to figure out if the underlying reader is SingleReader
var doCopyV bool var doCopyV bool
if tr, ok := reader.(*TimeoutWrapperReader); ok { if tr, ok := reader.(*TimeoutWrapperReader); ok {
if _, ok := tr.Reader.(*SingleReader); ok { if _, ok := tr.Reader.(*SingleReader); ok {
@@ -146,18 +156,7 @@ func TryCopyV(reader Reader, writer Writer, options ...CopyOption) error {
if _, ok := reader.(*SingleReader); ok { if _, ok := reader.(*SingleReader); ok {
doCopyV = true doCopyV = true
} }
if !doCopyV { return 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 { func copyVInternal(r Reader, w Writer, handler *copyHandler) error {

View File

@@ -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.TryCopyV(serverReader, clientWriter, buf.UpdateActivity(timer)) err = buf.Copy(serverReader, clientWriter, buf.UpdateActivity(timer))
} }
if err != nil { if err != nil {