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
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

load_balanced_socks5.go 1.3KB

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