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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package main
  2. import (
  3. "fmt"
  4. "io"
  5. "io/ioutil"
  6. "net"
  7. "net/http"
  8. "net/url"
  9. "github.com/9seconds/mtg/v2/config"
  10. "github.com/9seconds/mtg/v2/mtglib/network"
  11. )
  12. func makeNetwork(conf *config.Config) (network.Network, error) {
  13. tcpTimeout := conf.Network.Timeout.TCP.Value(network.DefaultTimeout)
  14. idleTimeout := conf.Network.Timeout.Idle.Value(network.DefaultIdleTimeout)
  15. dohIP := conf.Network.DOHIP.Value(net.ParseIP(network.DefaultDOHHostname)).String()
  16. bufferSize := conf.TCPBuffer.Value(network.DefaultBufferSize)
  17. baseDialer, err := network.NewDefaultDialer(tcpTimeout, int(bufferSize))
  18. if err != nil {
  19. return nil, fmt.Errorf("cannot build a default dialer: %w", err)
  20. }
  21. proxyURLs := make([]*url.URL, 0, len(conf.Network.Proxies))
  22. for _, v := range conf.Network.Proxies {
  23. if value := v.Value(nil); value != nil {
  24. proxyURLs = append(proxyURLs, v.Value(nil))
  25. }
  26. }
  27. switch len(proxyURLs) {
  28. case 0:
  29. return network.NewNetwork(baseDialer, dohIP, idleTimeout)
  30. case 1:
  31. socksDialer, err := network.NewSocks5Dialer(baseDialer, proxyURLs[0])
  32. if err != nil {
  33. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  34. }
  35. return network.NewNetwork(socksDialer, dohIP, idleTimeout)
  36. }
  37. socksDialer, err := network.NewLoadBalancedSocks5Dialer(baseDialer, proxyURLs)
  38. if err != nil {
  39. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  40. }
  41. return network.NewNetwork(socksDialer, dohIP, idleTimeout)
  42. }
  43. func exhaustResponse(response *http.Response) {
  44. io.Copy(ioutil.Discard, response.Body) // nolint: errcheck
  45. response.Body.Close()
  46. }