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
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

conn.go 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package faketls
  2. import (
  3. "bytes"
  4. "fmt"
  5. "math/rand/v2"
  6. "github.com/9seconds/mtg/v2/essentials"
  7. "github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
  8. )
  9. type Conn struct {
  10. essentials.Conn
  11. readBuffer bytes.Buffer
  12. }
  13. func (c *Conn) Read(p []byte) (int, error) {
  14. if n, _ := c.readBuffer.Read(p); n > 0 {
  15. return n, nil
  16. }
  17. rec := record.AcquireRecord()
  18. defer record.ReleaseRecord(rec)
  19. for {
  20. if err := rec.Read(c.Conn); err != nil {
  21. return 0, err //nolint: wrapcheck
  22. }
  23. switch rec.Type { //nolint: exhaustive
  24. case record.TypeApplicationData:
  25. rec.Payload.WriteTo(&c.readBuffer) //nolint: errcheck
  26. return c.readBuffer.Read(p) //nolint: wrapcheck
  27. case record.TypeChangeCipherSpec:
  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 := rand.IntN(record.TLSMaxRecordSize)
  41. if chunkSize > len(p) || chunkSize == 0 {
  42. chunkSize = len(p)
  43. }
  44. rec.Payload.Reset()
  45. rec.Payload.Write(p[:chunkSize])
  46. err := rec.Dump(c.Conn)
  47. written += chunkSize
  48. if err != nil {
  49. return written, err
  50. }
  51. p = p[chunkSize:]
  52. }
  53. return written, nil
  54. }