}
func (t *Torrent) close() (err error) {
+ t.logger.Printf("Sending stopped event to trackers")
+ for _, ta := range t.trackerAnnouncers {
+ ta.Stop()
+ }
+
t.closed.Set()
t.tickleReaders()
if t.storage != nil {
// Returns an AnnounceRequest with fields filled out to defaults and current
// values.
-func (t *Torrent) announceRequest() tracker.AnnounceRequest {
+func (t *Torrent) announceRequest(event tracker.AnnounceEvent) tracker.AnnounceRequest {
// Note that IPAddress is not set. It's set for UDP inside the tracker
// code, since it's dependent on the network in use.
return tracker.AnnounceRequest{
- Event: tracker.None,
+ Event: event,
NumWant: -1,
Port: uint16(t.cl.incomingPeerPort()),
PeerId: t.cl.peerID,
// Return how long to wait before trying again. For most errors, we return 5
// minutes, a relatively quick turn around for DNS changes.
-func (me *trackerScraper) announce() (ret trackerAnnounceResult) {
+func (me *trackerScraper) announce(event tracker.AnnounceEvent) (ret trackerAnnounceResult) {
defer func() {
ret.Completed = time.Now()
}()
return
}
me.t.cl.lock()
- req := me.t.announceRequest()
+ req := me.t.announceRequest(event)
me.t.cl.unlock()
res, err := tracker.Announce{
HTTPProxy: me.t.cl.config.HTTPProxy,
}
func (me *trackerScraper) Run() {
+ // make sure first announce is a "started"
+ e := tracker.Started
for {
- ar := me.announce()
+ ar := me.announce(e)
+ // after first announce, get back to regular "none"
+ e = tracker.None
me.t.cl.lock()
me.lastAnnounce = ar
me.t.cl.unlock()
}
}
}
+
+func (me *trackerScraper) Stop() {
+ req := me.t.announceRequest(tracker.Stopped)
+ ip, _ := me.getIp()
+ tracker.Announce{
+ HTTPProxy: me.t.cl.config.HTTPProxy,
+ UserAgent: me.t.cl.config.HTTPUserAgent,
+ TrackerUrl: me.trackerUrl(ip),
+ Request: req,
+ HostHeader: me.u.Host,
+ ServerName: me.u.Hostname(),
+ }.Do()
+}