rw.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package debug
  2. import (
  3. "encoding/hex"
  4. "io"
  5. "log"
  6. )
  7. /*
  8. Copy of testing/iotest Read- and WriteLogger, but using %q instead of %x for printing
  9. */
  10. type writeLogger struct {
  11. prefix string
  12. w io.Writer
  13. }
  14. func (l *writeLogger) Write(p []byte) (n int, err error) {
  15. n, err = l.w.Write(p)
  16. if err != nil {
  17. log.Printf("%s %q: %v", l.prefix, string(p[0:n]), err)
  18. } else {
  19. log.Printf("%s %q", l.prefix, string(p[0:n]))
  20. }
  21. return
  22. }
  23. // NewWriteLogger returns a writer that behaves like w except
  24. // that it logs (using log.Printf) each write to standard error,
  25. // printing the prefix and the hexadecimal data written.
  26. func NewWriteLogger(prefix string, w io.Writer) io.Writer {
  27. return &writeLogger{prefix, w}
  28. }
  29. type readLogger struct {
  30. prefix string
  31. r io.Reader
  32. }
  33. func (l *readLogger) Read(p []byte) (n int, err error) {
  34. n, err = l.r.Read(p)
  35. if err != nil {
  36. log.Printf("%s %q: %v", l.prefix, string(p[0:n]), err)
  37. } else {
  38. log.Printf("%s %q", l.prefix, string(p[0:n]))
  39. }
  40. return
  41. }
  42. // NewReadLogger returns a reader that behaves like r except
  43. // that it logs (using log.Print) each read to standard error,
  44. // printing the prefix and the hexadecimal data written.
  45. func NewReadLogger(prefix string, r io.Reader) io.Reader {
  46. return &readLogger{prefix, r}
  47. }
  48. type readHexLogger struct {
  49. prefix string
  50. r io.Reader
  51. }
  52. func (l *readHexLogger) Read(p []byte) (n int, err error) {
  53. n, err = l.r.Read(p)
  54. if err != nil {
  55. log.Printf("%s (%d bytes) Error: %v", l.prefix, n, err)
  56. } else {
  57. log.Printf("%s (%d bytes)", l.prefix, n)
  58. }
  59. log.Print("\n" + hex.Dump(p[:n]))
  60. return
  61. }
  62. // NewReadHexLogger returns a reader that behaves like r except
  63. // that it logs to stderr using ecoding/hex.
  64. func NewReadHexLogger(prefix string, r io.Reader) io.Reader {
  65. return &readHexLogger{prefix, r}
  66. }