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
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

conn.go 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package stream
  2. import (
  3. "fmt"
  4. "net"
  5. "time"
  6. "github.com/9seconds/mtg/config"
  7. "github.com/9seconds/mtg/conntypes"
  8. "go.uber.org/zap"
  9. )
  10. type connPurpose uint8
  11. const (
  12. connPurposeClient connPurpose = 1 << iota
  13. connPurposeTelegram
  14. )
  15. type wrapperConn struct {
  16. parent net.Conn
  17. connID conntypes.ConnID
  18. logger *zap.SugaredLogger
  19. localAddr *net.TCPAddr
  20. remoteAddr *net.TCPAddr
  21. }
  22. func (w *wrapperConn) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
  23. if err := w.parent.SetWriteDeadline(time.Now().Add(timeout)); err != nil {
  24. w.Close()
  25. return 0, fmt.Errorf("cannot set write deadline to the socket: %w", err)
  26. }
  27. return w.Write(p)
  28. }
  29. func (w *wrapperConn) Write(p []byte) (int, error) {
  30. n, err := w.parent.Write(p)
  31. w.logger.Debugw("write to stream", "bytes", n, "error", err)
  32. if err != nil {
  33. w.Close()
  34. }
  35. return n, err
  36. }
  37. func (w *wrapperConn) ReadTimeout(p []byte, timeout time.Duration) (int, error) {
  38. if err := w.parent.SetReadDeadline(time.Now().Add(timeout)); err != nil {
  39. w.Close()
  40. return 0, fmt.Errorf("cannot set read deadline to the socket: %w", err)
  41. }
  42. return w.Read(p)
  43. }
  44. func (w *wrapperConn) Read(p []byte) (int, error) {
  45. n, err := w.parent.Read(p)
  46. w.logger.Debugw("Read from stream", "bytes", n, "error", err)
  47. if err != nil {
  48. w.Close()
  49. }
  50. return n, err
  51. }
  52. func (w *wrapperConn) Close() error {
  53. w.logger.Debugw("Close connection")
  54. return w.parent.Close()
  55. }
  56. func (w *wrapperConn) Conn() net.Conn {
  57. return w.parent
  58. }
  59. func (w *wrapperConn) Logger() *zap.SugaredLogger {
  60. return w.logger
  61. }
  62. func (w *wrapperConn) LocalAddr() *net.TCPAddr {
  63. return w.localAddr
  64. }
  65. func (w *wrapperConn) RemoteAddr() *net.TCPAddr {
  66. return w.remoteAddr
  67. }
  68. func newConn(parent net.Conn,
  69. connID conntypes.ConnID,
  70. purpose connPurpose) conntypes.StreamReadWriteCloser {
  71. localAddr := *parent.LocalAddr().(*net.TCPAddr)
  72. if parent.RemoteAddr().(*net.TCPAddr).IP.To4() != nil {
  73. if config.C.PublicIPv4.IP != nil {
  74. localAddr.IP = config.C.PublicIPv4.IP
  75. }
  76. } else if config.C.PublicIPv6.IP != nil {
  77. localAddr.IP = config.C.PublicIPv6.IP
  78. }
  79. logger := zap.S().With(
  80. "local_address", localAddr,
  81. "remote_address", parent.RemoteAddr(),
  82. ).Named("conn")
  83. if purpose == connPurposeClient {
  84. logger = logger.Named("client").With("connection_id", connID.String())
  85. } else {
  86. logger = logger.Named("telegram")
  87. }
  88. return &wrapperConn{
  89. parent: parent,
  90. connID: connID,
  91. logger: logger,
  92. remoteAddr: parent.RemoteAddr().(*net.TCPAddr),
  93. localAddr: &localAddr,
  94. }
  95. }