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
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

conn.go 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package wrappers
  2. import (
  3. "net"
  4. "time"
  5. "go.uber.org/zap"
  6. )
  7. type ConnPurpose uint8
  8. func (c ConnPurpose) String() string {
  9. switch c {
  10. case ConnPurposeClient:
  11. return "client"
  12. case ConnPurposeTelegram:
  13. return "telegram"
  14. }
  15. return ""
  16. }
  17. const (
  18. ConnPurposeClient = iota
  19. ConnPurposeTelegram
  20. )
  21. const (
  22. connTimeoutRead = 5 * time.Minute
  23. connTimeoutWrite = 5 * time.Minute
  24. )
  25. type WrapConn struct {
  26. purpose ConnPurpose
  27. connID string
  28. conn net.Conn
  29. logger *zap.SugaredLogger
  30. publicIPv4 net.IP
  31. publicIPv6 net.IP
  32. }
  33. func (w *WrapConn) Write(p []byte) (int, error) {
  34. w.conn.SetWriteDeadline(time.Now().Add(connTimeoutWrite))
  35. n, err := w.conn.Write(p)
  36. w.logger.Debugw("Write to stream", "bytes", n, "error", err)
  37. return n, err
  38. }
  39. func (w *WrapConn) Read(p []byte) (int, error) {
  40. w.conn.SetReadDeadline(time.Now().Add(connTimeoutRead))
  41. n, err := w.conn.Read(p)
  42. w.logger.Debugw("Read from stream", "bytes", n, "error", err)
  43. return n, err
  44. }
  45. func (w *WrapConn) Close() error {
  46. defer w.LogDebug("Closed connection")
  47. return w.conn.Close()
  48. }
  49. func (w *WrapConn) LocalAddr() *net.TCPAddr {
  50. addr := w.conn.LocalAddr().(*net.TCPAddr)
  51. newAddr := *addr
  52. if w.RemoteAddr().IP.To4() != nil {
  53. if w.publicIPv4 != nil {
  54. newAddr.IP = w.publicIPv4
  55. }
  56. } else if w.publicIPv6 != nil {
  57. newAddr.IP = w.publicIPv6
  58. }
  59. return &newAddr
  60. }
  61. func (w *WrapConn) RemoteAddr() *net.TCPAddr {
  62. return w.conn.RemoteAddr().(*net.TCPAddr)
  63. }
  64. func (w *WrapConn) LogDebug(msg string, data ...interface{}) {
  65. w.logger.Debugw(msg, data...)
  66. }
  67. func (w *WrapConn) LogInfo(msg string, data ...interface{}) {
  68. w.logger.Infow(msg, data...)
  69. }
  70. func (w *WrapConn) LogWarn(msg string, data ...interface{}) {
  71. w.logger.Warnw(msg, data...)
  72. }
  73. func (w *WrapConn) LogError(msg string, data ...interface{}) {
  74. w.logger.Errorw(msg, data...)
  75. }
  76. func NewConn(connID string, purpose ConnPurpose, conn net.Conn, publicIPv4, publicIPv6 net.IP) WrapStreamReadWriteCloser {
  77. logger := zap.S().With(
  78. "connection_id", connID,
  79. "local_address", conn.LocalAddr(),
  80. "remote_address", conn.RemoteAddr(),
  81. )
  82. return &WrapConn{
  83. logger: logger,
  84. purpose: purpose,
  85. connID: connID,
  86. conn: conn,
  87. publicIPv4: publicIPv4,
  88. publicIPv6: publicIPv6,
  89. }
  90. }