]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Create stub for websocket trackers
authorMatt Joiner <anacrolix@gmail.com>
Mon, 6 Apr 2020 05:38:01 +0000 (15:38 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 6 Apr 2020 05:38:01 +0000 (15:38 +1000)
torrent.go
tracker_scraper.go
wstracker.go [new file with mode: 0644]

index 511abd7192a07640a0cc982165a8c1a90960ae80..81ff8970c5fef7a936a023fa9af502e490ef3238 100644 (file)
@@ -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
index 3d73c2553b0c36f3e0bd26d943037aeab92af602..b664b2bfc26e0d105a373a041b31407638ed2a7b 100644 (file)
@@ -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 (file)
index 0000000..7b26b43
--- /dev/null
@@ -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
+}