Exemplo n.º 1
0
        public override async Task ScrapeAsync(ScrapeParameters parameters, TrackerConnectionID state)
        {
            try {
                if (ConnectionIdTask == null || LastConnected.Elapsed > TimeSpan.FromMinutes(1))
                {
                    ConnectionIdTask = ConnectAsync();
                }
                await ConnectionIdTask;

                var infohashes = new List <byte[]> {
                    parameters.InfoHash.Hash
                };
                var message  = new ScrapeMessage(DateTime.Now.GetHashCode(), ConnectionIdTask.Result, infohashes);
                var response = (ScrapeResponseMessage) await SendAndReceiveAsync(message);

                if (response.Scrapes.Count == 1)
                {
                    Complete   = response.Scrapes[0].Seeds;
                    Downloaded = response.Scrapes[0].Complete;
                    Incomplete = response.Scrapes[0].Leeches;
                }
                RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, true));
            } catch (Exception e) {
                ConnectionIdTask = null;
                RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, false));
                throw new Exception("Scrape could not be completed", e);
            }
        }
Exemplo n.º 2
0
        public void MultipleAnnounce()
        {
            var announceCount = 0;
            var r = new Random();
            var handle = new ManualResetEvent(false);

            for (var i = 0; i < 20; i++)
            {
                var infoHash = new InfoHash(new byte[20]);
                r.NextBytes(infoHash.Hash);
                var tier = new TrackerTier(new[] {uri.ToString()});
                tier.Trackers[0].AnnounceComplete += delegate
                {
                    if (++announceCount == 20)
                        handle.Set();
                };
                var id = new TrackerConnectionID(tier.Trackers[0], false, TorrentEvent.Started,
                    new ManualResetEvent(false));
                MonoTorrent.Client.Tracker.AnnounceParameters parameters;
                parameters = new MonoTorrent.Client.Tracker.AnnounceParameters(0, 0, 0, TorrentEvent.Started,
                    infoHash, false, new string('1', 20), "", 1411);
                tier.Trackers[0].Announce(parameters, id);
            }

            Assert.True(handle.WaitOne(5000, true), "Some of the responses weren't received");
        }
Exemplo n.º 3
0
        void AnnounceReceived(WebResponse response, TrackerConnectionID state)
        {
            FailureMessage = "";
            WarningMessage = "";
            List <Peer> peers = new List <Peer>();

            try
            {
                BEncodedDictionary dict = DecodeResponse(response);
                HandleAnnounce(dict, peers);
                Status = TrackerState.Ok;
            }
            catch (WebException)
            {
                Status         = TrackerState.Offline;
                FailureMessage = "The tracker could not be contacted";
            }
            catch
            {
                Status         = TrackerState.InvalidResponse;
                FailureMessage = "The tracker returned an invalid or incomplete response";
            }
            finally
            {
                RaiseAnnounceComplete(new AnnounceResponseEventArgs(this, state, string.IsNullOrEmpty(FailureMessage), peers));
            }
        }
Exemplo n.º 4
0
        public override async Task ScrapeAsync(ScrapeParameters parameters, TrackerConnectionID state)
        {
            try
            {
                string url = ScrapeUri.OriginalString;

                // If you want to scrape the tracker for *all* torrents, don't append the info_hash.
                if (url.IndexOf('?') == -1)
                {
                    url += "?info_hash=" + parameters.InfoHash.UrlEncode();
                }
                else
                {
                    url += "&info_hash=" + parameters.InfoHash.UrlEncode();
                }

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.UserAgent = MonoTorrent.Common.VersionInfo.ClientVersion;
                var response = await request.GetResponseAsync();

                ScrapeReceived(response, state);
            }
            catch
            {
                RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, false));
                throw;
            }
        }
