Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

conn.go 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package faketls
  2. import (
  3. "bytes"
  4. "fmt"
  5. "net"
  6. "github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
  7. )
  8. type Conn struct {
  9. net.Conn
  10. readBuffer bytes.Buffer
  11. }
  12. func (c *Conn) Read(p []byte) (int, error) {
  13. if n, _ := c.readBuffer.Read(p); n > 0 {
  14. return n, nil
  15. }
  16. rec := record.AcquireRecord()
  17. defer record.ReleaseRecord(rec)
  18. for {
  19. if err := rec.Read(c.Conn); err != nil {
  20. return 0, err // nolint: wrapcheck
  21. }
  22. switch rec.Type { // nolint: exhaustive
  23. case record.TypeChangeCipherSpec:
  24. case record.TypeApplicationData:
  25. rec.Payload.WriteTo(&c.readBuffer)
  26. n, err := c.readBuffer.Read(p)
  27. return n, err
  28. default:
  29. return 0, fmt.Errorf("unsupported record type %v", rec.Type)
  30. }
  31. }
  32. }
  33. func (c *Conn) Write(p []byte) (int, error) {
  34. rec := record.AcquireRecord()
  35. defer record.ReleaseRecord(rec)
  36. rec.Type = record.TypeApplicationData
  37. rec.Version = record.Version12
  38. written := 0
  39. for len(p) > 0 {
  40. chunkSize := record.TLSMaxRecordSize
  41. if chunkSize > len(p) {
  42. chunkSize = len(p)
  43. }
  44. rec.Payload.Reset()
  45. rec.Payload.Write(p[:chunkSize])
  46. if err := rec.Dump(c.Conn); err != nil {
  47. return 0, err
  48. }
  49. written += chunkSize
  50. p = p[chunkSize:]
  51. }
  52. return written, nil
  53. }