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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

relay.go 1.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package relay
  2. import (
  3. "context"
  4. "io"
  5. "net"
  6. "sync"
  7. )
  8. func Relay(ctx context.Context, log Logger, bufferSize int,
  9. telegramConn net.Conn, clientConn io.ReadWriteCloser) {
  10. defer telegramConn.Close()
  11. defer clientConn.Close()
  12. ctx, cancel := context.WithTimeout(ctx, getConnectionTimeToLive())
  13. defer cancel()
  14. go func() {
  15. <-ctx.Done()
  16. telegramConn.Close()
  17. clientConn.Close()
  18. }()
  19. buffers := acquireEastWest(bufferSize)
  20. defer releaseEastWest(buffers)
  21. telegramConn = conn{
  22. Conn: telegramConn,
  23. }
  24. wg := &sync.WaitGroup{}
  25. wg.Add(2) // nolint: gomnd
  26. go pump(log, telegramConn, clientConn, wg, buffers.east, "east -> west")
  27. pump(log, clientConn, telegramConn, wg, buffers.west, "west -> east")
  28. wg.Wait()
  29. }
  30. func pump(log Logger, src io.ReadCloser, dst io.WriteCloser, wg *sync.WaitGroup,
  31. buf []byte, direction string) {
  32. defer wg.Done()
  33. defer src.Close()
  34. defer dst.Close()
  35. if n, err := io.CopyBuffer(dst, src, buf); err != nil {
  36. log.Printf("cannot pump %s (written %d bytes): %w", direction, n, err)
  37. }
  38. }