writer.go 758 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package mux
  2. import (
  3. "v2ray.com/core/common/buf"
  4. "v2ray.com/core/common/serial"
  5. )
  6. type muxWriter struct {
  7. meta *FrameMetadata
  8. writer buf.Writer
  9. }
  10. func (w *muxWriter) Write(b *buf.Buffer) error {
  11. frame := buf.New()
  12. frame.AppendSupplier(w.meta.AsSupplier())
  13. if w.meta.SessionStatus == SessionStatusNew {
  14. w.meta.SessionStatus = SessionStatusKeep
  15. }
  16. frame.AppendSupplier(serial.WriteUint16(0))
  17. lengthBytes := frame.BytesFrom(-2)
  18. nBytes, err := frame.Write(b.Bytes())
  19. if err != nil {
  20. return err
  21. }
  22. serial.Uint16ToBytes(uint16(nBytes), lengthBytes[:0])
  23. if err := w.writer.Write(frame); err != nil {
  24. frame.Release()
  25. b.Release()
  26. return err
  27. }
  28. b.SliceFrom(nBytes)
  29. if !b.IsEmpty() {
  30. return w.Write(b)
  31. }
  32. b.Release()
  33. return nil
  34. }