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 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package network
  2. import (
  3. "context"
  4. "fmt"
  5. "net"
  6. "net/http"
  7. "net/url"
  8. "github.com/9seconds/mtg/v2/essentials"
  9. "github.com/9seconds/mtg/v2/mtglib"
  10. "golang.org/x/net/proxy"
  11. )
  12. type proxyNetwork struct {
  13. mtglib.Network
  14. client proxy.ContextDialer
  15. }
  16. func (p proxyNetwork) Dial(network, address string) (essentials.Conn, error) {
  17. return p.DialContext(context.Background(), network, address)
  18. }
  19. func (p proxyNetwork) DialContext(ctx context.Context, network, address string) (essentials.Conn, error) {
  20. conn, err := p.client.DialContext(ctx, network, address)
  21. if err != nil {
  22. return nil, err
  23. }
  24. return essentials.WrapNetConn(conn), nil
  25. }
  26. func (p proxyNetwork) MakeHTTPClient(
  27. dialFunc func(context.Context, string, string) (essentials.Conn, error),
  28. ) *http.Client {
  29. if dialFunc == nil {
  30. dialFunc = p.DialContext
  31. }
  32. return p.Network.MakeHTTPClient(dialFunc)
  33. }
  34. // proxyServerDialer is the dialer used to connect to a SOCKS upstream. It
  35. // copies timeout and fallback-delay from the base dialer but drops the custom
  36. // Resolver: the user-supplied DoT/DoH resolver is for bypassing DPI on public
  37. // names (Telegram DCs, fronting host), whereas SOCKS upstream addresses are
  38. // usually internal (docker compose, k8s, /etc/hosts) and must be resolved by
  39. // the system resolver. See https://github.com/9seconds/mtg/issues/439.
  40. func proxyServerDialer(base mtglib.Network) *net.Dialer {
  41. nd := base.NativeDialer()
  42. return &net.Dialer{
  43. Timeout: nd.Timeout,
  44. FallbackDelay: nd.FallbackDelay,
  45. }
  46. }
  47. func NewProxyNetwork(base mtglib.Network, proxyURL *url.URL) (*proxyNetwork, error) {
  48. socks, err := proxy.FromURL(proxyURL, proxyServerDialer(base))
  49. if err != nil {
  50. return nil, fmt.Errorf("cannot build proxy dialer: %w", err)
  51. }
  52. return &proxyNetwork{
  53. Network: base,
  54. client: socks.(proxy.ContextDialer),
  55. }, nil
  56. }