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.

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