addons.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. // +build !confonly
  2. package encoding
  3. import (
  4. "io"
  5. "github.com/golang/protobuf/proto"
  6. "v2ray.com/core/common/buf"
  7. "v2ray.com/core/common/protocol"
  8. "v2ray.com/core/proxy/vless"
  9. )
  10. func EncodeHeaderAddons(buffer *buf.Buffer, addons *Addons) error {
  11. switch addons.Flow {
  12. case vless.XRO:
  13. if bytes, err := proto.Marshal(addons); err != nil {
  14. newError("failed to marshal addons protobuf value").Base(err)
  15. } else {
  16. if err := buffer.WriteByte(byte(len(bytes))); err != nil {
  17. return newError("failed to write addons protobuf length").Base(err)
  18. }
  19. if _, err := buffer.Write(bytes); err != nil {
  20. return newError("failed to write addons protobuf value").Base(err)
  21. }
  22. }
  23. default:
  24. if err := buffer.WriteByte(0); err != nil {
  25. return newError("failed to write addons protobuf length").Base(err)
  26. }
  27. }
  28. return nil
  29. }
  30. func DecodeHeaderAddons(buffer *buf.Buffer, reader io.Reader) (*Addons, error) {
  31. addons := new(Addons)
  32. buffer.Clear()
  33. if _, err := buffer.ReadFullFrom(reader, 1); err != nil {
  34. return nil, newError("failed to read addons protobuf length").Base(err)
  35. }
  36. if length := int32(buffer.Byte(0)); length != 0 {
  37. buffer.Clear()
  38. if _, err := buffer.ReadFullFrom(reader, length); err != nil {
  39. return nil, newError("failed to read addons protobuf value").Base(err)
  40. }
  41. if err := proto.Unmarshal(buffer.Bytes(), addons); err != nil {
  42. return nil, newError("failed to unmarshal addons protobuf value").Base(err)
  43. }
  44. // Verification.
  45. switch addons.Flow {
  46. default:
  47. }
  48. }
  49. return addons, nil
  50. }
  51. // EncodeBodyAddons returns a Writer that auto-encrypt content written by caller.
  52. func EncodeBodyAddons(writer io.Writer, request *protocol.RequestHeader, addons *Addons) buf.Writer {
  53. switch addons.Flow {
  54. case vless.XRO:
  55. if request.Command == protocol.RequestCommandUDP {
  56. return NewMultiLengthPacketWriter(writer.(buf.Writer))
  57. }
  58. }
  59. return buf.NewWriter(writer)
  60. }
  61. // DecodeBodyAddons returns a Reader from which caller can fetch decrypted body.
  62. func DecodeBodyAddons(reader io.Reader, request *protocol.RequestHeader, addons *Addons) buf.Reader {
  63. switch addons.Flow {
  64. case vless.XRO:
  65. if request.Command == protocol.RequestCommandUDP {
  66. return NewLengthPacketReader(reader)
  67. }
  68. }
  69. return buf.NewReader(reader)
  70. }
  71. func NewMultiLengthPacketWriter(writer buf.Writer) *MultiLengthPacketWriter {
  72. return &MultiLengthPacketWriter{
  73. Writer: writer,
  74. }
  75. }
  76. type MultiLengthPacketWriter struct {
  77. buf.Writer
  78. }
  79. func (w *MultiLengthPacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  80. defer buf.ReleaseMulti(mb)
  81. mb2Write := make(buf.MultiBuffer, 0, len(mb)+1)
  82. for _, b := range mb {
  83. length := b.Len()
  84. if length == 0 || length+2 > buf.Size {
  85. continue
  86. }
  87. eb := buf.New()
  88. if err := eb.WriteByte(byte(length >> 8)); err != nil {
  89. eb.Release()
  90. continue
  91. }
  92. if err := eb.WriteByte(byte(length)); err != nil {
  93. eb.Release()
  94. continue
  95. }
  96. if _, err := eb.Write(b.Bytes()); err != nil {
  97. eb.Release()
  98. continue
  99. }
  100. mb2Write = append(mb2Write, eb)
  101. }
  102. if mb2Write.IsEmpty() {
  103. return nil
  104. }
  105. return w.Writer.WriteMultiBuffer(mb2Write)
  106. }
  107. func NewLengthPacketWriter(writer io.Writer) *LengthPacketWriter {
  108. return &LengthPacketWriter{
  109. Writer: writer,
  110. cache: make([]byte, 0, 65536),
  111. }
  112. }
  113. type LengthPacketWriter struct {
  114. io.Writer
  115. cache []byte
  116. }
  117. func (w *LengthPacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  118. length := mb.Len() // none of mb is nil
  119. //fmt.Println("Write", length)
  120. if length == 0 {
  121. return nil
  122. }
  123. defer func() {
  124. w.cache = w.cache[:0]
  125. }()
  126. w.cache = append(w.cache, byte(length>>8), byte(length))
  127. for i, b := range mb {
  128. w.cache = append(w.cache, b.Bytes()...)
  129. b.Release()
  130. mb[i] = nil
  131. }
  132. if _, err := w.Write(w.cache); err != nil {
  133. return newError("failed to write a packet").Base(err)
  134. }
  135. return nil
  136. }
  137. func NewLengthPacketReader(reader io.Reader) *LengthPacketReader {
  138. return &LengthPacketReader{
  139. Reader: reader,
  140. cache: make([]byte, 2),
  141. }
  142. }
  143. type LengthPacketReader struct {
  144. io.Reader
  145. cache []byte
  146. }
  147. func (r *LengthPacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  148. if _, err := io.ReadFull(r.Reader, r.cache); err != nil { // maybe EOF
  149. return nil, newError("failed to read packet length").Base(err)
  150. }
  151. length := int(r.cache[0])<<8 | int(r.cache[1])
  152. //fmt.Println("Read", length)
  153. mb := make(buf.MultiBuffer, 0, length/buf.Size+1)
  154. for length > 0 {
  155. size := length
  156. if length > buf.Size {
  157. size = buf.Size
  158. }
  159. length -= size
  160. b := buf.New()
  161. if _, err := b.ReadFullFrom(r.Reader, int32(size)); err != nil {
  162. return nil, newError("failed to read packet payload").Base(err)
  163. }
  164. mb = append(mb, b)
  165. }
  166. return mb, nil
  167. }