@@ -182,33 +182,8 @@ func isTar(reader io.Reader) (io.Reader, bool) {
182182 return io .MultiReader (& header , reader ), err == nil || err == io .EOF
183183}
184184
185- func processLocalImage (imageReader io.Reader , onLayer LayerProcessor ) (map [int ]string , map [int ]string , error ) {
186- imageFileReader := tar .NewReader (imageReader )
187- files := make (map [string ][]byte )
188-
185+ func processLocalOCIImage (files map [string ][]byte , onLayer LayerProcessor ) (map [int ]string , map [int ]string , error ) {
189186 layerIDs := make (map [int ]string )
190- layerDigestCandidates := make (map [string ]map [int ]string )
191- var configPath string
192-
193- for {
194- hdr , err := imageFileReader .Next ()
195- if errors .Is (err , io .EOF ) {
196- break
197- }
198- if err != nil {
199- return nil , nil , err
200- }
201-
202- if hdr .Typeflag == tar .TypeReg {
203- data , err := io .ReadAll (imageFileReader )
204- if err != nil {
205- return nil , nil , err
206- }
207- files [hdr .Name ] = data
208- }
209- }
210-
211- // OCI parsing first
212187 if indexData , ok := files ["index.json" ]; ok {
213188 log .Info ("OCI image format detected (index.json found)." )
214189 var index struct {
@@ -293,8 +268,14 @@ func processLocalImage(imageReader io.Reader, onLayer LayerProcessor) (map[int]s
293268 }
294269 return layerDigests , layerIDs , nil
295270 }
271+ return nil , nil , errors .New ("not able to parse in OCI format" )
272+ }
273+
274+ func processLocalDockerImage (files map [string ][]byte , onLayer LayerProcessor ) (map [int ]string , map [int ]string , error ) {
275+ layerIDs := make (map [int ]string )
276+ layerDigestCandidates := make (map [string ]map [int ]string )
277+ var configPath string
296278
297- // Docker legacy fallback
298279 if manifestData , ok := files ["manifest.json" ]; ok {
299280 log .Info ("Docker legacy image format detected (manifest.json found)." )
300281 type Manifest []struct {
@@ -359,6 +340,51 @@ func processLocalImage(imageReader io.Reader, onLayer LayerProcessor) (map[int]s
359340
360341 return layerDigests , layerIDs , nil
361342 }
343+ return nil , nil , errors .New ("not able to parse in Docker format" )
344+ }
345+
346+ func processLocalImage (imageReader io.Reader , onLayer LayerProcessor ) (map [int ]string , map [int ]string , error ) {
347+ imageFileReader := tar .NewReader (imageReader )
348+ files := make (map [string ][]byte )
349+
350+ for {
351+ hdr , err := imageFileReader .Next ()
352+ if errors .Is (err , io .EOF ) {
353+ break
354+ }
355+ if err != nil {
356+ return nil , nil , err
357+ }
358+
359+ if hdr .Typeflag == tar .TypeReg {
360+ data , err := io .ReadAll (imageFileReader )
361+ if err != nil {
362+ return nil , nil , err
363+ }
364+ files [hdr .Name ] = data
365+ }
366+ }
367+
368+ // OCI parsing first
369+ layerDigests , layerIDs , err := processLocalOCIImage (files , onLayer )
370+ // continue to parse if an error is reached
371+ if err != nil {
372+ log .Warnf ("Errored while trying to parse OCI format: %v" , err )
373+ }
374+ if len (layerDigests ) > 0 && len (layerIDs ) > 0 {
375+ return layerDigests , layerIDs , nil
376+ }
377+
378+ // Docker legacy fallback
379+ layerDigests , layerIDs , err = processLocalDockerImage (files , onLayer )
380+ // continue to parse if an error is reached
381+ if err != nil {
382+ log .Warnf ("Errored while trying to parse Docker format: %v" , err )
383+ }
384+ if len (layerDigests ) > 0 && len (layerIDs ) > 0 {
385+ return layerDigests , layerIDs , nil
386+ }
387+
362388
363389 log .Warn ("No recognizable OCI or Docker manifest found in provided tarball." )
364390 return nil , nil , errors .New ("no recognizable image format found" )
0 commit comments