writer.go 759 B

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