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
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

multi_network.go 1.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package network
  2. import (
  3. "context"
  4. "errors"
  5. "math/rand"
  6. "net"
  7. "net/http"
  8. "github.com/9seconds/mtg/v2/essentials"
  9. )
  10. type multiNetwork struct {
  11. networks []Network
  12. }
  13. func (m multiNetwork) Dial(network, address string) (essentials.Conn, error) {
  14. return m.DialContext(context.Background(), network, address)
  15. }
  16. func (m multiNetwork) DialContext(ctx context.Context, network, address string) (essentials.Conn, error) {
  17. networks := m.networks
  18. if len(networks) > 1 {
  19. networks = make([]Network, len(m.networks))
  20. copy(networks, m.networks)
  21. rand.Shuffle(len(m.networks), func(i, j int) {
  22. networks[i], networks[j] = networks[j], networks[i]
  23. })
  24. }
  25. errs := make([]error, 1, len(networks)+1)
  26. errs[0] = ErrCannotDial
  27. for _, ntw := range networks {
  28. conn, err := ntw.DialContext(ctx, network, address)
  29. if err == nil {
  30. return conn, nil
  31. }
  32. errs = append(errs, err)
  33. }
  34. return nil, errors.Join(errs...)
  35. }
  36. func (m multiNetwork) NativeDialer() *net.Dialer {
  37. return m.networks[0].NativeDialer()
  38. }
  39. func (m multiNetwork) MakeHTTPClient(
  40. dialFunc func(context.Context, string, string) (essentials.Conn, error),
  41. ) *http.Client {
  42. if dialFunc == nil {
  43. dialFunc = m.DialContext
  44. }
  45. return m.networks[0].MakeHTTPClient(dialFunc)
  46. }
  47. func Join(networks ...Network) (Network, error) {
  48. if len(networks) == 0 {
  49. return nil, errors.New("cannot join no networks")
  50. }
  51. return multiNetwork{
  52. networks: networks,
  53. }, nil
  54. }