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.

load_balanced.go 1.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package network
  2. import (
  3. "context"
  4. "math/rand"
  5. "net"
  6. "net/url"
  7. )
  8. type loadBalancedDialer struct {
  9. dialers []Dialer
  10. }
  11. func (l loadBalancedDialer) Dial(network, address string) (net.Conn, error) {
  12. return l.DialContext(context.Background(), network, address)
  13. }
  14. func (l loadBalancedDialer) DialContext(ctx context.Context, network, address string) (net.Conn, error) {
  15. length := len(l.dialers)
  16. start := rand.Intn(length)
  17. moved := false
  18. for i := start; i != start || !moved; i = (i + 1) % length {
  19. moved = true
  20. if conn, err := l.dialers[i].DialContext(ctx, network, address); err == nil {
  21. return conn, nil
  22. }
  23. }
  24. return nil, ErrCannotDialWithAllProxies
  25. }
  26. func NewLoadBalancedDialer(baseDialer Dialer, proxyURLs []*url.URL) (Dialer, error) {
  27. switch len(proxyURLs) {
  28. case 0:
  29. return baseDialer, nil
  30. case 1:
  31. return NewSocks5Dialer(baseDialer, proxyURLs[0])
  32. }
  33. dialers := []Dialer{}
  34. for _, u := range proxyURLs {
  35. dialer, err := NewSocks5Dialer(newProxyDialer(baseDialer, u), u)
  36. if err != nil {
  37. return nil, err
  38. }
  39. dialers = append(dialers, dialer)
  40. }
  41. return loadBalancedDialer{
  42. dialers: dialers,
  43. }, nil
  44. }