private async Task <SortedDictionary <NuGetVersion, PackageInfo> > FindPackagesByIdAsync(string id, CancellationToken cancellationToken) { for (var retry = 0; retry != 3; ++retry) { var baseUri = _baseUris[retry % _baseUris.Count].OriginalString; var uri = baseUri + id.ToLowerInvariant() + "/index.json"; try { using (var result = await _httpSource.GetAsync( uri, $"list_{id}", CreateCacheContext(retry), Logger, ignoreNotFounds: true, ensureValidContents: stream => HttpStreamValidation.ValidateJObject(uri, stream), cancellationToken: cancellationToken)) { if (result.Status == HttpSourceResultStatus.NotFound) { return(new SortedDictionary <NuGetVersion, PackageInfo>()); } try { return(ConsumeFlatContainerIndex(result.Stream, id, baseUri)); } catch { Logger.LogWarning(string.Format(CultureInfo.CurrentCulture, Strings.Log_FileIsCorrupt, result.CacheFileName)); throw; } } } catch (Exception ex) when(retry < 2) { var message = string.Format(CultureInfo.CurrentCulture, Strings.Log_RetryingFindPackagesById, nameof(FindPackagesByIdAsync), uri) + Environment.NewLine + ExceptionUtilities.DisplayMessage(ex); Logger.LogMinimal(message); } catch (Exception ex) when(retry == 2) { var message = string.Format(CultureInfo.CurrentCulture, Strings.Log_FailedToRetrievePackage, uri); Logger.LogError(message + Environment.NewLine + ExceptionUtilities.DisplayMessage(ex)); throw new FatalProtocolException(message, ex); } } return(null); }
public void HttpStreamValidation_ValidateJObject_AcceptsMinimal() { // Arrange var stream = new MemoryStream(Encoding.UTF8.GetBytes(@" { ""foo"": 1, ""bar"": 2 }")); // Act & Assert HttpStreamValidation.ValidateJObject(Uri, stream); }
public void HttpStreamValidation_ValidateJObject_RejectsJsonArray() { // Arrange var stream = new MemoryStream(Encoding.UTF8.GetBytes("[1, 2]")); // Act & Assert var actual = Assert.Throws <InvalidDataException>(() => { HttpStreamValidation.ValidateJObject(Uri, stream); }); Assert.IsType <JsonReaderException>(actual.InnerException); }
public void HttpStreamValidation_ValidateJObject_RejectsIncompleteJsonObjects() { // Arrange var stream = new MemoryStream(Encoding.UTF8.GetBytes(@" { ""foo"": 1, ""bar"": 2")); // Act & Assert var actual = Assert.Throws <InvalidDataException>(() => { HttpStreamValidation.ValidateJObject(Uri, stream); }); Assert.IsType <JsonReaderException>(actual.InnerException); }