private static async Task <string> ResolveShortener(Uri uri, CancellationToken cancellationToken) { if (UrlShorteners.All(s => !uri.Host.EndsWith(s))) { return(null); } var response = await client.GetAsync(uri, cancellationToken); var location = response.Headers.Location; return(location?.OriginalString); }
/// <summary> /// Updates /// </summary> /// <returns></returns> private static async Task UpdateUnderlyingURLAsync(CancellationToken cancellationToken) { while (true) { var url = UnderlyingTargetURL; var uri = new Uri(url); foreach (var service in JumpPages) { if (!url.StartsWith(service.Key)) { continue; } var queryStringValues = HttpUtility.ParseQueryString(uri.Query); var underlyingUrl = queryStringValues["url"]; if (underlyingUrl != null) { UnderlyingTargetURL = underlyingUrl; } } if (UnderlyingTargetURL != url) { continue; } if (UrlShorteners.Contains(uri.Host)) { var clientHandler = new HttpClientHandler { AllowAutoRedirect = false }; var client = new HttpClient(clientHandler); try { var response = await client.GetAsync(url, cancellationToken); var location = response.Headers.Location; if (location != null) { UnderlyingTargetURL = location.OriginalString; continue; } } catch (TaskCanceledException) { // TaskCanceledException occurs when the CancellationToken is triggered before the request completes // In this case, skip the lookup to avoid poor user experience } } break; } }