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.

utils.go 1.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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/mtglib/network"
  10. )
  11. func makeNetwork(conf *config) (*network.Network, error) {
  12. tcpTimeout := conf.Network.Timeout.TCP.Value(network.DefaultTimeout)
  13. httpTimeout := conf.Network.Timeout.TCP.Value(network.DefaultHTTPTimeout)
  14. dohIP := conf.Network.DOHIP.Value(net.ParseIP(network.DefaultDOHHostname)).String()
  15. bufferSize := conf.TCPBuffer.Value(network.DefaultBufferSize)
  16. baseDialer, err := network.NewDefaultDialer(tcpTimeout, int(bufferSize))
  17. if err != nil {
  18. return nil, fmt.Errorf("cannot build a default dialer: %w", err)
  19. }
  20. proxyURLs := make([]*url.URL, 0, len(conf.Network.Proxies))
  21. for _, v := range conf.Network.Proxies {
  22. if value := v.Value(nil); value != nil {
  23. proxyURLs = append(proxyURLs, v.Value(nil))
  24. }
  25. }
  26. switch len(proxyURLs) {
  27. case 0:
  28. return network.NewNetwork(baseDialer, dohIP, httpTimeout)
  29. case 1:
  30. socksDialer, err := network.NewSocks5Dialer(baseDialer, proxyURLs[0])
  31. if err != nil {
  32. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  33. }
  34. return network.NewNetwork(socksDialer, dohIP, httpTimeout)
  35. }
  36. socksDialer, err := network.NewLoadBalancedSocks5Dialer(baseDialer, proxyURLs)
  37. if err != nil {
  38. return nil, fmt.Errorf("cannot build socks5 dialer: %w", err)
  39. }
  40. return network.NewNetwork(socksDialer, dohIP, httpTimeout)
  41. }
  42. func exhaustResponse(response *http.Response) {
  43. io.Copy(ioutil.Discard, response.Body) // nolint: errcheck
  44. response.Body.Close()
  45. }