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
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

relay.go 1.2KB

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