trim_writer.go 787 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package socketio
  2. import (
  3. "bytes"
  4. "io"
  5. )
  6. type trimWriter struct {
  7. trimChars string
  8. trimBuf []byte
  9. output io.Writer
  10. }
  11. func newTrimWriter(w io.Writer, trimChars string) *trimWriter {
  12. return &trimWriter{
  13. trimChars: trimChars,
  14. output: w,
  15. }
  16. }
  17. func (w *trimWriter) Write(p []byte) (int, error) {
  18. out := bytes.TrimRight(p, w.trimChars)
  19. buf := p[len(out):]
  20. var written int
  21. if (len(out) > 0) && (w.trimBuf != nil) {
  22. var err error
  23. if written, err = w.output.Write(w.trimBuf); err != nil {
  24. return 0, err
  25. }
  26. w.trimBuf = nil
  27. }
  28. if w.trimBuf != nil {
  29. w.trimBuf = append(w.trimBuf, buf...)
  30. } else {
  31. w.trimBuf = buf
  32. }
  33. if len(p) == 0 {
  34. return written, nil
  35. }
  36. ret, err := w.output.Write(out)
  37. if err != nil {
  38. return 0, err
  39. }
  40. return written + ret, nil
  41. }