transport.go 783 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package io
  2. import (
  3. "io"
  4. "v2ray.com/core/common/errors"
  5. "v2ray.com/core/common/log"
  6. )
  7. // Pipe dumps all content from reader to writer, until an error happens.
  8. func Pipe(reader Reader, writer Writer) error {
  9. for {
  10. buffer, err := reader.Read()
  11. if err != nil {
  12. log.Debug("IO: Pipe exits as ", err)
  13. return err
  14. }
  15. if buffer.IsEmpty() {
  16. buffer.Release()
  17. continue
  18. }
  19. err = writer.Write(buffer)
  20. if err != nil {
  21. log.Debug("IO: Pipe exits as ", err)
  22. buffer.Release()
  23. return err
  24. }
  25. }
  26. }
  27. // PipeUntilEOF behaves the same as Pipe(). The only difference is PipeUntilEOF returns nil on EOF.
  28. func PipeUntilEOF(reader Reader, writer Writer) error {
  29. err := Pipe(reader, writer)
  30. if err != nil && errors.Cause(err) != io.EOF {
  31. return err
  32. }
  33. return nil
  34. }