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 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 abstract void Scrape(ScrapeParameters parameters, object state);
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))); } }