| 12345678910111213141516171819202122232425262728293031323334353637383940 | package ioimport (	"io"	"v2ray.com/core/common/errors"	"v2ray.com/core/common/log")// Pipe dumps all content from reader to writer, until an error happens.func Pipe(reader Reader, writer Writer) error {	for {		buffer, err := reader.Read()		if err != nil {			log.Debug("IO: Pipe exits as ", err)			return err		}		if buffer.IsEmpty() {			buffer.Release()			continue		}		err = writer.Write(buffer)		if err != nil {			log.Debug("IO: Pipe exits as ", err)			buffer.Release()			return err		}	}}// PipeUntilEOF behaves the same as Pipe(). The only difference is PipeUntilEOF returns nil on EOF.func PipeUntilEOF(reader Reader, writer Writer) error {	err := Pipe(reader, writer)	if err != nil && errors.Cause(err) != io.EOF {		return err	}	return nil}
 |