Exemplo n.º 5
0
 public async void Scrape(ScrapeParameters parameters, TrackerConnectionID state)
 {
     try {
         await ScrapeAsync(parameters, state);
     } catch {
         // Ignore
     }
 }
 public void AddFailedPeer(Peer p)
 {
     var id = new TrackerConnectionID(this, true, TorrentEvent.None, null);
     var e = new AnnounceResponseEventArgs(this, null, true);
     e.Peers.Add(p);
     e.Successful = false;
     RaiseAnnounceComplete(e);
 }
Exemplo n.º 7
0
 public async void Announce(AnnounceParameters parameters, TrackerConnectionID state)
 {
     try {
         await AnnounceAsync(parameters, state);
     } catch {
         // Ignore
     }
 }
 public void AddFailedPeer(Peer p)
 {
     var id = new TrackerConnectionID(this, true, TorrentEvent.None, new ManualResetEvent(false));
     var e = new AnnounceResponseEventArgs(this, id, false);
     e.Peers.Add(p);
     RaiseAnnounceComplete(e);
     Assert.True(id.WaitHandle.WaitOne(1000, true), "#2 Tracker never raised the AnnounceComplete event");
 }
Exemplo n.º 9
0
 void Announce()
 {
     foreach(var t in _trackers)
     {
         var id = new TrackerConnectionID(t, true, TorrentEvent.None, new ManualResetEvent(false));
         Log("Announcing: {0}" , t.Uri);
         t.Announce(AParams , id);
     }
 }
 protected TrackerResponseEventArgs(Tracker tracker, object state, bool successful)
 {
     if (tracker == null)
         throw new ArgumentNullException("tracker");
     if (!(state is TrackerConnectionID))
         throw new ArgumentException("The state object must be the same object as in the call to Announce", "state");
     this.id = (TrackerConnectionID)state;
     this.successful = successful;
     this.tracker = tracker;
 }
Exemplo n.º 11
0
        void ScrapeReceived(WebResponse response, TrackerConnectionID state)
        {
            string message = "";

            try
            {
                BEncodedDictionary d;
                BEncodedDictionary dict = DecodeResponse(response);

                // FIXME: Log the failure?
                if (!dict.ContainsKey("files"))
                {
                    message = "Response contained no data";
                    return;
                }
                BEncodedDictionary files = (BEncodedDictionary)dict["files"];
                foreach (KeyValuePair <BEncodedString, BEncodedValue> keypair in files)
                {
                    d = (BEncodedDictionary)keypair.Value;
                    foreach (KeyValuePair <BEncodedString, BEncodedValue> kp in d)
                    {
                        switch (kp.Key.ToString())
                        {
                        case ("complete"):
                            Complete = (int)((BEncodedNumber)kp.Value).Number;
                            break;

                        case ("downloaded"):
                            Downloaded = (int)((BEncodedNumber)kp.Value).Number;
                            break;

                        case ("incomplete"):
                            Incomplete = (int)((BEncodedNumber)kp.Value).Number;
                            break;

                        default:
                            Logger.Log(null, "HttpTracker - Unknown scrape tag received: Key {0}  Value {1}", kp.Key.ToString(), kp.Value.ToString());
                            break;
                        }
                    }
                }
            }
            catch (WebException)
            {
                message = "The tracker could not be contacted";
            }
            catch
            {
                message = "The tracker returned an invalid or incomplete response";
            }
            finally
            {
                RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, string.IsNullOrEmpty(message)));
            }
        }
Exemplo n.º 12
0
 protected TrackerResponseEventArgs(Tracker tracker, object state, bool successful)
 {
     if (tracker == null)
     {
         throw new ArgumentNullException("tracker");
     }
     if (!(state is TrackerConnectionID))
     {
         throw new ArgumentException("The state object must be the same object as in the call to Announce", "state");
     }
     this.id         = (TrackerConnectionID)state;
     this.successful = successful;
     this.tracker    = tracker;
 }
