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 kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

socks_proxy_test.go 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package network_test
  2. import (
  3. "net"
  4. "net/url"
  5. "sync"
  6. "testing"
  7. "github.com/9seconds/mtg/v2/network/v2"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/require"
  10. "github.com/stretchr/testify/suite"
  11. "github.com/things-go/go-socks5"
  12. )
  13. type SocksProxyTestSuite struct {
  14. EchoServerTestSuite
  15. wg sync.WaitGroup
  16. baseNetwork network.Network
  17. noAuthURL *url.URL
  18. authURL *url.URL
  19. noAuthListener net.Listener
  20. authListener net.Listener
  21. noAuthServer *socks5.Server
  22. authServer *socks5.Server
  23. }
  24. func (suite *SocksProxyTestSuite) SetupSuite() {
  25. suite.EchoServerTestSuite.SetupSuite()
  26. listener, err := net.Listen("tcp4", "127.0.0.1:0")
  27. require.NoError(suite.T(), err)
  28. suite.noAuthListener = listener
  29. listener, err = net.Listen("tcp4", "127.0.0.1:0")
  30. require.NoError(suite.T(), err)
  31. suite.authListener = listener
  32. suite.noAuthServer = socks5.NewServer()
  33. suite.wg.Go(func() {
  34. suite.noAuthServer.Serve(suite.noAuthListener)
  35. })
  36. suite.authServer = socks5.NewServer(
  37. socks5.WithAuthMethods([]socks5.Authenticator{
  38. socks5.UserPassAuthenticator{
  39. Credentials: socks5.StaticCredentials{
  40. "user": "pass",
  41. },
  42. },
  43. }))
  44. suite.wg.Go(func() {
  45. suite.authServer.Serve(suite.authListener)
  46. })
  47. parsed, err := url.Parse("socks5://" + suite.noAuthListener.Addr().String())
  48. require.NoError(suite.T(), err)
  49. suite.noAuthURL = parsed
  50. parsed, err = url.Parse("socks5://user:pass@" + suite.authListener.Addr().String())
  51. require.NoError(suite.T(), err)
  52. suite.authURL = parsed
  53. suite.baseNetwork = network.New(nil, "mtg", 0, 0, 0)
  54. }
  55. func (suite *SocksProxyTestSuite) TestIncorrectSchema() {
  56. parsed, err := url.Parse("http://hello")
  57. suite.NoError(err)
  58. _, err = network.NewProxyNetwork(suite.baseNetwork, parsed)
  59. suite.Error(err)
  60. }
  61. func (suite *SocksProxyTestSuite) TestRead() {
  62. testData := map[string][]*url.URL{
  63. "noAuth": {suite.noAuthURL},
  64. "auth": {suite.authURL},
  65. "both": {suite.noAuthURL, suite.authURL},
  66. }
  67. for name, proxies := range testData {
  68. suite.T().Run(name, func(t *testing.T) {
  69. proxyNetworks := []network.Network{}
  70. for _, u := range proxies {
  71. value, err := network.NewProxyNetwork(suite.baseNetwork, u)
  72. assert.NoError(t, err)
  73. proxyNetworks = append(proxyNetworks, value)
  74. }
  75. netw, err := network.Join(proxyNetworks...)
  76. assert.NoError(t, err)
  77. conn, err := netw.Dial("tcp4", suite.EchoServerAddr())
  78. assert.NoError(t, err)
  79. data := []byte{1, 2, 3}
  80. n, err := conn.Write(data)
  81. assert.NoError(t, err)
  82. assert.Equal(t, len(data), n)
  83. toRead := []byte{1, 2, 3, 4, 5}
  84. n, err = conn.Read(toRead)
  85. assert.NoError(t, err)
  86. assert.Equal(t, len(data), n)
  87. assert.Equal(t, data, toRead[:n])
  88. assert.NotEqual(t, data, toRead)
  89. })
  90. }
  91. }
  92. func (suite *SocksProxyTestSuite) TearDownSuite() {
  93. suite.noAuthListener.Close()
  94. suite.authListener.Close()
  95. suite.wg.Wait()
  96. suite.EchoServerTestSuite.TearDownSuite()
  97. }
  98. func TestSocksProxy(t *testing.T) {
  99. t.Parallel()
  100. suite.Run(t, &SocksProxyTestSuite{})
  101. }