writer.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package buf
  2. import (
  3. "io"
  4. "v2ray.com/core/common/errors"
  5. )
  6. // BufferToBytesWriter is a Writer that writes alloc.Buffer into underlying writer.
  7. type BufferToBytesWriter struct {
  8. writer io.Writer
  9. }
  10. // Write implements Writer.Write(). Write() takes ownership of the given buffer.
  11. func (w *BufferToBytesWriter) Write(mb MultiBuffer) error {
  12. defer mb.Release()
  13. bs := mb.ToNetBuffers()
  14. _, err := bs.WriteTo(w.writer)
  15. return err
  16. }
  17. type writerAdapter struct {
  18. writer MultiBufferWriter
  19. }
  20. // Write implements buf.MultiBufferWriter.
  21. func (w *writerAdapter) Write(mb MultiBuffer) error {
  22. return w.writer.WriteMultiBuffer(mb)
  23. }
  24. type mergingWriter struct {
  25. writer io.Writer
  26. buffer []byte
  27. }
  28. func (w *mergingWriter) Write(mb MultiBuffer) error {
  29. defer mb.Release()
  30. for !mb.IsEmpty() {
  31. nBytes, _ := mb.Read(w.buffer)
  32. if _, err := w.writer.Write(w.buffer[:nBytes]); err != nil {
  33. return err
  34. }
  35. }
  36. return nil
  37. }
  38. type seqWriter struct {
  39. writer io.Writer
  40. }
  41. func (w *seqWriter) Write(mb MultiBuffer) error {
  42. defer mb.Release()
  43. for _, b := range mb {
  44. if b.IsEmpty() {
  45. continue
  46. }
  47. if _, err := w.writer.Write(b.Bytes()); err != nil {
  48. return err
  49. }
  50. }
  51. return nil
  52. }
  53. var (
  54. _ MultiBufferWriter = (*bytesToBufferWriter)(nil)
  55. )
  56. type bytesToBufferWriter struct {
  57. writer Writer
  58. }
  59. // Write implements io.Writer.
  60. func (w *bytesToBufferWriter) Write(payload []byte) (int, error) {
  61. mb := NewMultiBuffer()
  62. mb.Write(payload)
  63. if err := w.writer.Write(mb); err != nil {
  64. return 0, err
  65. }
  66. return len(payload), nil
  67. }
  68. func (w *bytesToBufferWriter) WriteMultiBuffer(mb MultiBuffer) error {
  69. return w.writer.Write(mb)
  70. }
  71. func (w *bytesToBufferWriter) ReadFrom(reader io.Reader) (int64, error) {
  72. mbReader := NewReader(reader)
  73. totalBytes := int64(0)
  74. eof := false
  75. for !eof {
  76. mb, err := mbReader.Read()
  77. if err == io.EOF {
  78. eof = true
  79. } else if err != nil {
  80. return totalBytes, err
  81. }
  82. totalBytes += int64(mb.Len())
  83. if err := w.writer.Write(mb); err != nil {
  84. return totalBytes, err
  85. }
  86. }
  87. return totalBytes, nil
  88. }
  89. type noOpWriter struct{}
  90. func (noOpWriter) Write(b MultiBuffer) error {
  91. b.Release()
  92. return nil
  93. }
  94. type noOpBytesWriter struct{}
  95. func (noOpBytesWriter) Write(b []byte) (int, error) {
  96. return len(b), nil
  97. }
  98. func (noOpBytesWriter) ReadFrom(reader io.Reader) (int64, error) {
  99. b := New()
  100. defer b.Release()
  101. totalBytes := int64(0)
  102. for {
  103. err := b.Reset(ReadFrom(reader))
  104. totalBytes += int64(b.Len())
  105. if err != nil {
  106. if errors.Cause(err) == io.EOF {
  107. return totalBytes, nil
  108. }
  109. return totalBytes, err
  110. }
  111. }
  112. }
  113. var (
  114. Discard Writer = noOpWriter{}
  115. DiscardBytes io.Writer = noOpBytesWriter{}
  116. )