From: Matt Joiner Date: Mon, 6 Apr 2020 05:38:01 +0000 (+1000) Subject: Create stub for websocket trackers X-Git-Tag: v1.16.0~85^2~16 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=4d516ddadd7d9701c79e473e23c69cf155a68ffb;p=btrtrc.git Create stub for websocket trackers --- diff --git a/torrent.go b/torrent.go index 511abd71..81ff8970 100644 --- a/torrent.go +++ b/torrent.go @@ -90,7 +90,7 @@ type Torrent struct { peers prioritizedPeers wantPeersEvent missinggo.Event // An announcer for each tracker URL. - trackerAnnouncers map[string]*trackerScraper + trackerAnnouncers map[string]torrentTrackerAnnouncer // How many times we've initiated a DHT announce. TODO: Move into stats. numDHTAnnounces int @@ -590,9 +590,9 @@ func (t *Torrent) writeStatus(w io.Writer) { func() { tw := tabwriter.NewWriter(w, 0, 0, 2, ' ', 0) fmt.Fprintf(tw, " URL\tNext announce\tLast announce\n") - for _, ta := range slices.Sort(slices.FromMapElems(t.trackerAnnouncers), func(l, r *trackerScraper) bool { - lu := l.u - ru := r.u + for _, ta := range slices.Sort(slices.FromMapElems(t.trackerAnnouncers), func(l, r torrentTrackerAnnouncer) bool { + lu := l.URL() + ru := r.URL() var luns, runs url.URL = lu, ru luns.Scheme = "" runs.Scheme = "" @@ -600,7 +600,7 @@ func (t *Torrent) writeStatus(w io.Writer) { ml.StrictNext(luns.String() == runs.String(), luns.String() < runs.String()) ml.StrictNext(lu.String() == ru.String(), lu.String() < ru.String()) return ml.Less() - }).([]*trackerScraper) { + }).([]torrentTrackerAnnouncer) { fmt.Fprintf(tw, " %s\n", ta.statusLine()) } tw.Flush() @@ -1281,24 +1281,31 @@ func (t *Torrent) startScrapingTracker(_url string) { t.startScrapingTracker(u.String()) return } - if u.Scheme == "udp4" && (t.cl.config.DisableIPv4Peers || t.cl.config.DisableIPv4) { - return - } - if u.Scheme == "udp6" && t.cl.config.DisableIPv6 { - return - } if _, ok := t.trackerAnnouncers[_url]; ok { return } - newAnnouncer := &trackerScraper{ - u: *u, - t: t, - } + sl := func() torrentTrackerAnnouncer { + switch u.Scheme { + case "ws", "wss": + return websocketTracker{*u} + } + if u.Scheme == "udp4" && (t.cl.config.DisableIPv4Peers || t.cl.config.DisableIPv4) { + return nil + } + if u.Scheme == "udp6" && t.cl.config.DisableIPv6 { + return nil + } + newAnnouncer := &trackerScraper{ + u: *u, + t: t, + } + go newAnnouncer.Run() + return newAnnouncer + }() if t.trackerAnnouncers == nil { - t.trackerAnnouncers = make(map[string]*trackerScraper) + t.trackerAnnouncers = make(map[string]torrentTrackerAnnouncer) } - t.trackerAnnouncers[_url] = newAnnouncer - go newAnnouncer.Run() + t.trackerAnnouncers[_url] = sl } // Adds and starts tracker scrapers for tracker URLs that aren't already diff --git a/tracker_scraper.go b/tracker_scraper.go index 3d73c255..b664b2bf 100644 --- a/tracker_scraper.go +++ b/tracker_scraper.go @@ -21,6 +21,15 @@ type trackerScraper struct { lastAnnounce trackerAnnounceResult } +type torrentTrackerAnnouncer interface { + statusLine() string + URL() url.URL +} + +func (me trackerScraper) URL() url.URL { + return me.u +} + func (ts *trackerScraper) statusLine() string { var w bytes.Buffer fmt.Fprintf(&w, "%q\t%s\t%s", diff --git a/wstracker.go b/wstracker.go new file mode 100644 index 00000000..7b26b43e --- /dev/null +++ b/wstracker.go @@ -0,0 +1,18 @@ +package torrent + +import ( + "fmt" + "net/url" +) + +type websocketTracker struct { + url url.URL +} + +func (me websocketTracker) statusLine() string { + return fmt.Sprintf("%q", me.url.String()) +} + +func (me websocketTracker) URL() url.URL { + return me.url +}