Exemplo n.º 13
0
        private WaitHandle Scrape(Tracker tracker, bool trySubsequent)
        {
            if (tracker == null)
            {
                throw new ArgumentNullException("tracker");
            }

            if (!tracker.CanScrape)
            {
                throw new TorrentException("This tracker does not support scraping");
            }

            TrackerConnectionID id = new TrackerConnectionID(tracker, trySubsequent, TorrentEvent.None, new ManualResetEvent(false));

            tracker.Scrape(new ScrapeParameters(this.infoHash), id);
            return(id.WaitHandle);
        }
Exemplo n.º 14
0
        private WaitHandle Announce(Tracker tracker, TorrentEvent clientEvent, bool trySubsequent, ManualResetEvent waitHandle)
        {
            ClientEngine engine = manager.Engine;

            // If the engine is null, we have been unregistered
            if (engine == null)
            {
                waitHandle.Set();
                return(waitHandle);
            }

            this.updateSucceeded = true;
            this.lastUpdated     = DateTime.Now;

            EncryptionTypes e = engine.Settings.AllowedEncryption;
            bool            requireEncryption  = !Toolbox.HasEncryption(e, EncryptionTypes.PlainText);
            bool            supportsEncryption = Toolbox.HasEncryption(e, EncryptionTypes.RC4Full) || Toolbox.HasEncryption(e, EncryptionTypes.RC4Header);

            requireEncryption  = requireEncryption && ClientEngine.SupportsEncryption;
            supportsEncryption = supportsEncryption && ClientEngine.SupportsEncryption;

            IPEndPoint reportedAddress = engine.Settings.ReportedAddress;
            string     ip   = reportedAddress == null ? null : reportedAddress.Address.ToString();
            int        port = reportedAddress == null ? engine.Listener.Endpoint.Port : reportedAddress.Port;

            // FIXME: In metadata mode we need to pretend we need to download data otherwise
            // tracker optimisations might result in no peers being sent back.
            long bytesLeft = 1000;

            if (manager.HasMetadata)
            {
                bytesLeft = (long)((1 - this.manager.Bitfield.PercentComplete / 100.0) * this.manager.Torrent.Size);
            }
            AnnounceParameters p = new AnnounceParameters(this.manager.Monitor.DataBytesDownloaded,
                                                          this.manager.Monitor.DataBytesUploaded,
                                                          bytesLeft,
                                                          clientEvent, this.infoHash, requireEncryption, manager.Engine.PeerId,
                                                          ip, port);

            p.SupportsEncryption = supportsEncryption;
            TrackerConnectionID id = new TrackerConnectionID(tracker, trySubsequent, clientEvent, waitHandle);

            tracker.Announce(p, id);
            return(waitHandle);
        }
Exemplo n.º 15
0
        public void AnnounceTest()
        {
            HTTPTracker t = (HTTPTracker)TrackerFactory.Create(new Uri(prefix));
            TrackerConnectionID id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));

            AnnounceResponseEventArgs p = null;
            t.AnnounceComplete += delegate(object o, AnnounceResponseEventArgs e) {
                p = e;
                id.WaitHandle.Set();
            };
            MonoTorrent.Client.Tracker.AnnounceParameters pars = new AnnounceParameters();
            pars.Infohash = new byte[20];

            t.Announce(pars, id);
            Wait(id.WaitHandle);
            Assert.IsNotNull(p, "#1");
            Assert.IsTrue(p.Successful);
            Assert.AreEqual(keys[0], t.Key, "#2");
        }
