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; }
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"); }
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"); }
public override Task ScrapeAsync(ScrapeParameters parameters) { RaiseScrapeComplete(new ScrapeResponseEventArgs(this, true)); return(Task.CompletedTask); }
public override Task ScrapeAsync(ScrapeParameters parameters) { return(Task.CompletedTask); }
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); } }
public override void Scrape(ScrapeParameters parameters, object state) { throw new NotSupportedException(); }
private void RaiseScrapeReceived(ScrapeParameters e) { EventHandler<ScrapeParameters> h = ScrapeReceived; if (h != null) h(this, e); }
protected override Task DoScrapeAsync(ScrapeParameters parameters) { return(Task.CompletedTask); }
public abstract void Scrape(ScrapeParameters parameters, object state);
public override Task ScrapeAsync(ScrapeParameters parameters, TrackerConnectionID state) { return(Task.CompletedTask); }
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))); } }
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); }
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"); }
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); }
public override void Scrape(ScrapeParameters parameters, object state) { }
protected override ReusableTask <ScrapeResponse> DoScrapeAsync(ScrapeParameters parameters, CancellationToken token) { return(ReusableTask.FromResult(new ScrapeResponse(0, 0, 0))); }
public override void Scrape(ScrapeParameters parameters, object state) { RaiseBeforeScrape(); ScrapedAt.Add(DateTime.Now); RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, !FailScrape)); }
public override Task ScrapeAsync(ScrapeParameters parameters, TrackerConnectionID state) { RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, true)); return(Task.CompletedTask); }
public override void Scrape(ScrapeParameters parameters, object state) { RaiseScrapeComplete(new ScrapeResponseEventArgs(this, state, true)); }
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. }
private void RaiseScrapeReceived(ScrapeParameters e) { var h = ScrapeReceived; if (h != null) h(this, e); }