风扇滑翔翼 vor 5 Monaten
Ursprung
Commit
7dc1c4fc5b
2 geänderte Dateien mit 14 neuen und 15 gelöschten Zeilen
  1. 13 14
      common/buf/copy.go
  2. 1 1
      proxy/vless/outbound/outbound.go

+ 13 - 14
common/buf/copy.go

@@ -115,7 +115,12 @@ func Copy(reader Reader, writer Writer, options ...CopyOption) error {
 	for _, option := range options {
 		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 {
 		return err
 	}
@@ -136,7 +141,12 @@ func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error
 	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
 	if tr, ok := reader.(*TimeoutWrapperReader); 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 {
 		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
+	return doCopyV
 }
 
 func copyVInternal(r Reader, w Writer, handler *copyHandler) error {

+ 1 - 1
proxy/vless/outbound/outbound.go

@@ -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)
 		} else {
 			// 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 {