@@ -138,7 +138,8 @@ func CommonRoutes() *web.Router {
138138 }, reqPackageAccess (perm .AccessModeRead ))
139139 r .Group ("/arch" , func () {
140140 r .Methods ("HEAD,GET" , "/repository.key" , arch .GetRepositoryKey )
141- r .PathGroup ("*" , func (g * web.RouterPathGroup ) {
141+ r .Methods ("PUT" , "" /* no repository */ , reqPackageAccess (perm .AccessModeWrite ), arch .UploadPackageFile )
142+ r .PathGroup ("/*" , func (g * web.RouterPathGroup ) {
142143 g .MatchPath ("PUT" , "/<repository:*>" , reqPackageAccess (perm .AccessModeWrite ), arch .UploadPackageFile )
143144 g .MatchPath ("HEAD,GET" , "/<repository:*>/<architecture>/<filename>" , arch .GetPackageOrRepositoryFile )
144145 g .MatchPath ("DELETE" , "/<repository:*>/<name>/<version>/<architecture>" , reqPackageAccess (perm .AccessModeWrite ), arch .DeletePackageVersion )
@@ -698,150 +699,28 @@ func ContainerRoutes() *web.Router {
698699 })
699700 r .Get ("/_catalog" , container .ReqContainerAccess , container .GetRepositoryList )
700701 r .Group ("/{username}" , func () {
701- r .Group ("/{image}" , func () {
702- r .Group ("/blobs/uploads" , func () {
703- r .Post ("" , container .InitiateUploadBlob )
704- r .Group ("/{uuid}" , func () {
705- r .Get ("" , container .GetUploadBlob )
706- r .Patch ("" , container .UploadBlob )
707- r .Put ("" , container .EndUploadBlob )
708- r .Delete ("" , container .CancelUploadBlob )
709- })
710- }, reqPackageAccess (perm .AccessModeWrite ))
711- r .Group ("/blobs/{digest}" , func () {
712- r .Head ("" , container .HeadBlob )
713- r .Get ("" , container .GetBlob )
714- r .Delete ("" , reqPackageAccess (perm .AccessModeWrite ), container .DeleteBlob )
715- })
716- r .Group ("/manifests/{reference}" , func () {
717- r .Put ("" , reqPackageAccess (perm .AccessModeWrite ), container .UploadManifest )
718- r .Head ("" , container .HeadManifest )
719- r .Get ("" , container .GetManifest )
720- r .Delete ("" , reqPackageAccess (perm .AccessModeWrite ), container .DeleteManifest )
721- })
722- r .Get ("/tags/list" , container .GetTagList )
723- }, container .VerifyImageName )
724-
725- var (
726- blobsUploadsPattern = regexp .MustCompile (`\A(.+)/blobs/uploads/([a-zA-Z0-9-_.=]+)\z` )
727- blobsPattern = regexp .MustCompile (`\A(.+)/blobs/([^/]+)\z` )
728- manifestsPattern = regexp .MustCompile (`\A(.+)/manifests/([^/]+)\z` )
729- )
730-
731- // Manual mapping of routes because {image} can contain slashes which chi does not support
732- r .Methods ("HEAD,GET,POST,PUT,PATCH,DELETE" , "/*" , func (ctx * context.Context ) {
733- path := ctx .PathParam ("*" )
734- isHead := ctx .Req .Method == "HEAD"
735- isGet := ctx .Req .Method == "GET"
736- isPost := ctx .Req .Method == "POST"
737- isPut := ctx .Req .Method == "PUT"
738- isPatch := ctx .Req .Method == "PATCH"
739- isDelete := ctx .Req .Method == "DELETE"
740-
741- if isPost && strings .HasSuffix (path , "/blobs/uploads" ) {
742- reqPackageAccess (perm .AccessModeWrite )(ctx )
743- if ctx .Written () {
744- return
745- }
746-
747- ctx .SetPathParam ("image" , path [:len (path )- 14 ])
748- container .VerifyImageName (ctx )
749- if ctx .Written () {
750- return
751- }
752-
753- container .InitiateUploadBlob (ctx )
754- return
755- }
756- if isGet && strings .HasSuffix (path , "/tags/list" ) {
757- ctx .SetPathParam ("image" , path [:len (path )- 10 ])
758- container .VerifyImageName (ctx )
759- if ctx .Written () {
760- return
761- }
762-
763- container .GetTagList (ctx )
764- return
765- }
766-
767- m := blobsUploadsPattern .FindStringSubmatch (path )
768- if len (m ) == 3 && (isGet || isPut || isPatch || isDelete ) {
769- reqPackageAccess (perm .AccessModeWrite )(ctx )
770- if ctx .Written () {
771- return
772- }
773-
774- ctx .SetPathParam ("image" , m [1 ])
775- container .VerifyImageName (ctx )
776- if ctx .Written () {
777- return
778- }
779-
780- ctx .SetPathParam ("uuid" , m [2 ])
781-
782- if isGet {
702+ r .PathGroup ("/*" , func (g * web.RouterPathGroup ) {
703+ g .MatchPath ("POST" , "/<image:*>/blobs/uploads" , reqPackageAccess (perm .AccessModeWrite ), container .VerifyImageName , container .InitiateUploadBlob )
704+ g .MatchPath ("GET" , "/<image:*>/tags/list" , container .VerifyImageName , container .GetTagList )
705+ g .MatchPath ("GET,PATCH,PUT,DELETE" , `/<image:*>/blobs/uploads/<uuid:[-.=\w]+>` , reqPackageAccess (perm .AccessModeWrite ), container .VerifyImageName , func (ctx * context.Context ) {
706+ if ctx .Req .Method == http .MethodGet {
783707 container .GetUploadBlob (ctx )
784- } else if isPatch {
708+ } else if ctx . Req . Method == http . MethodPatch {
785709 container .UploadBlob (ctx )
786- } else if isPut {
710+ } else if ctx . Req . Method == http . MethodPut {
787711 container .EndUploadBlob (ctx )
788- } else {
712+ } else /* DELETE */ {
789713 container .CancelUploadBlob (ctx )
790714 }
791- return
792- }
793- m = blobsPattern .FindStringSubmatch (path )
794- if len (m ) == 3 && (isHead || isGet || isDelete ) {
795- ctx .SetPathParam ("image" , m [1 ])
796- container .VerifyImageName (ctx )
797- if ctx .Written () {
798- return
799- }
800-
801- ctx .SetPathParam ("digest" , m [2 ])
802-
803- if isHead {
804- container .HeadBlob (ctx )
805- } else if isGet {
806- container .GetBlob (ctx )
807- } else {
808- reqPackageAccess (perm .AccessModeWrite )(ctx )
809- if ctx .Written () {
810- return
811- }
812- container .DeleteBlob (ctx )
813- }
814- return
815- }
816- m = manifestsPattern .FindStringSubmatch (path )
817- if len (m ) == 3 && (isHead || isGet || isPut || isDelete ) {
818- ctx .SetPathParam ("image" , m [1 ])
819- container .VerifyImageName (ctx )
820- if ctx .Written () {
821- return
822- }
823-
824- ctx .SetPathParam ("reference" , m [2 ])
825-
826- if isHead {
827- container .HeadManifest (ctx )
828- } else if isGet {
829- container .GetManifest (ctx )
830- } else {
831- reqPackageAccess (perm .AccessModeWrite )(ctx )
832- if ctx .Written () {
833- return
834- }
835- if isPut {
836- container .UploadManifest (ctx )
837- } else {
838- container .DeleteManifest (ctx )
839- }
840- }
841- return
842- }
843-
844- ctx .Status (http .StatusNotFound )
715+ })
716+ g .MatchPath ("HEAD" , `/<image:*>/blobs/<digest>` , container .VerifyImageName , container .HeadBlob )
717+ g .MatchPath ("GET" , `/<image:*>/blobs/<digest>` , container .VerifyImageName , container .GetBlob )
718+ g .MatchPath ("DELETE" , `/<image:*>/blobs/<digest>` , container .VerifyImageName , reqPackageAccess (perm .AccessModeWrite ), container .DeleteBlob )
719+
720+ g .MatchPath ("HEAD" , `/<image:*>/manifests/<reference>` , container .VerifyImageName , container .HeadManifest )
721+ g .MatchPath ("GET" , `/<image:*>/manifests/<reference>` , container .VerifyImageName , container .GetManifest )
722+ g .MatchPath ("PUT" , `/<image:*>/manifests/<reference>` , container .VerifyImageName , reqPackageAccess (perm .AccessModeWrite ), container .UploadManifest )
723+ g .MatchPath ("DELETE" , `/<image:*>/manifests/<reference>` , container .VerifyImageName , reqPackageAccess (perm .AccessModeWrite ), container .DeleteManifest )
845724 })
846725 }, container .ReqContainerAccess , context .UserAssignmentWeb (), context .PackageAssignment (), reqPackageAccess (perm .AccessModeRead ))
847726
0 commit comments