writer.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package mux
  2. import (
  3. "v2ray.com/core/common/buf"
  4. "v2ray.com/core/common/net"
  5. "v2ray.com/core/common/serial"
  6. )
  7. type muxWriter struct {
  8. id uint16
  9. dest net.Destination
  10. writer buf.Writer
  11. followup bool
  12. }
  13. func (w *muxWriter) writeInternal(b *buf.Buffer) error {
  14. meta := FrameMetadata{
  15. SessionID: w.id,
  16. Target: w.dest,
  17. }
  18. if w.followup {
  19. meta.SessionStatus = SessionStatusKeep
  20. } else {
  21. w.followup = true
  22. meta.SessionStatus = SessionStatusNew
  23. }
  24. if b.Len() > 0 {
  25. meta.Option.Add(OptionData)
  26. }
  27. frame := buf.New()
  28. frame.AppendSupplier(meta.AsSupplier())
  29. if b.Len() > 0 {
  30. frame.AppendSupplier(serial.WriteUint16(0))
  31. lengthBytes := frame.BytesFrom(-2)
  32. nBytes, err := frame.Write(b.Bytes())
  33. if err != nil {
  34. frame.Release()
  35. return err
  36. }
  37. serial.Uint16ToBytes(uint16(nBytes), lengthBytes[:0])
  38. b.SliceFrom(nBytes)
  39. }
  40. return w.writer.Write(frame)
  41. }
  42. func (w *muxWriter) Write(b *buf.Buffer) error {
  43. defer b.Release()
  44. if err := w.writeInternal(b); err != nil {
  45. return err
  46. }
  47. for !b.IsEmpty() {
  48. if err := w.writeInternal(b); err != nil {
  49. return err
  50. }
  51. }
  52. return nil
  53. }
  54. func (w *muxWriter) Close() {
  55. meta := FrameMetadata{
  56. SessionID: w.id,
  57. Target: w.dest,
  58. SessionStatus: SessionStatusEnd,
  59. }
  60. frame := buf.New()
  61. frame.AppendSupplier(meta.AsSupplier())
  62. w.writer.Write(frame)
  63. }