writer.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package buf
  2. import "io"
  3. import "v2ray.com/core/common"
  4. // BufferToBytesWriter is a Writer that writes alloc.Buffer into underlying writer.
  5. type BufferToBytesWriter struct {
  6. writer io.Writer
  7. }
  8. // Write implements Writer.Write(). Write() takes ownership of the given buffer.
  9. func (v *BufferToBytesWriter) Write(buffer *Buffer) error {
  10. defer buffer.Release()
  11. for {
  12. nBytes, err := v.writer.Write(buffer.Bytes())
  13. if err != nil {
  14. return err
  15. }
  16. if nBytes == buffer.Len() {
  17. break
  18. }
  19. buffer.SliceFrom(nBytes)
  20. }
  21. return nil
  22. }
  23. // Release implements Releasable.Release().
  24. func (v *BufferToBytesWriter) Release() {
  25. common.Release(v.writer)
  26. }
  27. type BytesToBufferWriter struct {
  28. writer Writer
  29. }
  30. func (v *BytesToBufferWriter) Write(payload []byte) (int, error) {
  31. bytesWritten := 0
  32. size := len(payload)
  33. for size > 0 {
  34. buffer := New()
  35. nBytes, _ := buffer.Write(payload)
  36. size -= nBytes
  37. payload = payload[nBytes:]
  38. bytesWritten += nBytes
  39. err := v.writer.Write(buffer)
  40. if err != nil {
  41. return bytesWritten, err
  42. }
  43. }
  44. return bytesWritten, nil
  45. }
  46. // Release implements Releasable.Release()
  47. func (v *BytesToBufferWriter) Release() {
  48. v.writer.Release()
  49. }