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 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package relay
  2. import (
  3. "context"
  4. "errors"
  5. "io"
  6. "sync"
  7. "github.com/9seconds/mtg/v2/essentials"
  8. "github.com/9seconds/mtg/v2/mtglib/internal/tls"
  9. )
  10. var bufPool = sync.Pool{
  11. New: func() any {
  12. b := make([]byte, tls.MaxRecordPayloadSize)
  13. return &b
  14. },
  15. }
  16. func Relay(ctx context.Context, log Logger, telegramConn, clientConn essentials.Conn) {
  17. defer telegramConn.Close() //nolint: errcheck
  18. defer clientConn.Close() //nolint: errcheck
  19. ctx, cancel := context.WithCancel(ctx)
  20. defer cancel()
  21. stop := context.AfterFunc(ctx, func() {
  22. telegramConn.Close() //nolint: errcheck
  23. clientConn.Close() //nolint: errcheck
  24. })
  25. defer stop()
  26. closeChan := make(chan struct{})
  27. go func() {
  28. defer close(closeChan)
  29. pump(log, telegramConn, clientConn, "client -> telegram")
  30. }()
  31. pump(log, clientConn, telegramConn, "telegram -> client")
  32. <-closeChan
  33. }
  34. func pump(log Logger, src, dst essentials.Conn, direction string) {
  35. bp := bufPool.Get().(*[]byte)
  36. defer bufPool.Put(bp)
  37. defer src.CloseRead() //nolint: errcheck
  38. defer dst.CloseWrite() //nolint: errcheck
  39. n, err := io.CopyBuffer(src, dst, *bp)
  40. switch {
  41. case err == nil:
  42. log.Printf("%s has been finished", direction)
  43. case errors.Is(err, io.EOF):
  44. log.Printf("%s has been finished because of EOF. Written %d bytes", direction, n)
  45. default:
  46. log.Printf("%s has been finished (written %d bytes): %v", direction, n, err)
  47. }
  48. }