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.

direct.go 1014B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package proxy
  2. import (
  3. "io"
  4. "sync"
  5. "github.com/9seconds/mtg/conntypes"
  6. "github.com/9seconds/mtg/obfuscated2"
  7. "github.com/9seconds/mtg/protocol"
  8. "go.uber.org/zap"
  9. )
  10. const directPipeBufferSize = 1024
  11. func directConnection(request *protocol.TelegramRequest) error {
  12. telegramConnRaw, err := obfuscated2.TelegramProtocol(request)
  13. if err != nil {
  14. return err // nolint: wrapcheck
  15. }
  16. telegramConn := telegramConnRaw.(conntypes.StreamReadWriteCloser)
  17. defer telegramConn.Close()
  18. wg := &sync.WaitGroup{}
  19. wg.Add(2)
  20. go directPipe(telegramConn, request.ClientConn, wg, request.Logger)
  21. go directPipe(request.ClientConn, telegramConn, wg, request.Logger)
  22. wg.Wait()
  23. return nil
  24. }
  25. func directPipe(dst io.WriteCloser, src io.ReadCloser, wg *sync.WaitGroup, logger *zap.SugaredLogger) {
  26. defer func() {
  27. dst.Close()
  28. src.Close()
  29. wg.Done()
  30. }()
  31. buf := [directPipeBufferSize]byte{}
  32. if _, err := io.CopyBuffer(dst, src, buf[:]); err != nil {
  33. logger.Debugw("Cannot pump sockets", "error", err)
  34. }
  35. }