@@ -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
{
@@ -293,14 +301,51 @@ private async Task<ImageBuilder> PickBestImageFromManifestListAsync(
293
301
CancellationToken cancellationToken )
294
302
{
295
303
cancellationToken . ThrowIfCancellationRequested ( ) ;
296
- var ridManifestDict = GetManifestsByRid ( manifestList ) ;
297
- if ( manifestPicker . PickBestManifestForRid ( ridManifestDict , runtimeIdentifier ) is PlatformSpecificManifest matchingManifest )
304
+ var ridManifestDict = GetManifestsByRid ( manifestList . manifests ) ;
305
+ return await PickBestImageFromManifestsAsync (
306
+ repositoryName ,
307
+ reference ,
308
+ ridManifestDict ,
309
+ runtimeIdentifier ,
310
+ manifestPicker ,
311
+ cancellationToken ) . ConfigureAwait ( false ) ;
312
+ }
313
+
314
+ private async Task < ImageBuilder > PickBestImageFromImageIndexAsync (
315
+ string repositoryName ,
316
+ string reference ,
317
+ ImageIndexV1 index ,
318
+ string runtimeIdentifier ,
319
+ IManifestPicker manifestPicker ,
320
+ CancellationToken cancellationToken )
321
+ {
322
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
323
+ var ridManifestDict = GetManifestsByRid ( index . manifests ) ;
324
+ return await PickBestImageFromManifestsAsync (
325
+ repositoryName ,
326
+ reference ,
327
+ ridManifestDict ,
328
+ runtimeIdentifier ,
329
+ manifestPicker ,
330
+ cancellationToken ) . ConfigureAwait ( false ) ;
331
+ }
332
+
333
+ private async Task < ImageBuilder > PickBestImageFromManifestsAsync (
334
+ string repositoryName ,
335
+ string reference ,
336
+ IReadOnlyDictionary < string , PlatformSpecificManifest > knownManifests ,
337
+ string runtimeIdentifier ,
338
+ IManifestPicker manifestPicker ,
339
+ CancellationToken cancellationToken )
340
+ {
341
+ cancellationToken . ThrowIfCancellationRequested ( ) ;
342
+ if ( manifestPicker . PickBestManifestForRid ( knownManifests , runtimeIdentifier ) is PlatformSpecificManifest matchingManifest )
298
343
{
299
344
using HttpResponseMessage manifestResponse = await _registryAPI . Manifest . GetAsync ( repositoryName , matchingManifest . digest , cancellationToken ) . ConfigureAwait ( false ) ;
300
345
301
346
cancellationToken . ThrowIfCancellationRequested ( ) ;
302
347
var manifest = await manifestResponse . Content . ReadFromJsonAsync < ManifestV2 > ( cancellationToken : cancellationToken ) . ConfigureAwait ( false ) ;
303
- if ( manifest is null ) throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , ridManifestDict . Keys ) ;
348
+ if ( manifest is null ) throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , knownManifests . Keys ) ;
304
349
manifest . KnownDigest = matchingManifest . digest ;
305
350
return await ReadSingleImageAsync (
306
351
repositoryName ,
@@ -309,7 +354,7 @@ private async Task<ImageBuilder> PickBestImageFromManifestListAsync(
309
354
}
310
355
else
311
356
{
312
- throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , ridManifestDict . Keys ) ;
357
+ throw new BaseImageNotFoundException ( runtimeIdentifier , repositoryName , reference , knownManifests . Keys ) ;
313
358
}
314
359
}
315
360
0 commit comments