io.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. // NewReader creates a new Reader.
  42. // The Reader instance doesn't take the ownership of reader.
  43. func NewReader(reader io.Reader) Reader {
  44. if mr, ok := reader.(Reader); ok {
  45. return mr
  46. }
  47. if useReadv {
  48. if sc, ok := reader.(syscall.Conn); ok {
  49. rawConn, err := sc.SyscallConn()
  50. if err != nil {
  51. newError("failed to get sysconn").Base(err).WriteToLog()
  52. } else {
  53. return NewReadVReader(reader, rawConn)
  54. }
  55. }
  56. }
  57. return NewBytesToBufferReader(reader)
  58. }
  59. // NewWriter creates a new Writer.
  60. func NewWriter(writer io.Writer) Writer {
  61. if mw, ok := writer.(Writer); ok {
  62. return mw
  63. }
  64. return &BufferToBytesWriter{
  65. Writer: writer,
  66. }
  67. }
  68. // NewSequentialWriter returns a Writer that write Buffers in a MultiBuffer sequentially.
  69. func NewSequentialWriter(writer io.Writer) Writer {
  70. return &seqWriter{
  71. writer: writer,
  72. }
  73. }