From: Matt Joiner <anacrolix@gmail.com>
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
+}