| File: Providers\FeedTypeResourceProvider.cs | Web Access |
| Project: src\nuget-client\src\NuGet.Core\NuGet.Protocol\NuGet.Protocol.csproj (NuGet.Protocol) |
// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #nullable disable using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using NuGet.Configuration; using NuGet.Protocol.Core.Types; namespace NuGet.Protocol { public class FeedTypeResourceProvider : ResourceProvider { // TODO: should these timeout? // Cache feed types for repositories, these should not be changing and for v2 vs v3 folders this can be // an expensive call. private readonly ConcurrentDictionary<PackageSource, FeedTypeResource> _feedTypeCache = new ConcurrentDictionary<PackageSource, FeedTypeResource>(); private object _accessLock = new object(); public FeedTypeResourceProvider() : base(typeof(FeedTypeResource), nameof(FeedTypeResourceProvider)) { } public override Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token) { FeedTypeResource curResource = null; if (source.FeedTypeOverride == FeedType.Undefined) { if (!_feedTypeCache.TryGetValue(source.PackageSource, out curResource)) { lock (_accessLock) { if (!_feedTypeCache.TryGetValue(source.PackageSource, out curResource)) { // Check the feed type var feedType = FeedTypeUtility.GetFeedType(source.PackageSource); if (feedType == FeedType.FileSystemUnknown) { // Do not cache unknown folder types curResource = new FeedTypeResource(FeedType.FileSystemUnknown); } else { curResource = new FeedTypeResource(feedType); _feedTypeCache.TryAdd(source.PackageSource, curResource); } } } } } else { // Use the feed type defined on the source curResource = new FeedTypeResource(source.FeedTypeOverride); } return Task.FromResult(new Tuple<bool, INuGetResource>(curResource != null, curResource)); } } }