1
0

inbound_conn.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. package naive
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "math/rand"
  6. "net"
  7. "net/http"
  8. "os"
  9. "strings"
  10. "time"
  11. "github.com/sagernet/sing/common"
  12. "github.com/sagernet/sing/common/buf"
  13. M "github.com/sagernet/sing/common/metadata"
  14. "github.com/sagernet/sing/common/rw"
  15. )
  16. const kFirstPaddings = 8
  17. type naiveH1Conn struct {
  18. net.Conn
  19. readPadding int
  20. writePadding int
  21. readRemaining int
  22. paddingRemaining int
  23. }
  24. func (c *naiveH1Conn) Read(p []byte) (n int, err error) {
  25. n, err = c.read(p)
  26. return n, wrapHttpError(err)
  27. }
  28. func (c *naiveH1Conn) read(p []byte) (n int, err error) {
  29. if c.readRemaining > 0 {
  30. if len(p) > c.readRemaining {
  31. p = p[:c.readRemaining]
  32. }
  33. n, err = c.Conn.Read(p)
  34. if err != nil {
  35. return
  36. }
  37. c.readRemaining -= n
  38. return
  39. }
  40. if c.paddingRemaining > 0 {
  41. err = rw.SkipN(c.Conn, c.paddingRemaining)
  42. if err != nil {
  43. return
  44. }
  45. c.paddingRemaining = 0
  46. }
  47. if c.readPadding < kFirstPaddings {
  48. var paddingHdr []byte
  49. if len(p) >= 3 {
  50. paddingHdr = p[:3]
  51. } else {
  52. paddingHdr = make([]byte, 3)
  53. }
  54. _, err = io.ReadFull(c.Conn, paddingHdr)
  55. if err != nil {
  56. return
  57. }
  58. originalDataSize := int(binary.BigEndian.Uint16(paddingHdr[:2]))
  59. paddingSize := int(paddingHdr[2])
  60. if len(p) > originalDataSize {
  61. p = p[:originalDataSize]
  62. }
  63. n, err = c.Conn.Read(p)
  64. if err != nil {
  65. return
  66. }
  67. c.readPadding++
  68. c.readRemaining = originalDataSize - n
  69. c.paddingRemaining = paddingSize
  70. return
  71. }
  72. return c.Conn.Read(p)
  73. }
  74. func (c *naiveH1Conn) Write(p []byte) (n int, err error) {
  75. for pLen := len(p); pLen > 0; {
  76. var data []byte
  77. if pLen > 65535 {
  78. data = p[:65535]
  79. p = p[65535:]
  80. pLen -= 65535
  81. } else {
  82. data = p
  83. pLen = 0
  84. }
  85. var writeN int
  86. writeN, err = c.write(data)
  87. n += writeN
  88. if err != nil {
  89. break
  90. }
  91. }
  92. return n, wrapHttpError(err)
  93. }
  94. func (c *naiveH1Conn) write(p []byte) (n int, err error) {
  95. if c.writePadding < kFirstPaddings {
  96. paddingSize := rand.Intn(256)
  97. buffer := buf.NewSize(3 + len(p) + paddingSize)
  98. defer buffer.Release()
  99. header := buffer.Extend(3)
  100. binary.BigEndian.PutUint16(header, uint16(len(p)))
  101. header[2] = byte(paddingSize)
  102. common.Must1(buffer.Write(p))
  103. _, err = c.Conn.Write(buffer.Bytes())
  104. if err == nil {
  105. n = len(p)
  106. }
  107. c.writePadding++
  108. return
  109. }
  110. return c.Conn.Write(p)
  111. }
  112. func (c *naiveH1Conn) FrontHeadroom() int {
  113. if c.writePadding < kFirstPaddings {
  114. return 3
  115. }
  116. return 0
  117. }
  118. func (c *naiveH1Conn) RearHeadroom() int {
  119. if c.writePadding < kFirstPaddings {
  120. return 255
  121. }
  122. return 0
  123. }
  124. func (c *naiveH1Conn) WriterMTU() int {
  125. if c.writePadding < kFirstPaddings {
  126. return 65535
  127. }
  128. return 0
  129. }
  130. func (c *naiveH1Conn) WriteBuffer(buffer *buf.Buffer) error {
  131. defer buffer.Release()
  132. if c.writePadding < kFirstPaddings {
  133. bufferLen := buffer.Len()
  134. if bufferLen > 65535 {
  135. return common.Error(c.Write(buffer.Bytes()))
  136. }
  137. paddingSize := rand.Intn(256)
  138. header := buffer.ExtendHeader(3)
  139. binary.BigEndian.PutUint16(header, uint16(bufferLen))
  140. header[2] = byte(paddingSize)
  141. buffer.Extend(paddingSize)
  142. c.writePadding++
  143. }
  144. return wrapHttpError(common.Error(c.Conn.Write(buffer.Bytes())))
  145. }
  146. // FIXME
  147. /*func (c *naiveH1Conn) WriteTo(w io.Writer) (n int64, err error) {
  148. if c.readPadding < kFirstPaddings {
  149. n, err = bufio.WriteToN(c, w, kFirstPaddings-c.readPadding)
  150. } else {
  151. n, err = bufio.Copy(w, c.Conn)
  152. }
  153. return n, wrapHttpError(err)
  154. }
  155. func (c *naiveH1Conn) ReadFrom(r io.Reader) (n int64, err error) {
  156. if c.writePadding < kFirstPaddings {
  157. n, err = bufio.ReadFromN(c, r, kFirstPaddings-c.writePadding)
  158. } else {
  159. n, err = bufio.Copy(c.Conn, r)
  160. }
  161. return n, wrapHttpError(err)
  162. }
  163. */
  164. func (c *naiveH1Conn) Upstream() any {
  165. return c.Conn
  166. }
  167. func (c *naiveH1Conn) ReaderReplaceable() bool {
  168. return c.readPadding == kFirstPaddings
  169. }
  170. func (c *naiveH1Conn) WriterReplaceable() bool {
  171. return c.writePadding == kFirstPaddings
  172. }
  173. type naiveH2Conn struct {
  174. reader io.Reader
  175. writer io.Writer
  176. flusher http.Flusher
  177. rAddr net.Addr
  178. readPadding int
  179. writePadding int
  180. readRemaining int
  181. paddingRemaining int
  182. }
  183. func (c *naiveH2Conn) Read(p []byte) (n int, err error) {
  184. n, err = c.read(p)
  185. return n, wrapHttpError(err)
  186. }
  187. func (c *naiveH2Conn) read(p []byte) (n int, err error) {
  188. if c.readRemaining > 0 {
  189. if len(p) > c.readRemaining {
  190. p = p[:c.readRemaining]
  191. }
  192. n, err = c.reader.Read(p)
  193. if err != nil {
  194. return
  195. }
  196. c.readRemaining -= n
  197. return
  198. }
  199. if c.paddingRemaining > 0 {
  200. err = rw.SkipN(c.reader, c.paddingRemaining)
  201. if err != nil {
  202. return
  203. }
  204. c.paddingRemaining = 0
  205. }
  206. if c.readPadding < kFirstPaddings {
  207. var paddingHdr []byte
  208. if len(p) >= 3 {
  209. paddingHdr = p[:3]
  210. } else {
  211. paddingHdr = make([]byte, 3)
  212. }
  213. _, err = io.ReadFull(c.reader, paddingHdr)
  214. if err != nil {
  215. return
  216. }
  217. originalDataSize := int(binary.BigEndian.Uint16(paddingHdr[:2]))
  218. paddingSize := int(paddingHdr[2])
  219. if len(p) > originalDataSize {
  220. p = p[:originalDataSize]
  221. }
  222. n, err = c.reader.Read(p)
  223. if err != nil {
  224. return
  225. }
  226. c.readPadding++
  227. c.readRemaining = originalDataSize - n
  228. c.paddingRemaining = paddingSize
  229. return
  230. }
  231. return c.reader.Read(p)
  232. }
  233. func (c *naiveH2Conn) Write(p []byte) (n int, err error) {
  234. for pLen := len(p); pLen > 0; {
  235. var data []byte
  236. if pLen > 65535 {
  237. data = p[:65535]
  238. p = p[65535:]
  239. pLen -= 65535
  240. } else {
  241. data = p
  242. pLen = 0
  243. }
  244. var writeN int
  245. writeN, err = c.write(data)
  246. n += writeN
  247. if err != nil {
  248. break
  249. }
  250. }
  251. if err == nil {
  252. c.flusher.Flush()
  253. }
  254. return n, wrapHttpError(err)
  255. }
  256. func (c *naiveH2Conn) write(p []byte) (n int, err error) {
  257. if c.writePadding < kFirstPaddings {
  258. paddingSize := rand.Intn(256)
  259. buffer := buf.NewSize(3 + len(p) + paddingSize)
  260. defer buffer.Release()
  261. header := buffer.Extend(3)
  262. binary.BigEndian.PutUint16(header, uint16(len(p)))
  263. header[2] = byte(paddingSize)
  264. common.Must1(buffer.Write(p))
  265. _, err = c.writer.Write(buffer.Bytes())
  266. if err == nil {
  267. n = len(p)
  268. }
  269. c.writePadding++
  270. return
  271. }
  272. return c.writer.Write(p)
  273. }
  274. func (c *naiveH2Conn) FrontHeadroom() int {
  275. if c.writePadding < kFirstPaddings {
  276. return 3
  277. }
  278. return 0
  279. }
  280. func (c *naiveH2Conn) RearHeadroom() int {
  281. if c.writePadding < kFirstPaddings {
  282. return 255
  283. }
  284. return 0
  285. }
  286. func (c *naiveH2Conn) WriterMTU() int {
  287. if c.writePadding < kFirstPaddings {
  288. return 65535
  289. }
  290. return 0
  291. }
  292. func (c *naiveH2Conn) WriteBuffer(buffer *buf.Buffer) error {
  293. defer buffer.Release()
  294. if c.writePadding < kFirstPaddings {
  295. bufferLen := buffer.Len()
  296. if bufferLen > 65535 {
  297. return common.Error(c.Write(buffer.Bytes()))
  298. }
  299. paddingSize := rand.Intn(256)
  300. header := buffer.ExtendHeader(3)
  301. binary.BigEndian.PutUint16(header, uint16(bufferLen))
  302. header[2] = byte(paddingSize)
  303. buffer.Extend(paddingSize)
  304. c.writePadding++
  305. }
  306. err := common.Error(c.writer.Write(buffer.Bytes()))
  307. if err == nil {
  308. c.flusher.Flush()
  309. }
  310. return wrapHttpError(err)
  311. }
  312. // FIXME
  313. /*func (c *naiveH2Conn) WriteTo(w io.Writer) (n int64, err error) {
  314. if c.readPadding < kFirstPaddings {
  315. n, err = bufio.WriteToN(c, w, kFirstPaddings-c.readPadding)
  316. } else {
  317. n, err = bufio.Copy(w, c.reader)
  318. }
  319. return n, wrapHttpError(err)
  320. }
  321. func (c *naiveH2Conn) ReadFrom(r io.Reader) (n int64, err error) {
  322. if c.writePadding < kFirstPaddings {
  323. n, err = bufio.ReadFromN(c, r, kFirstPaddings-c.writePadding)
  324. } else {
  325. n, err = bufio.Copy(c.writer, r)
  326. }
  327. return n, wrapHttpError(err)
  328. }*/
  329. func (c *naiveH2Conn) Close() error {
  330. return common.Close(
  331. c.reader,
  332. c.writer,
  333. )
  334. }
  335. func (c *naiveH2Conn) LocalAddr() net.Addr {
  336. return M.Socksaddr{}
  337. }
  338. func (c *naiveH2Conn) RemoteAddr() net.Addr {
  339. return c.rAddr
  340. }
  341. func (c *naiveH2Conn) SetDeadline(t time.Time) error {
  342. return os.ErrInvalid
  343. }
  344. func (c *naiveH2Conn) SetReadDeadline(t time.Time) error {
  345. return os.ErrInvalid
  346. }
  347. func (c *naiveH2Conn) SetWriteDeadline(t time.Time) error {
  348. return os.ErrInvalid
  349. }
  350. func (c *naiveH2Conn) NeedAdditionalReadDeadline() bool {
  351. return true
  352. }
  353. func (c *naiveH2Conn) UpstreamReader() any {
  354. return c.reader
  355. }
  356. func (c *naiveH2Conn) UpstreamWriter() any {
  357. return c.writer
  358. }
  359. func (c *naiveH2Conn) ReaderReplaceable() bool {
  360. return c.readPadding == kFirstPaddings
  361. }
  362. func (c *naiveH2Conn) WriterReplaceable() bool {
  363. return c.writePadding == kFirstPaddings
  364. }
  365. func wrapHttpError(err error) error {
  366. if err == nil {
  367. return err
  368. }
  369. if strings.Contains(err.Error(), "client disconnected") {
  370. return net.ErrClosed
  371. }
  372. if strings.Contains(err.Error(), "body closed by handler") {
  373. return net.ErrClosed
  374. }
  375. if strings.Contains(err.Error(), "canceled with error code 268") {
  376. return io.EOF
  377. }
  378. return err
  379. }