@@ -482,22 +482,7 @@ func GetBlob(ctx *context.Context) {
482482 return
483483 }
484484
485- s , _ , err := packages_service .GetPackageFileStream (ctx , blob .File )
486- if err != nil {
487- apiError (ctx , http .StatusInternalServerError , err )
488- return
489- }
490- defer s .Close ()
491-
492- setResponseHeaders (ctx .Resp , & containerHeaders {
493- ContentDigest : blob .Properties .GetByName (container_module .PropertyDigest ),
494- ContentType : blob .Properties .GetByName (container_module .PropertyMediaType ),
495- ContentLength : blob .Blob .Size ,
496- Status : http .StatusOK ,
497- })
498- if _ , err := io .Copy (ctx .Resp , s ); err != nil {
499- log .Error ("Error whilst copying content to response: %v" , err )
500- }
485+ serveBlob (ctx , blob )
501486}
502487
503488// https://github.com/opencontainers/distribution-spec/blob/main/spec.md#deleting-blobs
@@ -636,22 +621,7 @@ func GetManifest(ctx *context.Context) {
636621 return
637622 }
638623
639- s , _ , err := packages_service .GetPackageFileStream (ctx , manifest .File )
640- if err != nil {
641- apiError (ctx , http .StatusInternalServerError , err )
642- return
643- }
644- defer s .Close ()
645-
646- setResponseHeaders (ctx .Resp , & containerHeaders {
647- ContentDigest : manifest .Properties .GetByName (container_module .PropertyDigest ),
648- ContentType : manifest .Properties .GetByName (container_module .PropertyMediaType ),
649- ContentLength : manifest .Blob .Size ,
650- Status : http .StatusOK ,
651- })
652- if _ , err := io .Copy (ctx .Resp , s ); err != nil {
653- log .Error ("Error whilst copying content to response: %v" , err )
654- }
624+ serveBlob (ctx , manifest )
655625}
656626
657627// https://github.com/opencontainers/distribution-spec/blob/main/spec.md#deleting-tags
@@ -686,6 +656,36 @@ func DeleteManifest(ctx *context.Context) {
686656 })
687657}
688658
659+ func serveBlob (ctx * context.Context , pfd * packages_model.PackageFileDescriptor ) {
660+ s , u , _ , err := packages_service .GetPackageBlobStream (ctx , pfd .File , pfd .Blob )
661+ if err != nil {
662+ apiError (ctx , http .StatusInternalServerError , err )
663+ return
664+ }
665+
666+ headers := & containerHeaders {
667+ ContentDigest : pfd .Properties .GetByName (container_module .PropertyDigest ),
668+ ContentType : pfd .Properties .GetByName (container_module .PropertyMediaType ),
669+ ContentLength : pfd .Blob .Size ,
670+ Status : http .StatusOK ,
671+ }
672+
673+ if u != nil {
674+ headers .Status = http .StatusTemporaryRedirect
675+ headers .Location = u .String ()
676+
677+ setResponseHeaders (ctx .Resp , headers )
678+ return
679+ }
680+
681+ defer s .Close ()
682+
683+ setResponseHeaders (ctx .Resp , headers )
684+ if _ , err := io .Copy (ctx .Resp , s ); err != nil {
685+ log .Error ("Error whilst copying content to response: %v" , err )
686+ }
687+ }
688+
689689// https://github.com/opencontainers/distribution-spec/blob/main/spec.md#content-discovery
690690func GetTagList (ctx * context.Context ) {
691691 image := ctx .Params ("image" )
0 commit comments