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
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

proxy_test.go 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package mtglib_test
  2. import (
  3. "crypto/tls"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "net"
  8. "net/http"
  9. "testing"
  10. "time"
  11. "github.com/9seconds/mtg/v2/antireplay"
  12. "github.com/9seconds/mtg/v2/events"
  13. "github.com/9seconds/mtg/v2/ipblocklist"
  14. "github.com/9seconds/mtg/v2/logger"
  15. "github.com/9seconds/mtg/v2/mtglib"
  16. "github.com/9seconds/mtg/v2/network"
  17. "github.com/stretchr/testify/suite"
  18. )
  19. type ProxyTestSuite struct {
  20. suite.Suite
  21. opts *mtglib.ProxyOpts
  22. p *mtglib.Proxy
  23. listener net.Listener
  24. }
  25. func (suite *ProxyTestSuite) ProxyAddress() string {
  26. _, port, _ := net.SplitHostPort(suite.listener.Addr().String())
  27. return net.JoinHostPort("127.0.0.1", port)
  28. }
  29. func (suite *ProxyTestSuite) ProxySecret() string {
  30. return suite.opts.Secret.Hex()
  31. }
  32. func (suite *ProxyTestSuite) SetupSuite() {
  33. dialer, err := network.NewDefaultDialer(0, 0)
  34. suite.NoError(err)
  35. ntw, err := network.NewNetwork(dialer, "mtgtest", "1.1.1.1", 0)
  36. suite.NoError(err)
  37. suite.opts = &mtglib.ProxyOpts{
  38. Secret: mtglib.GenerateSecret("httpbin.org"),
  39. Network: ntw,
  40. AntiReplayCache: antireplay.NewNoop(),
  41. IPBlocklist: ipblocklist.NewNoop(),
  42. EventStream: events.NewNoopStream(),
  43. Logger: logger.NewNoopLogger(),
  44. }
  45. proxy, err := mtglib.NewProxy(*suite.opts)
  46. suite.NoError(err)
  47. suite.p = proxy
  48. listener, err := net.Listen("tcp", ":0")
  49. suite.NoError(err)
  50. suite.listener = listener
  51. go suite.p.Serve(suite.listener) // nolint: errcheck
  52. }
  53. func (suite *ProxyTestSuite) TearDownSuite() {
  54. if suite.listener != nil {
  55. suite.listener.Close()
  56. }
  57. if suite.p != nil {
  58. suite.p.Shutdown()
  59. }
  60. }
  61. func (suite *ProxyTestSuite) TestCannotInitNoSecret() {
  62. opts := *suite.opts
  63. opts.Secret = mtglib.Secret{}
  64. _, err := mtglib.NewProxy(opts)
  65. suite.Error(err)
  66. }
  67. func (suite *ProxyTestSuite) TestCannotInitNoNetwork() {
  68. opts := *suite.opts
  69. opts.Network = nil
  70. _, err := mtglib.NewProxy(opts)
  71. suite.Error(err)
  72. }
  73. func (suite *ProxyTestSuite) TestCannotInitNoAntiReplayCache() {
  74. opts := *suite.opts
  75. opts.AntiReplayCache = nil
  76. _, err := mtglib.NewProxy(opts)
  77. suite.Error(err)
  78. }
  79. func (suite *ProxyTestSuite) TestCannotInitNoIPBlocklist() {
  80. opts := *suite.opts
  81. opts.IPBlocklist = nil
  82. _, err := mtglib.NewProxy(opts)
  83. suite.Error(err)
  84. }
  85. func (suite *ProxyTestSuite) TestCannotInitNoEventStream() {
  86. opts := *suite.opts
  87. opts.EventStream = nil
  88. _, err := mtglib.NewProxy(opts)
  89. suite.Error(err)
  90. }
  91. func (suite *ProxyTestSuite) TestCannotInitNoLogger() {
  92. opts := *suite.opts
  93. opts.Logger = nil
  94. _, err := mtglib.NewProxy(opts)
  95. suite.Error(err)
  96. }
  97. func (suite *ProxyTestSuite) TestCannotInitIncorrectPreferIP() {
  98. opts := *suite.opts
  99. opts.PreferIP = "xxx"
  100. _, err := mtglib.NewProxy(opts)
  101. suite.Error(err)
  102. }
  103. func (suite *ProxyTestSuite) TestDomainFrontingAddress() {
  104. suite.Equal("httpbin.org:443", suite.p.DomainFrontingAddress())
  105. }
  106. func (suite *ProxyTestSuite) TestHTTPSRequest() {
  107. client := &http.Client{
  108. Transport: &http.Transport{
  109. TLSClientConfig: &tls.Config{
  110. InsecureSkipVerify: true,
  111. },
  112. },
  113. Timeout: 5 * time.Second,
  114. }
  115. addr := fmt.Sprintf("https://%s/headers", suite.ProxyAddress())
  116. resp, err := client.Get(addr) // nolint: noctx
  117. suite.NoError(err)
  118. defer resp.Body.Close()
  119. suite.Equal(http.StatusOK, resp.StatusCode)
  120. data, err := io.ReadAll(resp.Body)
  121. suite.NoError(err)
  122. jsonStruct := struct {
  123. Headers struct {
  124. TraceID string `json:"X-Amzn-Trace-Id"`
  125. } `json:"headers"`
  126. }{}
  127. suite.NoError(json.Unmarshal(data, &jsonStruct))
  128. suite.NotEmpty(jsonStruct.Headers.TraceID)
  129. }
  130. func TestProxy(t *testing.T) {
  131. t.Parallel()
  132. suite.Run(t, &ProxyTestSuite{})
  133. }