/// <summary> /// Retrieve dependency info for a single package. /// </summary> /// <param name="package">package id and version</param> /// <param name="projectFramework">project target framework. This is used for finding the dependency group</param> /// <param name="token">cancellation token</param> /// <returns> /// Returns dependency info for the given package if it exists. If the package is not found null is /// returned. /// </returns> public override async Task <SourcePackageDependencyInfo> ResolvePackage(PackageIdentity package, NuGetFramework projectFramework, SourceCacheContext cacheContext, Common.ILogger log, CancellationToken token) { try { SourcePackageDependencyInfo result = null; // Construct the registration index url var uri = _regResource.GetUri(package.Id); // Retrieve the registration blob var singleVersion = new VersionRange(minVersion: package.Version, includeMinVersion: true, maxVersion: package.Version, includeMaxVersion: true); var regInfo = await ResolverMetadataClient.GetRegistrationInfo(_client, uri, package.Id, singleVersion, cacheContext, projectFramework, log, token); // regInfo is null if the server returns a 404 for the package to indicate that it does not exist if (regInfo != null) { // Parse package and dependeny info from the blob result = GetPackagesFromRegistration(regInfo, token).FirstOrDefault(); } return(result); } catch (Exception ex) { // Wrap exceptions coming from the server with a user friendly message var error = String.Format(CultureInfo.CurrentUICulture, Strings.Protocol_PackageMetadataError, package, _source); throw new FatalProtocolException(error, ex); } }
private async Task <IEnumerable <IPackageSearchMetadata> > GetMetadataAsync( string packageId, bool includePrerelease, bool includeUnlisted, VersionRange range, SourceCacheContext sourceCacheContext, ILogger log, CancellationToken token) { var metadataCache = new MetadataReferenceCache(); var registrationUri = _regResource.GetUri(packageId); var(registrationIndex, httpSourceCacheContext) = await LoadRegistrationIndexAsync( _client, registrationUri, packageId, sourceCacheContext, httpSourceResult => DeserializeStreamDataAsync <RegistrationIndex>(httpSourceResult.Stream, token), log, token); if (registrationIndex == null) { // The server returned a 404, the package does not exist return(Enumerable.Empty <PackageSearchMetadataRegistration>()); } var results = new List <PackageSearchMetadataRegistration>(); foreach (var registrationPage in registrationIndex.Items) { if (registrationPage == null) { throw new InvalidDataException(registrationUri.AbsoluteUri); } var lower = NuGetVersion.Parse(registrationPage.Lower); var upper = NuGetVersion.Parse(registrationPage.Upper); if (range.DoesRangeSatisfy(lower, upper)) { if (registrationPage.Items == null) { var rangeUri = registrationPage.Url; var leafRegistrationPage = await GetRegistratioIndexPageAsync(_client, rangeUri, packageId, lower, upper, httpSourceCacheContext, log, token); if (registrationPage == null) { throw new InvalidDataException(registrationUri.AbsoluteUri); } ProcessRegistrationPage(leafRegistrationPage, results, range, includePrerelease, includeUnlisted, metadataCache); } else { ProcessRegistrationPage(registrationPage, results, range, includePrerelease, includeUnlisted, metadataCache); } } } return(results); }