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.6KB

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