io.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. // WriteAllBytes ensures all bytes are written into the given writer.
  36. func WriteAllBytes(writer io.Writer, payload []byte) error {
  37. for len(payload) > 0 {
  38. n, err := writer.Write(payload)
  39. if err != nil {
  40. return err
  41. }
  42. payload = payload[n:]
  43. }
  44. return nil
  45. }
  46. // NewReader creates a new Reader.
  47. // The Reader instance doesn't take the ownership of reader.
  48. func NewReader(reader io.Reader) Reader {
  49. if mr, ok := reader.(Reader); ok {
  50. return mr
  51. }
  52. if useReadv {
  53. if sc, ok := reader.(syscall.Conn); ok {
  54. rawConn, err := sc.SyscallConn()
  55. if err != nil {
  56. newError("failed to get sysconn").Base(err).WriteToLog()
  57. } else {
  58. return NewReadVReader(reader, rawConn)
  59. }
  60. }
  61. }
  62. return NewBytesToBufferReader(reader)
  63. }
  64. // NewWriter creates a new Writer.
  65. func NewWriter(writer io.Writer) Writer {
  66. if mw, ok := writer.(Writer); ok {
  67. return mw
  68. }
  69. return &BufferToBytesWriter{
  70. Writer: writer,
  71. }
  72. }