Exemplo n.º 16
0
        public override async Task AnnounceAsync(AnnounceParameters parameters, TrackerConnectionID state)
        {
            try {
                if (ConnectionIdTask == null || LastConnected.Elapsed > TimeSpan.FromMinutes(1))
                {
                    ConnectionIdTask = ConnectAsync();
                }
                await ConnectionIdTask;

                var message  = new AnnounceMessage(DateTime.Now.GetHashCode(), ConnectionIdTask.Result, parameters);
                var announce = (AnnounceResponseMessage) await SendAndReceiveAsync(message);

                MinUpdateInterval = announce.Interval;
                RaiseAnnounceComplete(new AnnounceResponseEventArgs(this, state, true, announce.Peers));
            } catch (Exception e) {
                ConnectionIdTask = null;
                RaiseAnnounceComplete(new AnnounceResponseEventArgs(this, state, false));
                throw new Exception("Announce could not be completed", e);
            }
        }
        private void OfflineAnnounceTest()
        {
            var t = (UdpTracker) TrackerFactory.Create(new Uri("udp://127.0.0.1:57532/announce"));
            t.RetryDelay = TimeSpan.FromMilliseconds(500);
            var id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));

            AnnounceResponseEventArgs p = null;
            t.AnnounceComplete += delegate(object o, AnnounceResponseEventArgs e)
            {
                p = e;
                id.WaitHandle.Set();
            };
            var pars = new AnnounceParameters();
            pars.InfoHash = new InfoHash(new byte[20]);
            pars.PeerId = "";

            t.Announce(pars, id);
            Wait(id.WaitHandle);
            Assert.NotNull(p);
            Assert.False(p.Successful);
        }
        public void AnnounceTest()
        {
            var t = (HTTPTracker) TrackerFactory.Create(new Uri(prefix));
            var id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));

            AnnounceResponseEventArgs p = null;
            t.AnnounceComplete += delegate(object o, AnnounceResponseEventArgs e)
            {
                p = e;
                id.WaitHandle.Set();
            };
            var pars = new MonoTorrent.Client.Tracker.AnnounceParameters();
            pars.PeerId = "id";
            pars.InfoHash = new InfoHash(new byte[20]);

            t.Announce(pars, id);
            Wait(id.WaitHandle);
            Assert.NotNull(p);
            Assert.True(p.Successful);
            Assert.Equal(keys[0], t.Key);
        }
Exemplo n.º 19
0
        public override async Task AnnounceAsync(AnnounceParameters parameters, TrackerConnectionID state)
        {
            try
            {
                Uri            announceString = CreateAnnounceString(parameters);
                HttpWebRequest request        = (HttpWebRequest)HttpWebRequest.Create(announceString);
                request.UserAgent = MonoTorrent.Common.VersionInfo.ClientVersion;
                request.Proxy     = new WebProxy(); // If i don't do this, i can't run the webrequest. It's wierd.
                RaiseBeforeAnnounce();
                var response = await request.GetResponseAsync();

                AnnounceReceived(response, state);
            }
            catch (Exception ex)
            {
                Status         = TrackerState.Offline;
                FailureMessage = ("Could not initiate announce request: " + ex.Message);
                RaiseAnnounceComplete(new AnnounceResponseEventArgs(this, state, false));
                throw;
            }
        }
Exemplo n.º 20
0
        public void ScrapeTest()
        {
            Tracker.Tracker t = TrackerFactory.Create(new Uri(prefix.Substring(0, prefix.Length -1)));
            Assert.IsTrue(t.CanScrape, "#1");
            TrackerConnectionID id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));

            AnnounceResponseEventArgs p = null;
            t.AnnounceComplete += delegate(object o, AnnounceResponseEventArgs e) {
                p = e;
                id.WaitHandle.Set();
            };
            MonoTorrent.Client.Tracker.AnnounceParameters pars = new AnnounceParameters();
            pars.Infohash = new byte[20];

            t.Announce(pars, id);
            Wait(id.WaitHandle);
            Assert.IsNotNull(p, "#2");
            Assert.IsTrue(p.Successful, "#3");
            Assert.AreEqual(1, t.Complete, "#1");
            Assert.AreEqual(0, t.Incomplete, "#2");
            Assert.AreEqual(0, t.Downloaded, "#3");
        }
 public AnnounceResponseEventArgs(Tracker tracker, TrackerConnectionID state, bool successful)
     : this(tracker, state, successful, new List <Peer>())
 {
 }
 public AnnounceResponseEventArgs(Tracker tracker, TrackerConnectionID state, bool successful, List <Peer> peers)
     : base(tracker, state, successful)
 {
     this.peers = peers;
 }
 public ScrapeResponseEventArgs(Tracker tracker, TrackerConnectionID state, bool successful)
     : base(tracker, state, successful)
 {
 }
