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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package cli
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "net"
  6. "net/url"
  7. "github.com/9seconds/mtg/v2/config"
  8. "github.com/9seconds/mtg/v2/mtglib"
  9. "github.com/9seconds/mtg/v2/network"
  10. )
  11. type base struct {
  12. Network mtglib.Network
  13. Config *config.Config
  14. }
  15. func (b *base) ReadConfig(path, version string) error {
  16. content, err := ioutil.ReadFile(path)
  17. if err != nil {
  18. return fmt.Errorf("cannot read config file: %w", err)
  19. }
  20. conf, err := config.Parse(content)
  21. if err != nil {
  22. return fmt.Errorf("cannot parse config: %w", err)
  23. }
  24. ntw, err := b.makeNetwork(conf, version)
  25. if err != nil {
  26. return fmt.Errorf("cannot build a network: %w", err)
  27. }
  28. b.Config = conf
  29. b.Network = ntw
  30. return nil
  31. }
  32. func (b *base) makeNetwork(conf *config.Config, version string) (mtglib.Network, error) {
  33. tcpTimeout := conf.Network.Timeout.TCP.Value(network.DefaultTimeout)
  34. httpTimeout := conf.Network.Timeout.HTTP.Value(network.DefaultHTTPTimeout)
  35. dohIP := conf.Network.DOHIP.Value(net.ParseIP(network.DefaultDOHHostname)).String()
  36. bufferSize := conf.TCPBuffer.Value(network.DefaultBufferSize)
  37. userAgent := "mtg/" + version
  38. baseDialer, err := network.NewDefaultDialer(tcpTimeout, int(bufferSize))
  39. if err != nil {
  40. return nil, fmt.Errorf("cannot build a default dialer: %w", err)
  41. }
  42. proxyURLs := make([]*url.URL, 0, len(conf.Network.Proxies))
  43. for _, v := range conf.Network.Proxies {
  44. if value := v.Value(nil); value != nil {
  45. proxyURLs = append(proxyURLs, v.Value(nil))
  46. }
  47. }
  48. switch len(proxyURLs) {
  49. case 0:
  50. return network.NewNetwork(baseDialer, userAgent, dohIP, httpTimeout)
  51. case 1:
  52. socksDialer, err := network.NewSocks5Dialer(baseDialer, proxyURLs[0])
  53. if err != nil {
  54. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  55. }
  56. return network.NewNetwork(socksDialer, userAgent, dohIP, httpTimeout)
  57. }
  58. socksDialer, err := network.NewLoadBalancedSocks5Dialer(baseDialer, proxyURLs)
  59. if err != nil {
  60. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  61. }
  62. return network.NewNetwork(socksDialer, userAgent, dohIP, httpTimeout)
  63. }