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

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