io.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package buf
  2. import (
  3. "io"
  4. "syscall"
  5. "time"
  6. )
  7. // Reader extends io.Reader with MultiBuffer.
  8. type Reader interface {
  9. // ReadMultiBuffer reads content from underlying reader, and put it into a MultiBuffer.
  10. ReadMultiBuffer() (MultiBuffer, error)
  11. }
  12. // ErrReadTimeout is an error that happens with IO timeout.
  13. var ErrReadTimeout = newError("IO timeout")
  14. // TimeoutReader is a reader that returns error if Read() operation takes longer than the given timeout.
  15. type TimeoutReader interface {
  16. ReadMultiBufferTimeout(time.Duration) (MultiBuffer, error)
  17. }
  18. // Writer extends io.Writer with MultiBuffer.
  19. type Writer interface {
  20. // WriteMultiBuffer writes a MultiBuffer into underlying writer.
  21. WriteMultiBuffer(MultiBuffer) error
  22. }
  23. // ReadFrom creates a Supplier to read from a given io.Reader.
  24. func ReadFrom(reader io.Reader) Supplier {
  25. return func(b []byte) (int, error) {
  26. return reader.Read(b)
  27. }
  28. }
  29. // ReadFullFrom creates a Supplier to read full buffer from a given io.Reader.
  30. func ReadFullFrom(reader io.Reader, size int32) Supplier {
  31. return func(b []byte) (int, error) {
  32. return io.ReadFull(reader, b[:size])
  33. }
  34. }
  35. // ReadAtLeastFrom create a Supplier to read at least size bytes from the given io.Reader.
  36. func ReadAtLeastFrom(reader io.Reader, size int) Supplier {
  37. return func(b []byte) (int, error) {
  38. return io.ReadAtLeast(reader, b, size)
  39. }
  40. }
  41. func WriteAllBytes(writer io.Writer, payload []byte) error {
  42. for len(payload) > 0 {
  43. n, err := writer.Write(payload)
  44. if err != nil {
  45. return err
  46. }
  47. payload = payload[n:]
  48. }
  49. return nil
  50. }
  51. // NewReader creates a new Reader.
  52. // The Reader instance doesn't take the ownership of reader.
  53. func NewReader(reader io.Reader) Reader {
  54. if mr, ok := reader.(Reader); ok {
  55. return mr
  56. }
  57. if useReadv {
  58. if sc, ok := reader.(syscall.Conn); ok {
  59. rawConn, err := sc.SyscallConn()
  60. if err != nil {
  61. newError("failed to get sysconn").Base(err).WriteToLog()
  62. } else {
  63. return NewReadVReader(reader, rawConn)
  64. }
  65. }
  66. }
  67. return NewBytesToBufferReader(reader)
  68. }
  69. // NewWriter creates a new Writer.
  70. func NewWriter(writer io.Writer) Writer {
  71. if mw, ok := writer.(Writer); ok {
  72. return mw
  73. }
  74. return &BufferToBytesWriter{
  75. Writer: writer,
  76. }
  77. }
  78. // NewSequentialWriter returns a Writer that write Buffers in a MultiBuffer sequentially.
  79. func NewSequentialWriter(writer io.Writer) Writer {
  80. return &seqWriter{
  81. writer: writer,
  82. }
  83. }