コード例 #1
0
ファイル: ListenerBase.cs プロジェクト: mrscylla/octotorrent
        public virtual BEncodedDictionary Handle(NameValueCollection collection, IPAddress remoteAddress, bool isScrape)
        {
            if (collection == null)
                throw new ArgumentNullException("collection");
            if (remoteAddress == null)
                throw new ArgumentNullException("remoteAddress");

            RequestParameters parameters;
            if (isScrape)
                parameters = new ScrapeParameters(collection, remoteAddress);
            else
                parameters = new AnnounceParameters(collection, remoteAddress);

            // If the parameters are invalid, the failure reason will be added to the response dictionary
            if (!parameters.IsValid)
                return parameters.Response;

            // Fire the necessary event so the request will be handled and response filled in
            if (isScrape)
                RaiseScrapeReceived((ScrapeParameters)parameters);
            else
                RaiseAnnounceReceived((AnnounceParameters)parameters);

            // Return the response now that the connection has been handled correctly.
            return parameters.Response;
        }
コード例 #2
0
        public async Task Scrape()
        {
            var infoHash = new InfoHash(Enumerable.Repeat((byte)1, 20).ToArray());

            scrapeParams = new ScrapeParameters(infoHash);

            await tracker.ScrapeAsync(scrapeParams);

            Assert.AreEqual(0, tracker.Complete, "#1");
            Assert.AreEqual(0, tracker.Incomplete, "#2");
            Assert.AreEqual(0, tracker.Downloaded, "#3");

            await tracker.AnnounceAsync(new AnnounceParameters (0, 0, 100, TorrentEvent.Started, infoHash, false, "peer1", null, 1));

            await tracker.ScrapeAsync(scrapeParams);

            Assert.AreEqual(0, tracker.Complete, "#4");
            Assert.AreEqual(1, tracker.Incomplete, "#5");
            Assert.AreEqual(0, tracker.Downloaded, "#6");

            await tracker.AnnounceAsync(new AnnounceParameters (0, 0, 0, TorrentEvent.Started, infoHash, false, "peer2", null, 2));

            await tracker.ScrapeAsync(scrapeParams);

            Assert.AreEqual(1, tracker.Complete, "#7");
            Assert.AreEqual(1, tracker.Incomplete, "#8");
            Assert.AreEqual(0, tracker.Downloaded, "#9");

            await tracker.AnnounceAsync(new AnnounceParameters (0, 0, 0, TorrentEvent.Completed, infoHash, false, "peer3", null, 3));

            await tracker.ScrapeAsync(scrapeParams);

            Assert.AreEqual(2, tracker.Complete, "#10");
            Assert.AreEqual(1, tracker.Incomplete, "#11");
            Assert.AreEqual(1, tracker.Downloaded, "#12");
        }
コード例 #3
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();
            };
            System.Net.BitTorrent.Client.Tracker.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");
        }
コード例 #4
0
 public override Task ScrapeAsync(ScrapeParameters parameters)
 {
     RaiseScrapeComplete(new ScrapeResponseEventArgs(this, true));
     return(Task.CompletedTask);
 }
コード例 #5
0
 public override Task ScrapeAsync(ScrapeParameters parameters)
 {
     return(Task.CompletedTask);
 }
コード例 #6
0
 public override async void Scrape(ScrapeParameters parameters, object state)
 {
     try
     {
         await _semaphoreSlim.WaitAsync();
         try
         {
             if (!_hasConnected)
                 await ConnectAsync();
             await DoScrapeAsync(parameters, state);
         }
         finally
         {
             _semaphoreSlim.Release();
         }
     }
     catch
     {
         DoScrapeComplete(false, state);
     }
 }
コード例 #7
0
 public override void Scrape(ScrapeParameters parameters, object state)
 {
     throw new NotSupportedException();
 }
コード例 #8
0
ファイル: ListenerBase.cs プロジェクト: mrscylla/octotorrent
 private void RaiseScrapeReceived(ScrapeParameters e)
 {
     EventHandler<ScrapeParameters> h = ScrapeReceived;
     if (h != null)
         h(this, e);
 }
コード例 #9
0
 protected override Task DoScrapeAsync(ScrapeParameters parameters)
 {
     return(Task.CompletedTask);
 }
コード例 #10
0
ファイル: Tracker.cs プロジェクト: haroldma/Universal.Torrent
 public abstract void Scrape(ScrapeParameters parameters, object state);
コード例 #11
0
 public override Task ScrapeAsync(ScrapeParameters parameters, TrackerConnectionID state)
 {
     return(Task.CompletedTask);
 }
