@@ -138,7 +138,8 @@ func CommonRoutes() *web.Router {
138
138
}, reqPackageAccess (perm .AccessModeRead ))
139
139
r .Group ("/arch" , func () {
140
140
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 ) {
142
143
g .MatchPath ("PUT" , "/<repository:*>" , reqPackageAccess (perm .AccessModeWrite ), arch .UploadPackageFile )
143
144
g .MatchPath ("HEAD,GET" , "/<repository:*>/<architecture>/<filename>" , arch .GetPackageOrRepositoryFile )
144
145
g .MatchPath ("DELETE" , "/<repository:*>/<name>/<version>/<architecture>" , reqPackageAccess (perm .AccessModeWrite ), arch .DeletePackageVersion )
@@ -698,150 +699,28 @@ func ContainerRoutes() *web.Router {
698
699
})
699
700
r .Get ("/_catalog" , container .ReqContainerAccess , container .GetRepositoryList )
700
701
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 {
783
707
container .GetUploadBlob (ctx )
784
- } else if isPatch {
708
+ } else if ctx . Req . Method == http . MethodPatch {
785
709
container .UploadBlob (ctx )
786
- } else if isPut {
710
+ } else if ctx . Req . Method == http . MethodPut {
787
711
container .EndUploadBlob (ctx )
788
- } else {
712
+ } else /* DELETE */ {
789
713
container .CancelUploadBlob (ctx )
790
714
}
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 )
845
724
})
846
725
}, container .ReqContainerAccess , context .UserAssignmentWeb (), context .PackageAssignment (), reqPackageAccess (perm .AccessModeRead ))
847
726
0 commit comments