@@ -10,13 +10,17 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
1010{
1111 internal sealed partial class FeedManager : IDisposable
1212 {
13- internal const string PublicNugetOrgFeed = "https://api.nuget.org/v3/index.json" ;
13+ private const string PublicNugetOrg = "nuget.org" ;
14+ private const string PublicDotNugetOrg = $ ".{ PublicNugetOrg } ";
15+ internal const string PublicApiNugetOrgFeed = $ "https://api{ PublicDotNugetOrg } /v3/index.json";
1416
1517 private readonly ILogger logger ;
1618 private readonly IDotNet dotnet ;
1719 private readonly IFileProvider fileProvider ;
1820 private readonly DependencyDirectory emptyPackageDirectory ;
1921 private readonly ImmutableHashSet < string > privateRegistryFeeds ;
22+ private readonly bool hasPrivateRegistryBaseFeeds ;
23+ private readonly ImmutableHashSet < string > privateRegistryBaseFeeds ;
2024 private readonly IFeedManagerIO feedManagerIo ;
2125
2226 /// <summary>
@@ -93,9 +97,12 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
9397 this . feedManagerIo = feedManagerIo ;
9498 privateRegistryFeeds = dependabotProxy ? . RegistryURLs ?? [ ] ;
9599 HasPrivateRegistryFeeds = privateRegistryFeeds . Count > 0 ;
96- DefaultFeeds = dependabotProxy ? . RegistryBaseURLs . Any ( ) == true
97- ? dependabotProxy . RegistryBaseURLs
98- : [ PublicNugetOrgFeed ] ;
100+ privateRegistryBaseFeeds = dependabotProxy ? . RegistryBaseURLs ?? [ ] ;
101+ hasPrivateRegistryBaseFeeds = privateRegistryBaseFeeds . Count > 0 ;
102+
103+ DefaultFeeds = hasPrivateRegistryBaseFeeds
104+ ? privateRegistryBaseFeeds
105+ : [ PublicApiNugetOrgFeed ] ;
99106 emptyPackageDirectory = new DependencyDirectory ( "empty" , "empty package" , logger ) ;
100107
101108 lazyExplicitFeeds = new Lazy < ImmutableHashSet < string > > ( GetExplicitFeeds ) ;
@@ -120,6 +127,20 @@ public FeedManager(ILogger logger, IDotNet dotnet, IDependabotProxy? dependabotP
120127 {
121128 }
122129
130+ private bool IsNugetOrgFeed ( string url )
131+ {
132+ try
133+ {
134+ var uri = new Uri ( url ) ;
135+ return uri . Host . EndsWith ( PublicDotNugetOrg , StringComparison . InvariantCultureIgnoreCase ) ||
136+ string . Equals ( uri . Host , PublicNugetOrg , StringComparison . InvariantCultureIgnoreCase ) ;
137+ }
138+ catch ( UriFormatException )
139+ {
140+ return false ;
141+ }
142+ }
143+
123144 private IEnumerable < string > GetFeeds ( Func < IList < string > > getNugetFeeds )
124145 {
125146 var results = getNugetFeeds ( ) ;
@@ -141,6 +162,17 @@ private IEnumerable<string> GetFeeds(Func<IList<string>> getNugetFeeds)
141162 continue ;
142163 }
143164
165+ if ( hasPrivateRegistryBaseFeeds && IsNugetOrgFeed ( url ) )
166+ {
167+ // Use private registry base feeds.
168+ foreach ( var feed in privateRegistryBaseFeeds )
169+ {
170+ logger . LogDebug ( $ "Using private registry base feed '{ feed } '.") ;
171+ yield return feed ;
172+ }
173+ continue ;
174+ }
175+
144176 yield return url ;
145177 }
146178 }
0 commit comments