コード例 #12
0
        public override async void Scrape(ScrapeParameters parameters, object state)
        {
            var message = "";
            try
            {
                var 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();

                using (var httpClient = new HttpClient())
                {
                    var request = new HttpRequestMessage(HttpMethod.Get, url);
                    request.Headers.UserAgent.ParseAdd(VersionInfo.ClientVersion);

                    var httpResponseMessage = await httpClient.SendAsync(request);
                    if (httpResponseMessage.StatusCode == HttpStatusCode.OK)
                    {
                        var stream = await httpResponseMessage.Content.ReadAsStreamAsync();
                        var dict = DecodeResponse(stream);
                        // FIXME: Log the failure?
                        if (!dict.ContainsKey("files"))
                        {
                            message = "Response contained no data";
                        }
                        else
                        {
                            var files = (BEncodedDictionary) dict["files"];
                            foreach (var kp in files.Select(keypair => (BEncodedDictionary) keypair.Value).SelectMany(d => 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:
                                        Debug.WriteLine(null,
                                            "HttpTracker - Unknown scrape tag received: Key {0}  Value {1}", kp.Key,
                                            kp.Value);
                                        break;
                                }
                            }
                        }
                    }
                    else
                        message = string.Format("The tracker could not be contacted {0}", httpResponseMessage.StatusCode);
                }
            }
            catch (WebException)
            {
                message = "The tracker could not be contacted";
            }
            catch (IOException ex)
            {
                message = ex.Message;
            }
            catch
            {
                message = "The tracker returned an invalid or incomplete response";
            }
            finally
            {
                RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, string.IsNullOrEmpty(message)));
            }
        }
コード例 #13
0
        private void OfflineScrapeTest()
        {
            var udpTracker = (UdpTracker) TrackerFactory.Create(new Uri("udp://127.0.0.1:57532/announce"));
            udpTracker.RetryDelay = TimeSpan.FromMilliseconds(500);
            var id = new TrackerConnectionID(udpTracker, false, TorrentEvent.Started, new ManualResetEvent(false));

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

            udpTracker.Scrape(pars, id);
            Wait(id.WaitHandle);
            Assert.IsNotNull(p, "#1");
            Assert.IsFalse(p.Successful);
        }
コード例 #14
0
        public void ScrapeTest()
        {
            var udpTracker = (UdpTracker) TrackerFactory.Create(new Uri(Prefix));
            Assert.IsTrue(udpTracker.CanScrape, "#1");

            var id = new TrackerConnectionID(udpTracker, false, TorrentEvent.Started, new ManualResetEvent(false));

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

            udpTracker.Scrape(pars, id);
            Wait(id.WaitHandle);
            Assert.IsNotNull(p, "#2");
            Assert.IsTrue(p.Successful, "#3");
            Assert.AreEqual(0, udpTracker.Complete, "#1");
            Assert.AreEqual(0, udpTracker.Incomplete, "#2");
            Assert.AreEqual(0, udpTracker.Downloaded, "#3");
        }
コード例 #15
0
        private async Task DoScrapeAsync(ScrapeParameters parameters, object state)
        {
            //strange because here only one infohash???
            //or get all torrent infohash so loop on torrents of client engine
            var infohashs = new List<byte[]>(1) {parameters.InfoHash.Hash};
            var message = new ScrapeMessage(DateTime.Now.GetHashCode(), _connectionId, infohashs);

            var responseBytes = await SendAndReceiveAsync(message);
            var udpTrackerMessage = Receive(message, responseBytes);

            if (!(udpTrackerMessage is ScrapeResponseMessage))
                DoScrapeComplete(false, state);
            else
                CompleteScrape(udpTrackerMessage, state);
        }
コード例 #16
0
 public override void Scrape(ScrapeParameters parameters, object state)
 {
 }
コード例 #17
0
 protected override ReusableTask <ScrapeResponse> DoScrapeAsync(ScrapeParameters parameters, CancellationToken token)
 {
     return(ReusableTask.FromResult(new ScrapeResponse(0, 0, 0)));
 }
コード例 #18
0
ファイル: TestRig.cs プロジェクト: oxosec/simpletorrent
 public override void Scrape(ScrapeParameters parameters, object state)
 {
     RaiseBeforeScrape();
     ScrapedAt.Add(DateTime.Now);
     RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, !FailScrape));
 }
コード例 #19
0
 public override Task ScrapeAsync(ScrapeParameters parameters, TrackerConnectionID state)
 {
     RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, true));
     return(Task.CompletedTask);
 }
コード例 #20
0
 public override void Scrape(ScrapeParameters parameters, object state)
 {
     RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, true));
 }
コード例 #21
0
 public override void Scrape(ScrapeParameters parameters, object state)
 {
     RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, true));
 }
コード例 #22
0
 private void OnScrapeReceived(object sender, ScrapeParameters e) {
   Logger.WriteLineIf(LogLevel.Verbose, _log_props,
     string.Format("Scrape received from {0}. Ignoring it.", e.RemoteAddress));
   // Do nothing.
 }
コード例 #23
0
 private void RaiseScrapeReceived(ScrapeParameters e)
 {
     var h = ScrapeReceived;
     if (h != null)
         h(this, e);
 }