1
0

conn.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package v2raygrpclite
  2. import (
  3. std_bufio "bufio"
  4. "encoding/binary"
  5. "io"
  6. "net"
  7. "net/http"
  8. "os"
  9. "time"
  10. "github.com/sagernet/sing/common"
  11. "github.com/sagernet/sing/common/baderror"
  12. "github.com/sagernet/sing/common/buf"
  13. M "github.com/sagernet/sing/common/metadata"
  14. "github.com/sagernet/sing/common/varbin"
  15. )
  16. // kanged from: https://github.com/Qv2ray/gun-lite
  17. var _ net.Conn = (*GunConn)(nil)
  18. type GunConn struct {
  19. rawReader io.Reader
  20. reader *std_bufio.Reader
  21. writer io.Writer
  22. flusher http.Flusher
  23. create chan struct{}
  24. err error
  25. readRemaining int
  26. }
  27. func newGunConn(reader io.Reader, writer io.Writer, flusher http.Flusher) *GunConn {
  28. return &GunConn{
  29. rawReader: reader,
  30. reader: std_bufio.NewReader(reader),
  31. writer: writer,
  32. flusher: flusher,
  33. }
  34. }
  35. func newLateGunConn(writer io.Writer) *GunConn {
  36. return &GunConn{
  37. create: make(chan struct{}),
  38. writer: writer,
  39. }
  40. }
  41. func (c *GunConn) setup(reader io.Reader, err error) {
  42. if reader != nil {
  43. c.rawReader = reader
  44. c.reader = std_bufio.NewReader(reader)
  45. }
  46. c.err = err
  47. close(c.create)
  48. }
  49. func (c *GunConn) Read(b []byte) (n int, err error) {
  50. n, err = c.read(b)
  51. return n, baderror.WrapH2(err)
  52. }
  53. func (c *GunConn) read(b []byte) (n int, err error) {
  54. if c.reader == nil {
  55. <-c.create
  56. if c.err != nil {
  57. return 0, c.err
  58. }
  59. }
  60. if c.readRemaining > 0 {
  61. if len(b) > c.readRemaining {
  62. b = b[:c.readRemaining]
  63. }
  64. n, err = c.reader.Read(b)
  65. c.readRemaining -= n
  66. return
  67. }
  68. _, err = c.reader.Discard(6)
  69. if err != nil {
  70. return
  71. }
  72. dataLen, err := binary.ReadUvarint(c.reader)
  73. if err != nil {
  74. return
  75. }
  76. readLen := int(dataLen)
  77. c.readRemaining = readLen
  78. if len(b) > readLen {
  79. b = b[:readLen]
  80. }
  81. n, err = c.reader.Read(b)
  82. c.readRemaining -= n
  83. return
  84. }
  85. func (c *GunConn) Write(b []byte) (n int, err error) {
  86. varLen := varbin.UvarintLen(uint64(len(b)))
  87. buffer := buf.NewSize(6 + varLen + len(b))
  88. header := buffer.Extend(6 + varLen)
  89. header[0] = 0x00
  90. binary.BigEndian.PutUint32(header[1:5], uint32(1+varLen+len(b)))
  91. header[5] = 0x0A
  92. binary.PutUvarint(header[6:], uint64(len(b)))
  93. common.Must1(buffer.Write(b))
  94. _, err = c.writer.Write(buffer.Bytes())
  95. if err != nil {
  96. return 0, baderror.WrapH2(err)
  97. }
  98. if c.flusher != nil {
  99. c.flusher.Flush()
  100. }
  101. return len(b), nil
  102. }
  103. func (c *GunConn) WriteBuffer(buffer *buf.Buffer) error {
  104. defer buffer.Release()
  105. dataLen := buffer.Len()
  106. varLen := varbin.UvarintLen(uint64(dataLen))
  107. header := buffer.ExtendHeader(6 + varLen)
  108. header[0] = 0x00
  109. binary.BigEndian.PutUint32(header[1:5], uint32(1+varLen+dataLen))
  110. header[5] = 0x0A
  111. binary.PutUvarint(header[6:], uint64(dataLen))
  112. err := common.Error(c.writer.Write(buffer.Bytes()))
  113. if err != nil {
  114. return baderror.WrapH2(err)
  115. }
  116. if c.flusher != nil {
  117. c.flusher.Flush()
  118. }
  119. return nil
  120. }
  121. func (c *GunConn) FrontHeadroom() int {
  122. return 6 + binary.MaxVarintLen64
  123. }
  124. func (c *GunConn) Close() error {
  125. return common.Close(c.rawReader, c.writer)
  126. }
  127. func (c *GunConn) LocalAddr() net.Addr {
  128. return M.Socksaddr{}
  129. }
  130. func (c *GunConn) RemoteAddr() net.Addr {
  131. return M.Socksaddr{}
  132. }
  133. func (c *GunConn) SetDeadline(t time.Time) error {
  134. return os.ErrInvalid
  135. }
  136. func (c *GunConn) SetReadDeadline(t time.Time) error {
  137. return os.ErrInvalid
  138. }
  139. func (c *GunConn) SetWriteDeadline(t time.Time) error {
  140. return os.ErrInvalid
  141. }
  142. func (c *GunConn) NeedAdditionalReadDeadline() bool {
  143. return true
  144. }