diff --git a/config.go b/config.go index 3d370d55..50c46afa 100644 --- a/config.go +++ b/config.go @@ -90,6 +90,9 @@ type ClientConfig struct { // Defines proxy for HTTP requests, such as for trackers. It's commonly set from the result of // "net/http".ProxyURL(HTTPProxy). HTTPProxy func(*http.Request) (*url.URL, error) + // Takes a tracker's hostname and requests DNS A and AAAA records. + // Used in case DNS lookups require a special setup (i.e., dns-over-https) + TrackerIpFetcher func(*url.URL) ([]net.IP, error) // HTTPUserAgent changes default UserAgent for HTTP requests HTTPUserAgent string // Updated occasionally to when there's been some changes to client diff --git a/torrent.go b/torrent.go index 5f18df1f..8fa4c7de 100644 --- a/torrent.go +++ b/torrent.go @@ -1577,8 +1577,9 @@ func (t *Torrent) startScrapingTracker(_url string) { } } newAnnouncer := &trackerScraper{ - u: *u, - t: t, + u: *u, + t: t, + ipFetcher: t.cl.config.TrackerIpFetcher, } go newAnnouncer.Run() return newAnnouncer diff --git a/tracker_scraper.go b/tracker_scraper.go index c339c2b4..f9d37d86 100644 --- a/tracker_scraper.go +++ b/tracker_scraper.go @@ -21,6 +21,7 @@ type trackerScraper struct { u url.URL t *Torrent lastAnnounce trackerAnnounceResult + ipFetcher func(*url.URL) ([]net.IP, error) } type torrentTrackerAnnouncer interface { @@ -66,7 +67,13 @@ type trackerAnnounceResult struct { } func (me *trackerScraper) getIp() (ip net.IP, err error) { - ips, err := net.LookupIP(me.u.Hostname()) + var ips []net.IP + if me.ipFetcher != nil { + ips, err = me.ipFetcher(&me.u) + } else { + // Do a regular dns lookup + ips, err = net.LookupIP(me.u.Hostname()) + } if err != nil { return }