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
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

conn.go 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package faketls
  2. import (
  3. "bytes"
  4. "fmt"
  5. "math/rand"
  6. "net"
  7. "github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
  8. )
  9. type Conn struct {
  10. net.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. sendBuffer := acquireBytesBuffer()
  39. defer releaseBytesBuffer(sendBuffer)
  40. lenP := len(p)
  41. for len(p) > 0 {
  42. chunkSize := rand.Intn(record.TLSMaxRecordSize)
  43. if chunkSize > len(p) || chunkSize == 0 {
  44. chunkSize = len(p)
  45. }
  46. rec.Payload.Reset()
  47. rec.Payload.Write(p[:chunkSize])
  48. rec.Dump(sendBuffer) // nolint: errcheck
  49. p = p[chunkSize:]
  50. }
  51. if _, err := c.Conn.Write(sendBuffer.Bytes()); err != nil {
  52. return 0, err // nolint: wrapcheck
  53. }
  54. return lenP, nil
  55. }