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
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

proxy.go 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package proxy
  2. import (
  3. "context"
  4. "net"
  5. "go.uber.org/zap"
  6. "mtg/config"
  7. "mtg/conntypes"
  8. "mtg/protocol"
  9. "mtg/stats"
  10. "mtg/utils"
  11. "mtg/wrappers/stream"
  12. )
  13. type Proxy struct {
  14. Logger *zap.SugaredLogger
  15. Context context.Context
  16. ClientProtocolMaker protocol.ClientProtocolMaker
  17. }
  18. func (p *Proxy) Serve(listener net.Listener) {
  19. doneChan := p.Context.Done()
  20. for {
  21. conn, err := listener.Accept()
  22. if err != nil {
  23. select {
  24. case <-doneChan:
  25. return
  26. default:
  27. p.Logger.Errorw("Cannot allocate incoming connection", "error", err)
  28. continue
  29. }
  30. }
  31. go p.accept(conn)
  32. }
  33. }
  34. func (p *Proxy) accept(conn net.Conn) {
  35. defer func() {
  36. conn.Close()
  37. if err := recover(); err != nil {
  38. stats.Stats.Crash()
  39. p.Logger.Errorw("Crash of accept handler", "error", err)
  40. }
  41. }()
  42. connID := conntypes.NewConnID()
  43. logger := p.Logger.With("connection_id", connID)
  44. if err := utils.InitTCP(conn); err != nil {
  45. logger.Errorw("Cannot initialize client TCP connection", "error", err)
  46. return
  47. }
  48. ctx, cancel := context.WithCancel(p.Context)
  49. defer cancel()
  50. clientConn := stream.NewClientConn(conn, connID)
  51. clientConn = stream.NewCtx(ctx, cancel, clientConn)
  52. clientConn = stream.NewTimeout(clientConn)
  53. defer clientConn.Close()
  54. clientProtocol := p.ClientProtocolMaker()
  55. clientConn, err := clientProtocol.Handshake(clientConn)
  56. if err != nil {
  57. logger.Warnw("Cannot perform client handshake", "error", err)
  58. return
  59. }
  60. stats.Stats.ClientConnected(clientProtocol.ConnectionType(), clientConn.RemoteAddr())
  61. defer stats.Stats.ClientDisconnected(clientProtocol.ConnectionType(), clientConn.RemoteAddr())
  62. logger.Infow("Client connected", "addr", conn.RemoteAddr())
  63. req := &protocol.TelegramRequest{
  64. Logger: logger,
  65. ClientConn: clientConn,
  66. ConnID: connID,
  67. Ctx: ctx,
  68. Cancel: cancel,
  69. ClientProtocol: clientProtocol,
  70. }
  71. err = nil
  72. if len(config.C.AdTag) > 0 {
  73. middleConnection(req)
  74. } else {
  75. err = directConnection(req)
  76. }
  77. logger.Infow("Client disconnected", "error", err, "addr", conn.RemoteAddr())
  78. }