writer.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. for {
  75. mb, err := mbReader.Read()
  76. if errors.Cause(err) == io.EOF {
  77. break
  78. } else if err != nil {
  79. return totalBytes, err
  80. }
  81. totalBytes += int64(mb.Len())
  82. if err := w.writer.Write(mb); err != nil {
  83. return totalBytes, err
  84. }
  85. }
  86. return totalBytes, nil
  87. }
  88. type noOpWriter struct{}
  89. func (noOpWriter) Write(b MultiBuffer) error {
  90. b.Release()
  91. return nil
  92. }
  93. type noOpBytesWriter struct{}
  94. func (noOpBytesWriter) Write(b []byte) (int, error) {
  95. return len(b), nil
  96. }
  97. func (noOpBytesWriter) ReadFrom(reader io.Reader) (int64, error) {
  98. b := New()
  99. defer b.Release()
  100. totalBytes := int64(0)
  101. for {
  102. err := b.Reset(ReadFrom(reader))
  103. totalBytes += int64(b.Len())
  104. if err != nil {
  105. if errors.Cause(err) == io.EOF {
  106. return totalBytes, nil
  107. }
  108. return totalBytes, err
  109. }
  110. }
  111. }
  112. var (
  113. // Discard is a Writer that swallows all contents written in.
  114. Discard Writer = noOpWriter{}
  115. // DiscardBytes is an io.Writer that swallows all contents written in.
  116. DiscardBytes io.Writer = noOpBytesWriter{}
  117. )