@@ -81,7 +81,7 @@ internal Registry(string registryName, ILogger logger, IRegistryAPI registryAPI,
81
81
this ( new Uri ( $ "https://{ registryName } ") , logger , registryAPI , settings )
82
82
{ }
83
83
84
- internal Registry ( string registryName , ILogger logger , RegistryMode mode , RegistrySettings ? settings = null ) :
84
+ internal Registry ( string registryName , ILogger logger , RegistryMode mode , RegistrySettings ? settings = null ) :
85
85
this ( new Uri ( $ "https://{ registryName } ") , logger , new RegistryApiFactory ( mode ) , settings )
86
86
{ }
87
87
@@ -191,6 +191,14 @@ await initialManifestResponse.Content.ReadFromJsonAsync<ManifestListV2>(cancella
191
191
runtimeIdentifier ,
192
192
manifestPicker ,
193
193
cancellationToken ) . ConfigureAwait ( false ) ,
194
+ SchemaTypes . OciImageIndexV1 =>
195
+ await PickBestImageFromImageIndexAsync (
196
+ repositoryName ,
197
+ reference ,
198
+ await initialManifestResponse . Content . ReadFromJsonAsync < ImageIndexV1 > ( cancellationToken : cancellationToken ) . ConfigureAwait ( false ) ,
199
+ runtimeIdentifier ,
200
+ manifestPicker ,
201
+ cancellationToken ) . ConfigureAwait ( false ) ,
194
202
var unknownMediaType => throw new NotImplementedException ( Resource . FormatString (
195
203
nameof ( Strings . UnknownMediaType ) ,
196
204
repositoryName ,
@@ -236,10 +244,10 @@ private async Task<ImageBuilder> ReadSingleImageAsync(string repositoryName, Man
236
244
}
237
245
238
246
239
- private static IReadOnlyDictionary < string , PlatformSpecificManifest > GetManifestsByRid ( ManifestListV2 manifestList )
247
+ private static IReadOnlyDictionary < string , PlatformSpecificManifest > GetManifestsByRid ( PlatformSpecificManifest [ ] manifestList )
240
248
{
241
249
var ridDict = new Dictionary < string , PlatformSpecificManifest > ( ) ;
242
- foreach ( var manifest in manifestList . manifests )
250
+ foreach ( var manifest in manifestList )
243
251
{
244
252
if ( CreateRidForPlatform ( manifest . platform ) is { } rid )
245
253
{
@@ -291,14 +299,51 @@ private async Task<ImageBuilder> PickBestImageFromManifestListAsync(
291
299
CancellationToken cancellationToken )
292
300
{
293
301
cancellationToken . ThrowIfCancellationRequested ( ) ;
294
- var ridManifestDict = GetManifestsByRid ( manifestList ) ;
295
- if ( manifestPicker . PickBestManifestForRid ( ridManifestDict , runtimeIdentifier ) is PlatformSpecificManifest matchingManifest )
302
+ var ridManifestDict = GetManifestsByRid ( manifestList . manifests ) ;
303
+ return await PickBestImageFromManifestsAsync (
304
+ repositoryName ,
305
+ reference ,
306
+ ridManifestDict ,
307
+ runtimeIdentifier ,
308
+ manifestPicker ,
309
+ cancellationToken ) . ConfigureAwait ( false ) ;
310
+ }
311
+
312
+ private async Task < ImageBuilder > PickBestImageFromImageIndexAsync (
313
+ string repositoryName ,
314
+ string reference ,
315
+ ImageIndexV1 index ,
316
+ string runtimeIdentifier ,
317
+ IManifestPicker manifestPicker ,
318
+ CancellationToken cancellationToken )
319
+ {
320
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
321
+ var ridManifestDict = GetManifestsByRid ( index . manifests ) ;
322
+ return await PickBestImageFromManifestsAsync (
323
+ repositoryName ,
324
+ reference ,
325
+ ridManifestDict ,
326
+ runtimeIdentifier ,
327
+ manifestPicker ,
328
+ cancellationToken ) . ConfigureAwait ( false ) ;
329
+ }
330
+
331
+ private async Task < ImageBuilder > PickBestImageFromManifestsAsync (
332
+ string repositoryName ,
333
+ string reference ,
334
+ IReadOnlyDictionary < string , PlatformSpecificManifest > knownManifests ,
335
+ string runtimeIdentifier ,
336
+ IManifestPicker manifestPicker ,
337
+ CancellationToken cancellationToken )
338
+ {
339
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
340
+ if ( manifestPicker . PickBestManifestForRid ( knownManifests , runtimeIdentifier ) is PlatformSpecificManifest matchingManifest )
296
341
{
297
342
using HttpResponseMessage manifestResponse = await _registryAPI . Manifest . GetAsync ( repositoryName , matchingManifest . digest , cancellationToken ) . ConfigureAwait ( false ) ;
298
343
299
344
cancellationToken . ThrowIfCancellationRequested ( ) ;
300
345
var manifest = await manifestResponse . Content . ReadFromJsonAsync < ManifestV2 > ( cancellationToken : cancellationToken ) . ConfigureAwait ( false ) ;
301
- if ( manifest is null ) throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , ridManifestDict . Keys ) ;
346
+ if ( manifest is null ) throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , knownManifests . Keys ) ;
302
347
manifest . KnownDigest = matchingManifest . digest ;
303
348
return await ReadSingleImageAsync (
304
349
repositoryName ,
@@ -307,7 +352,7 @@ private async Task<ImageBuilder> PickBestImageFromManifestListAsync(
307
352
}
308
353
else
309
354
{
310
- throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , ridManifestDict . Keys ) ;
355
+ throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , knownManifests . Keys ) ;
311
356
}
312
357
}
313
358
0 commit comments