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
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

conn.go 1.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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.TypeChangeCipherSpec:
  25. case record.TypeApplicationData:
  26. rec.Payload.WriteTo(&c.readBuffer)
  27. n, err := c.readBuffer.Read(p)
  28. return n, err
  29. default:
  30. return 0, fmt.Errorf("unsupported record type %v", rec.Type)
  31. }
  32. }
  33. }
  34. func (c *Conn) Write(p []byte) (int, error) {
  35. rec := record.AcquireRecord()
  36. defer record.ReleaseRecord(rec)
  37. rec.Type = record.TypeApplicationData
  38. rec.Version = record.Version12
  39. written := 0
  40. for len(p) > 0 {
  41. chunkSize := rand.Intn(record.TLSMaxRecordSize)
  42. if chunkSize > len(p) || chunkSize == 0 {
  43. chunkSize = len(p)
  44. }
  45. rec.Payload.Reset()
  46. rec.Payload.Write(p[:chunkSize])
  47. if err := rec.Dump(c.Conn); err != nil {
  48. return 0, err
  49. }
  50. written += chunkSize
  51. p = p[chunkSize:]
  52. }
  53. return written, nil
  54. }