@ -77,10 +77,13 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) {
for _ , bucket := range routers {
// HeadObject
bucket . Methods ( "HEAD" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . HeadObjectHandler , ACTION_READ ) , "GET" ) )
// HeadBucket
bucket . Methods ( "HEAD" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . HeadBucketHandler , ACTION_READ ) , "GET" ) )
// each case should follow the next rule:
// - requesting object with query must precede any other methods
// - requesting object must precede any methods with buckets
// - requesting bucket with query must precede raw methods with buckets
// - requesting bucket must be processed in the end
// objects with query
// CopyObjectPart
bucket . Methods ( "PUT" ) . Path ( "/{object:.+}" ) . HeadersRegexp ( "X-Amz-Copy-Source" , ` .*?(\/|%2F).*? ` ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . CopyObjectPartHandler , ACTION_WRITE ) , "PUT" ) ) . Queries ( "partNumber" , "{partNumber:[0-9]+}" , "uploadId" , "{uploadId:.*}" )
@ -113,69 +116,88 @@ func (s3a *S3ApiServer) registerRouter(router *mux.Router) {
// PutObjectLockConfiguration
bucket . Methods ( "PUT" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PutObjectLockConfigurationHandler , ACTION_WRITE ) , "PUT" ) ) . Queries ( "object-lock" , "" )
// GetObjectACL
bucket . Methods ( "GET" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetObjectAclHandler , ACTION_READ ) , "GET" ) ) . Queries ( "acl" , "" )
// objects with query
// raw objects
// HeadObject
bucket . Methods ( "HEAD" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . HeadObjectHandler , ACTION_READ ) , "GET" ) )
// GetObject, but directory listing is not supported
bucket . Methods ( "GET" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetObjectHandler , ACTION_READ ) , "GET" ) )
// CopyObject
bucket . Methods ( "PUT" ) . Path ( "/{object:.+}" ) . HeadersRegexp ( "X-Amz-Copy-Source" , ".*?(\\/|%2F).*?" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . CopyObjectHandler , ACTION_WRITE ) , "COPY" ) )
// PutObject
bucket . Methods ( "PUT" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PutObjectHandler , ACTION_WRITE ) , "PUT" ) )
// DeleteObject
bucket . Methods ( "DELETE" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . DeleteObjectHandler , ACTION_WRITE ) , "DELETE" ) )
// ListObjectsV2
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . ListObjectsV2Handler , ACTION_LIST ) , "LIST" ) ) . Queries ( "list-type" , "2" )
// GetObject, but directory listing is not supported
bucket . Methods ( "GET" ) . Path ( "/{object:.+}" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetObjectHandler , ACTION_READ ) , "GET" ) )
// raw objects
// PostPolicy
bucket . Methods ( "POST" ) . HeadersRegexp ( "Content-Type" , "multipart/form-data*" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PostPolicyBucketHandler , ACTION_WRITE ) , "POST" ) )
// buckets with query
// DeleteMultipleObjects
bucket . Methods ( "POST" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . DeleteMultipleObjectsHandler , ACTION_WRITE ) , "DELETE" ) ) . Queries ( "delete" , "" )
// GetBucketACL
bucket . Methods ( "GET" ) . HandlerFunc ( s3a . iam . Auth ( s3a . GetBucketAclHandler , ACTION_READ ) ) . Queries ( "acl" , "" )
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetBucketAclHandler , ACTION_READ ) , "GET" ) ) . Queries ( "acl" , "" )
// PutBucketACL
bucket . Methods ( "PUT" ) . HandlerFunc ( s3a . iam . Auth ( s3a . PutBucketAclHandler , ACTION_WRITE ) ) . Queries ( "acl" , "" )
// GetBucketPolicy
bucket . Methods ( "GET" ) . HandlerFunc ( s3a . iam . Auth ( s3a . GetBucketPolicyHandler , ACTION_READ ) ) . Queries ( "policy" , "" )
bucket . Methods ( "PUT" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PutBucketAclHandler , ACTION_WRITE ) , "PUT" ) ) . Queries ( "acl" , "" )
// GetBucketPolicy
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetBucketPolicyHandler , ACTION_READ ) , "GET" ) ) . Queries ( "policy" , "" )
// PutBucketPolicy
bucket . Methods ( "PUT" ) . HandlerFunc ( s3a . iam . Auth ( s3a . PutBucketPolicyHandler , ACTION_WRITE ) ) . Queries ( "policy" , "" )
bucket . Methods ( "PUT" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PutBucketPolicyHandler , ACTION_WRITE ) , "PUT" ) ) . Queries ( "policy" , "" )
// DeleteBucketPolicy
bucket . Methods ( "DELETE" ) . HandlerFunc ( s3a . iam . Auth ( s3a . DeleteBucketPolicyHandler , ACTION_WRITE ) ) . Queries ( "policy" , "" )
bucket . Methods ( "DELETE" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . DeleteBucketPolicyHandler , ACTION_WRITE ) , "DELETE" ) ) . Queries ( "policy" , "" )
// GetBucketCors
bucket . Methods ( "GET" ) . HandlerFunc ( s3a . iam . Auth ( s3a . GetBucketCorsHandler , ACTION_READ ) ) . Queries ( "cors" , "" )
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetBucketCorsHandler , ACTION_READ ) , "GET" ) ) . Queries ( "cors" , "" )
// PutBucketCors
bucket . Methods ( "PUT" ) . HandlerFunc ( s3a . iam . Auth ( s3a . PutBucketCorsHandler , ACTION_WRITE ) ) . Queries ( "cors" , "" )
bucket . Methods ( "PUT" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PutBucketCorsHandler , ACTION_WRITE ) , "PUT" ) ) . Queries ( "cors" , "" )
// DeleteBucketCors
bucket . Methods ( "DELETE" ) . HandlerFunc ( s3a . iam . Auth ( s3a . DeleteBucketCorsHandler , ACTION_WRITE ) ) . Queries ( "cors" , "" )
bucket . Methods ( "DELETE" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . DeleteBucketCorsHandler , ACTION_WRITE ) , "DELETE" ) ) . Queries ( "cors" , "" )
// GetBucketLifecycleConfiguration
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetBucketLifecycleConfigurationHandler , ACTION_READ ) , "GET" ) ) . Queries ( "lifecycle" , "" )
// PutBucketLifecycleConfiguration
bucket . Methods ( "PUT" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PutBucketLifecycleConfigurationHandler , ACTION_WRITE ) , "PUT" ) ) . Queries ( "lifecycle" , "" )
// DeleteBucketLifecycleConfiguration
bucket . Methods ( "DELETE" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . DeleteBucketLifecycleHandler , ACTION_WRITE ) , "DELETE" ) ) . Queries ( "lifecycle" , "" )
// GetBucketLocation
bucket . Methods ( "GET" ) . HandlerFunc ( s3a . iam . Auth ( s3a . GetBucketLocationHandler , ACTION_READ ) ) . Queries ( "location" , "" )
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetBucketLocationHandler , ACTION_READ ) , "GET" ) ) . Queries ( "location" , "" )
// GetBucketRequestPayment
bucket . Methods ( "GET" ) . HandlerFunc ( s3a . iam . Auth ( s3a . GetBucketRequestPaymentHandler , ACTION_READ ) ) . Queries ( "requestPayment" , "" )
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . GetBucketRequestPaymentHandler , ACTION_READ ) , "GET" ) ) . Queries ( "requestPayment" , "" )
// GetObjectACL
bucket . Methods ( "GET" ) . Path ( "/{object:.+}" ) . HandlerFunc ( s3a . iam . Auth ( s3a . GetObjectAclHandler , ACTION_READ ) ) . Queries ( "ac l" , "" )
// ListObjectsV2
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . ListObjectsV2Handler , ACTION_LIST ) , "LIST" ) ) . Queries ( "list-type " , "2 " )
// GetBucketLifecycleConfiguration
bucket . Methods ( "GET" ) . HandlerFunc ( s3a . iam . Auth ( s3a . GetBucketLifecycleConfigurationHandler , ACTION_READ ) ) . Queries ( "lifecycle" , "" )
// buckets with query
// PutBucketLifecycleConfiguration
bucket . Methods ( "PUT" ) . HandlerFunc ( s3a . iam . Auth ( s3a . PutBucketLifecycleConfigurationHandler , ACTION_WRITE ) ) . Queries ( "lifecycle" , "" )
// raw buckets
// DeleteBucketLifecycleConfiguration
bucket . Methods ( "DELETE" ) . HandlerFunc ( s3a . iam . Auth ( s3a . DeleteBucketLifecycleHandler , ACTION_WRITE ) ) . Queries ( "lifecycle" , "" )
// ListObjectsV1 (Legacy)
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . ListObjectsV1Handler , ACTION_LIST ) , "LIST" ) )
// PostPolicy
bucket . Methods ( "POST" ) . HeadersRegexp ( "Content-Type" , "multipart/form-data*" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . PostPolicyBucketHandler , ACTION_WRITE ) , "POST" ) )
// HeadBucket
bucket . Methods ( "HEAD" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . HeadBucketHandler , ACTION_READ ) , "GET" ) )
// PutBucket
bucket . Methods ( "PUT" ) . HandlerFunc ( track ( s3a . PutBucketHandler , "PUT" ) )
// DeleteBucket
bucket . Methods ( "DELETE" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . DeleteBucketHandler , ACTION_WRITE ) , "DELETE" ) )
// ListObjectsV1 (Legacy)
bucket . Methods ( "GET" ) . HandlerFunc ( track ( s3a . iam . Auth ( s3a . ListObjectsV1Handler , ACTION_LIST ) , "LIST" ) )
// raw buckets
}
// ListBuckets