transport.go 940 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package io
  2. import (
  3. "io"
  4. "github.com/v2ray/v2ray-core/common/alloc"
  5. )
  6. func RawReaderToChan(stream chan<- *alloc.Buffer, reader io.Reader) error {
  7. return ReaderToChan(stream, NewAdaptiveReader(reader))
  8. }
  9. // ReaderToChan dumps all content from a given reader to a chan by constantly reading it until EOF.
  10. func ReaderToChan(stream chan<- *alloc.Buffer, reader Reader) error {
  11. for {
  12. buffer, err := reader.Read()
  13. if alloc.Len(buffer) > 0 {
  14. stream <- buffer
  15. } else {
  16. alloc.Release(buffer)
  17. }
  18. if err != nil {
  19. return err
  20. }
  21. }
  22. }
  23. // ChanToWriter dumps all content from a given chan to a writer until the chan is closed.
  24. func ChanToWriter(writer io.Writer, stream <-chan *alloc.Buffer) error {
  25. for buffer := range stream {
  26. nBytes, err := writer.Write(buffer.Value)
  27. if nBytes < buffer.Len() {
  28. _, err = writer.Write(buffer.Value[nBytes:])
  29. }
  30. buffer.Release()
  31. if err != nil {
  32. return err
  33. }
  34. }
  35. return nil
  36. }