Exemplo n.º 24
0
        public void ScrapeTest()
        {
            UdpTracker t = (UdpTracker)TrackerFactory.Create(new Uri(prefix));
            Assert.IsTrue(t.CanScrape, "#1");
            TrackerConnectionID id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));

            ScrapeResponseEventArgs p = null;
            t.ScrapeComplete += delegate(object o, ScrapeResponseEventArgs e)
            {
                p = e;
                id.WaitHandle.Set();
            };
            ScrapeParameters pars = new ScrapeParameters(new InfoHash(new byte[20]));

            t.Scrape(pars, id);
            Wait(id.WaitHandle);
            Assert.IsNotNull(p, "#2");
            Assert.IsTrue(p.Successful, "#3");
            Assert.AreEqual(0, t.Complete, "#1");
            Assert.AreEqual(0, t.Incomplete, "#2");
            Assert.AreEqual(0, t.Downloaded, "#3");
        }
Exemplo n.º 25
0
        void OfflineScrapeTest()
        {
            UdpTracker t = (UdpTracker)TrackerFactory.Create(new Uri("udp://127.0.0.1:57532/announce"));
            t.RetryDelay = TimeSpan.FromMilliseconds(500);
            TrackerConnectionID id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));

            ScrapeResponseEventArgs p = null;
            t.ScrapeComplete += delegate(object o, ScrapeResponseEventArgs e)
            {
                if (e.Successful)
                    Console.ReadLine();
                p = e;
                id.WaitHandle.Set();
            };
            ScrapeParameters pars = new ScrapeParameters(new InfoHash(new byte[20]));

            t.Scrape(pars, id);
            Wait(id.WaitHandle);
            Assert.IsNotNull(p, "#1");
            Assert.IsFalse(p.Successful);
        }
Exemplo n.º 26
0
 public abstract Task AnnounceAsync(AnnounceParameters parameters, TrackerConnectionID state);
Exemplo n.º 27
0
 public abstract Task ScrapeAsync(ScrapeParameters parameters, TrackerConnectionID state);
Exemplo n.º 28
0
        public void KeyTest()
        {
            MonoTorrent.Client.Tracker.AnnounceParameters pars = new AnnounceParameters();
            pars.Infohash = new byte[20];

            Tracker.Tracker t = TrackerFactory.Create(new Uri(prefix + "?key=value"));
            TrackerConnectionID id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));
            t.AnnounceComplete += delegate { id.WaitHandle.Set(); };
            t.Announce(pars, id);
            Wait(id.WaitHandle);
            Assert.AreEqual("value", keys[0], "#1");
        }
        public void ScrapeTest()
        {
            var t = TrackerFactory.Create(new Uri(prefix.Substring(0, prefix.Length - 1)));
            Assert.True(t.CanScrape);
            var id = new TrackerConnectionID(t, false, TorrentEvent.Started, new ManualResetEvent(false));

            AnnounceResponseEventArgs p = null;
            t.AnnounceComplete += delegate(object o, AnnounceResponseEventArgs e)
            {
                p = e;
                id.WaitHandle.Set();
            };
            var pars = new MonoTorrent.Client.Tracker.AnnounceParameters();
            pars.PeerId = "id";
            pars.InfoHash = new InfoHash(new byte[20]);

            t.Announce(pars, id);
            Wait(id.WaitHandle);
            Assert.NotNull(p);
            Assert.True(p.Successful);
            Assert.Equal(1, t.Complete);
            Assert.Equal(0, t.Incomplete);
            Assert.Equal(0, t.Downloaded);
        }
Exemplo n.º 30
0
 protected TrackerResponseEventArgs(Tracker tracker, TrackerConnectionID state, bool successful)
 {
     this.tracker    = tracker ?? throw new ArgumentNullException("tracker");
     this.id         = (TrackerConnectionID)state;
     this.successful = successful;
 }