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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package proxy
  2. import (
  3. "context"
  4. "net"
  5. "sync"
  6. "github.com/juju/errors"
  7. uuid "github.com/satori/go.uuid"
  8. "go.uber.org/zap"
  9. "github.com/9seconds/mtg/config"
  10. )
  11. type proxyAcceptCallback func(context.Context, context.CancelFunc, net.Conn, string, *sync.WaitGroup, *config.Config) error
  12. type Proxy struct {
  13. conf *config.Config
  14. acceptCallback proxyAcceptCallback
  15. }
  16. func (p *Proxy) Serve() error {
  17. lsock, err := net.Listen("tcp", p.conf.BindAddr())
  18. if err != nil {
  19. return errors.Annotate(err, "Cannot create listen socket")
  20. }
  21. for {
  22. if conn, err := lsock.Accept(); err != nil {
  23. zap.S().Errorw("Cannot allocate incoming connection", "error", err)
  24. } else {
  25. go p.accept(conn)
  26. }
  27. }
  28. }
  29. func (p *Proxy) accept(conn net.Conn) {
  30. connID := uuid.NewV4().String()
  31. log := zap.S().With("connection_id", connID)
  32. defer func() {
  33. conn.Close()
  34. if err := recover(); err != nil {
  35. log.Errorw("Crash of accept handler", "error", err)
  36. }
  37. }()
  38. log.Infow("Client connected", "addr", conn.RemoteAddr())
  39. ctx, cancel := context.WithCancel(context.Background())
  40. wait := &sync.WaitGroup{}
  41. if err := p.acceptCallback(ctx, cancel, conn, connID, wait, p.conf); err != nil {
  42. log.Errorw("Cannot initialize connection", "error", err)
  43. cancel()
  44. }
  45. <-ctx.Done()
  46. wait.Wait()
  47. log.Infow("Client disconnected", "addr", conn.RemoteAddr())
  48. }