public static async Task <List <ModlistMetadata> > LoadFromGithub() { var client = new Http.Client(); Utils.Log("Loading ModLists from GitHub"); var metadataResult = client.GetStringAsync(Consts.ModlistMetadataURL); var utilityResult = client.GetStringAsync(Consts.UtilityModlistMetadataURL); var summaryResult = client.GetStringAsync(Consts.ModlistSummaryURL); var metadata = (await metadataResult).FromJsonString <List <ModlistMetadata> >(); metadata = metadata.Concat((await utilityResult).FromJsonString <List <ModlistMetadata> >()).ToList(); try { var summaries = (await summaryResult).FromJsonString <List <ModListSummary> >().ToDictionary(d => d.MachineURL); foreach (var data in metadata) { if (summaries.TryGetValue(data.Links.MachineURL, out var summary)) { data.ValidationSummary = summary; } } } catch (Exception) { // ignored } return(metadata.OrderBy(m => (m.ValidationSummary?.HasFailures ?? false ? 1 : 0, m.Title)).ToList()); }
private async Task <HttpResponseMessage> GetWithMirroredRetry(Http.Client client, string url) { int retries = 0; var downloader = DownloadDispatcher.GetInstance <WabbajackCDNDownloader>(); if (downloader.Mirrors != null) { url = ReplaceHost(downloader.Mirrors, url); } TOP: try { return(await client.GetAsync(url, retry : false)); } catch (Exception ex) { if (retries > 5) { Utils.Log($"Tried to read from {retries} CDN servers, giving up"); throw; } Utils.Log($"Error reading {url} retying with a mirror"); Utils.Log(ex.ToString()); downloader.Mirrors ??= await ClientAPI.GetCDNMirrorList(); url = ReplaceHost(downloader.Mirrors, url); retries += 1; Interlocked.Increment(ref downloader.TotalRetries); goto TOP; } }
public static async Task <List <ModlistMetadata> > LoadUnlistedFromGithub() { try { var client = new Http.Client(); return((await client.GetStringAsync(Consts.UnlistedModlistMetadataURL)).FromJsonString <List <ModlistMetadata> >()); } catch (Exception) { Utils.LogStatus("Error loading unlisted modlists"); return(new List <ModlistMetadata>()); } }
/// <summary> /// This is all we track for metrics, action, and value. The action will be like /// "downloaded", the value "Joe's list". /// </summary> /// <param name="action"></param> /// <param name="value"></param> public static async Task Send(string action, string value) { if (BuildServerStatus.IsBuildServerDown) { return; } var key = await GetMetricsKey(); Utils.Log($"File hash check (-42) {key}"); var client = new Http.Client(); client.Headers.Add((Consts.MetricsKeyHeader, key)); await client.GetAsync($"{Consts.WabbajackBuildServerUri}metrics/{action}/{value}"); }
private static bool CheckBuildServer() { var client = new Http.Client(); try { var result = client.GetAsync($"{Consts.WabbajackBuildServerUri}heartbeat").Result; _isBuildServerDown = result.StatusCode != HttpStatusCode.OK && result.StatusCode != HttpStatusCode.InternalServerError; } catch (Exception) { _isBuildServerDown = true; } finally { _didCheck = true; } Utils.Log($"Build server is {(_isBuildServerDown ? "down" : "alive")}"); return(_isBuildServerDown); }
public async Task <bool> Refresh(string siteName = "") { if (ExpiresAt > DateTime.UtcNow + TimeSpan.FromHours(6)) { return(true); } var client = new Http.Client(); var formData = new KeyValuePair <string?, string?>[] { new ("grant_type", "refresh_token"), new ("refresh_token", RefreshToken), new ("client_id", ClientID) }; try { using var response = await client.PostAsync(TokenEndpoint !.ToString(), new FormUrlEncodedContent (formData.ToList())); var responseData = (await response.Content.ReadAsStringAsync()).FromJsonString <OAuthResultState>(); AccessToken = responseData.AccessToken; ExpiresIn = responseData.ExpiresIn; ExpiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(ExpiresIn); return(true); } catch (HttpException ex) { if (ex.Code == 400) { Utils.ErrorThrow(new CriticalFailureIntervention( $"You have been logged out of {siteName} for reasons out of our control, please re-login via the settings panel.", $"Bad Request: Logged Out - {siteName}")); } } return(true); }
private async Task <HTTPDownloader.State?> Resolve(CancellationToken?token = null) { var client = new Http.Client(); var result = await client.GetAsync(Url, HttpCompletionOption.ResponseHeadersRead, token : token); if (!result.IsSuccessStatusCode) { return(null); } if (result.Content.Headers.ContentType !.MediaType !.StartsWith("text/html", StringComparison.OrdinalIgnoreCase)) { var body = await client.GetHtmlAsync(Url); var node = body.DocumentNode.DescendantsAndSelf().First(d => d.HasClass("input") && d.HasClass("popsok") && d.GetAttributeValue("aria-label", "") == "Download file"); return(new HTTPDownloader.State(node.GetAttributeValue("href", "not-found"))); } return(new HTTPDownloader.State(Url)); }
public static async Task <List <ModlistMetadata> > LoadFromGithub() { var client = new Http.Client(); Utils.Log("Loading ModLists from GitHub"); var metadataResult = client.GetStringAsync(Consts.ModlistMetadataURL); var utilityResult = client.GetStringAsync(Consts.UtilityModlistMetadataURL); var summaryResult = client.GetStringAsync(Consts.ModlistSummaryURL); var metadata = (await metadataResult).FromJsonString <List <ModlistMetadata> >(); metadata = metadata.Concat((await utilityResult).FromJsonString <List <ModlistMetadata> >()).ToList(); try { var summaries = (await summaryResult).FromJsonString <List <ModListSummary> >().ToDictionary(d => d.MachineURL); foreach (var data in metadata) { if (summaries.TryGetValue(data.Links.MachineURL, out var summary)) { data.ValidationSummary = summary; } } } catch (Exception) { // ignored } var random = new Random(); return(metadata // Sort randomly initially, just to give each list a fair shake .Shuffle(random) // Put broken lists at bottom .OrderBy(m => (m.ValidationSummary?.HasFailures ?? false ? 1 : 0)) .ToList()); }
private async Task <HttpResponseMessage> GetWithCDNRetry(Http.Client client, string url, CancellationToken?token = null) { int retries = 0; TOP: try { return(await client.GetAsync(url, retry : false, token : token)); } catch (Exception ex) { if (retries > 2) { Utils.Log($"Trying CDN..."); var remap = url.Replace(new Uri(url).Host, DomainRemaps.FirstOrDefault(x => x.Value == new Uri(url).Host).Key); return(await client.GetAsync(remap, retry : false, token : token)); } retries += 1; Utils.Log($"Error reading {url} retrying [{retries}]"); Utils.Log(ex.ToString()); goto TOP; } }
public Page(Http.Client client) : base(client) { }