diff --git a/weed/s3api/s3api_tables.go b/weed/s3api/s3api_tables.go index 0358a532a..0c420be27 100644 --- a/weed/s3api/s3api_tables.go +++ b/weed/s3api/s3api_tables.go @@ -12,6 +12,31 @@ import ( "github.com/seaweedfs/seaweedfs/weed/s3api/s3tables" ) +// s3TablesActionsMap contains all valid S3 Tables operations for O(1) lookup +var s3TablesActionsMap = map[string]struct{}{ + "CreateTableBucket": {}, + "GetTableBucket": {}, + "ListTableBuckets": {}, + "DeleteTableBucket": {}, + "PutTableBucketPolicy": {}, + "GetTableBucketPolicy": {}, + "DeleteTableBucketPolicy": {}, + "CreateNamespace": {}, + "GetNamespace": {}, + "ListNamespaces": {}, + "DeleteNamespace": {}, + "CreateTable": {}, + "GetTable": {}, + "ListTables": {}, + "DeleteTable": {}, + "PutTablePolicy": {}, + "GetTablePolicy": {}, + "DeleteTablePolicy": {}, + "TagResource": {}, + "ListTagsForResource": {}, + "UntagResource": {}, +} + // S3TablesApiServer wraps the S3 Tables handler with S3ApiServer's filer access type S3TablesApiServer struct { s3a *S3ApiServer @@ -87,36 +112,8 @@ func (s3a *S3ApiServer) registerS3TablesRoutes(router *mux.Router) { glog.V(1).Infof("S3 Tables API enabled") } -// isS3TablesAction checks if the action is an S3 Tables operation +// isS3TablesAction checks if the action is an S3 Tables operation using O(1) map lookup func isS3TablesAction(action string) bool { - s3TablesActions := []string{ - "CreateTableBucket", - "GetTableBucket", - "ListTableBuckets", - "DeleteTableBucket", - "PutTableBucketPolicy", - "GetTableBucketPolicy", - "DeleteTableBucketPolicy", - "CreateNamespace", - "GetNamespace", - "ListNamespaces", - "DeleteNamespace", - "CreateTable", - "GetTable", - "ListTables", - "DeleteTable", - "PutTablePolicy", - "GetTablePolicy", - "DeleteTablePolicy", - "TagResource", - "ListTagsForResource", - "UntagResource", - } - - for _, a := range s3TablesActions { - if a == action { - return true - } - } - return false + _, ok := s3TablesActionsMap[action] + return ok }